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

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

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

sudo: no tty present and no askpass program specified

第一次执行sudo命令时。

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

还有其他解决办法吗?


当前回答

这个问题的解决办法是

如果您在Jenkins实例之外的任何地方遇到了这个问题,请从第二步开始。第一步是针对遇到Jenkins实例问题的用户。

转到谷歌云控制台的Jenkins实例。 输入命令 sudo苏

Visudo -f /etc/sudoers

在末尾添加以下一行

jenkins所有= NOPASSWD:所有

在这里签出以了解此问题的根本原因

其他回答

在所有的选择之后,我发现:

sudo -S <cmd>

-S (stdin)选项使sudo从标准输入而不是终端设备读取密码。

以上命令仍需输入密码。要手动删除输入密码,在jenkins这样的情况下,这个命令有效:

echo <password> | sudo -S <cmd> 

作为参考,以防其他人遇到同样的问题,我在一个小时内被这个错误卡住了,因为我使用的是NOPASSWD参数,所以不应该发生这个错误。

我不知道的是,当没有tty并且用户尝试启动的命令不在/etc/sudoers文件中允许的命令的一部分时,sudo可能会引发完全相同的错误消息。

这里有一个简化的例子,我的文件内容与我的问题:

bguser ALL = NOPASSWD: \
    command_a arg_a, \
    command_b arg_b \
    command_c arg_c

当bguser尝试在没有任何tty的情况下启动“sudo command_b arg_b”(bguser被用于某些守护进程)时,他将遇到错误“no tty present and no askpass program specified”。

Why?

因为在/etc/sudoers文件的末尾缺少一个逗号…

(我甚至怀疑这是否是预期的行为,而不是sudo中的错误,因为这种情况下正确的错误消息应该是“对不起,用户bguser不允许执行等”)

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

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

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

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

运行包含来自jenkins的sudo命令的shell脚本可能无法按预期运行。要解决这个问题,请遵循以下步骤

简单的步骤:

在基于ubuntu的系统中,运行" $ sudo visudo " 这将打开/etc/sudoers文件。 如果jenkins用户已经在该文件中,那么修改如下:

詹金斯

保存文件 重新开始你的jenkins工作 你不应该再看到错误信息:)

Try:

ssh -t remotehost "sudo <cmd>"

这将消除上述错误。