我正在尝试使用makefile编译一些源代码。在makefile中,有一堆命令需要作为sudo运行。

当我从终端编译源代码时,一切都很好,并且在第一次运行sudo命令等待密码时,make会暂停。一旦我输入密码,做简历和完成。

但是我希望能够在NetBeans中编译源代码。所以,我开始了一个项目,并向netbeans展示了在哪里可以找到源代码,但当我编译项目时,它给出了错误:

sudo: no tty present and no askpass program specified

第一次执行sudo命令时。

我在网上查了这个问题,我找到的所有解决方案都指向一件事:禁用这个用户的密码。因为这里讨论的用户是根用户。我不想那样做。

还有其他解决办法吗?


当前回答

登录到您的linux。执行以下命令。要小心,因为编辑sudoer是一个有风险的命题。

$ sudo visudo

vi编辑器打开后,进行以下更改:

注释掉默认值是必需的 #默认值是必须的 转到文件末尾并添加 NOPASSWD:所有

其他回答

当您试图从一些非shell脚本运行终端命令(需要root密码)时,也可能出现此错误,例如从Ruby程序运行sudo ls(反引号)。在这种情况下,您可以使用Expect实用程序(http://en.wikipedia.org/wiki/Expect)或其替代方案。 例如,在Ruby中执行sudo ls而没有得到sudo: no tty present,也没有指定askpass程序,你可以这样运行:

require 'ruby_expect'

exp = RubyExpect::Expect.spawn('sudo ls', :debug => true)
exp.procedure do
    each do
        expect "[sudo] password for _your_username_:" do
            send _your_password_
        end
    end
end

[这使用了Expect TCL扩展的一个替代方案:ruby_expect gem]。

我得到这个错误是因为我限制了我的用户只有一个可执行的“systemctl”,并错误地配置了visudo文件。

以下是我得到的答案:

jenkins ALL=NOPASSWD: systemctl

然而,你需要包括可执行文件的完整路径,即使它默认在你的路径上,例如:

jenkins ALL=NOPASSWD: /bin/systemctl

这允许我的jenkins用户重新启动服务,但不具有完全的根访问权限

当我试图挂载sshfs时,我有同样的错误消息,需要sudo:命令是这样的:

sshfs -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www

通过添加选项-o debug

sshfs -o debug -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www

对于这个问题,我也有同样的意思:

sudo: no tty present and no askpass program specified

所以通过阅读其他人的答案,我开始在/etc/sudoer中创建一个文件D /user在my.server.tld

user ALL=NOPASSWD: /usr/lib/openssh/sftp-server

现在我可以挂载驱动器,而不给我的用户太多额外的权利。

默认情况下,Sudo将从连接的终端读取密码。您的问题是,从netbeans控制台运行时没有附加终端。因此,您必须使用另一种方法来输入密码:即所谓的askpass程序。

askpass程序不是一个特定的程序,而是任何可以要求密码的程序。例如,在我的系统中,x11-ssh-askpass工作正常。

为了做到这一点,你必须指定要使用的程序,可以使用环境变量SUDO_ASKPASS,也可以在sudo.conf文件中指定(详情请参阅man sudo)。

您可以使用选项-A强制sudo使用askpass程序。默认情况下,它只在没有附加终端时使用它。

詹金斯:

echo '<your-password>' | sudo -S command

Eg:-

echo '******' | sudo -S service nginx restart

你可以使用掩码密码插件来隐藏你的密码