如何修复'sudo:no tty present and no askpass program specified'错误?

heb*_*bbo 393 linux sudo tty

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

当我从终端编译源时,一切正常,并且在第一次sudo运行命令等待密码时暂停make .输入密码后,进行简历并完成.

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

sudo: no tty present and no askpass program specified
Run Code Online (Sandbox Code Playgroud)

它第一次命中sudo命令.

我在互联网上查找了这个问题,我发现的所有解决方案都指向一件事:禁用此用户的密码.由于这里的用户是root用户.我不想那样做.

还有其他解决方案吗?

小智 238

授予用户使用该命令而不提示输入密码应该可以解决问题.首先打开一个shell控制台并输入:

sudo visudo
Run Code Online (Sandbox Code Playgroud)

然后编辑该文件以添加到最后:

username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand
Run Code Online (Sandbox Code Playgroud)

例如

john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop
Run Code Online (Sandbox Code Playgroud)

将允许用户johnsudo poweroff,startstop不会被提示输入密码.

在屏幕底部查看您需要在visudo中使用的击键 - 顺便说一句,这不是vi - 并且在没有保存时​​出现任何问题的第一个迹象.健康警告:破坏此文件会产生严重后果,请谨慎编辑!

  • 我不能"sudo visudo"因为我不能首先sudo! (26认同)
  • 确保NOPASSWD mathing行在任何其他可能匹配的sudo行之后(如%wheel)没有NOPASSWD标志. (8认同)
  • visudo应该在您的环境配置使用的任何编辑器中打开,这很可能是(并且应该是^ _ ^)vi. (6认同)
  • 考虑将文件添加到/etc/sudoers.d并保持visudo文件不变. (5认同)
  • 是的,[sudoers man page](http://www.sudo.ws/sudoers.man.html)让我看到了sudo实际应该如何使用. (4认同)

小智 174

尝试:

  1. NOPASSWD对所有命令使用line,我的意思是:

    jenkins ALL=(ALL) NOPASSWD: ALL
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将该行放在sudoers文件中的所有其他行之后.

这对我有用(Ubuntu 14.04).

  • 我首先在其他用户配置之后添加了该行,但它仅在lubuntu 14.04.1上的文件中作为绝对最后一行放置时才起作用. (12认同)
  • 正如@ user77115所提到的,这只有在你把它放在sudoers文件的最后一行时才有效,即使使用Ubuntu 16.04也是如此.作为旁注,为所有命令赋予jenkins sudo权限是一个非常大的安全问题.考虑包装你的詹金斯脚本和只给访问特定的命令,如:`詹金斯ALL =(ALL)NOPASSWD:在/ var/lib中/詹金斯/ wrapper_script` (5认同)

小智 157

尝试:

ssh -t remotehost "sudo <cmd>"
Run Code Online (Sandbox Code Playgroud)

这将消除上述错误.

  • `-t强制伪tty分配.这可用于在远程计算机上执行任意基于屏幕的程序.另请参阅:[sudo-no-tty-present-and-no-askpass-program-specified](http://askubuntu.com/questions/281742/sudo-no-tty-present-and-no-askpass-program-specified)同样`sudo -A`允许设置`sudo` askpass程序,但我只看到GUI.有没有人知道一个askpass允许`ssh remotehost sudo -A askpass`? (6认同)
  • 这对我不起作用(大概是因为我从脚本调用ssh),给我错误`伪终端不会被分配因为stdin不是终端.:( (5认同)
  • 更正,`sudo` 的`-A` 不带参数,而是需要环境`SUDO_ASKPASS` 或`sudo.conf` 所以`ssh remotehost sudo -A 命令` 仍然有效。仍然对基于终端的 askpass 程序感到好奇。 (2认同)

Vin*_*ent 116

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

sudo -S <cmd>
Run Code Online (Sandbox Code Playgroud)

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

资源

上面的命令仍然需要输入密码.要手动删除输入密码,在jenkins等情况下,此命令有效:

echo <password> | sudo -S <cmd> 
Run Code Online (Sandbox Code Playgroud)

  • `sudo -S <command>` - ``恰好是一个返回退出代码0的伪命令(`false`是一个返回1的命令).谢谢,这是一个真正的答案,因为所有其他人都希望"sudo"能够工作! (3认同)

rod*_*igo 41

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

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

为此,您必须使用环境变量SUDO_ASKPASSsudo.conf文件指定要使用的程序(man sudo有关详细信息,请参阅参考资料).

您可以sudo使用该选项强制使用askpass程序-A.默认情况下,只有在没有连接的终端时才会使用它.


sNI*_*sss 23

试试这个:

echo '' | sudo -S my_command
Run Code Online (Sandbox Code Playgroud)

  • 它返回以下错误:`[sudo] alper 的密码:抱歉,请重试。[sudo] alper 的密码:sudo:1 次错误的密码尝试` @sNICkerssss (3认同)

Vas*_*cal 19

对于Ubuntu 16.04用户

您需要阅读一个文件:

cat /etc/sudoers.d/README
Run Code Online (Sandbox Code Playgroud)

将文件0440中的文件放在/etc/sudoers.d/myuser中,内容如下:

myuser  ALL=(ALL) NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)

应该解决这个问题.

不要忘记:

chmod 0440 /etc/sudoers.d/myuser
Run Code Online (Sandbox Code Playgroud)

  • 不要盲目跟随。如此处所述,我在/etc/sudoers.d中创建了一个新文件,最终无法使用sudo ..必须通过恢复模式删除该文件。 (2认同)

Gub*_*ron 16

如果你有任何机会来到这里因为你不能在Windows10附带的Ubuntu内部进行sudo

  1. 从Windows编辑/ etc/hosts文件(带记事本),它将位于:%localappdata\lxss\rootfs\etc,添加127.0.0.1 WINDOWS8,这将摆脱它无法找到主机的第一个错误.

  2. 要摆脱no tty present错误,总是这样做sudo -S <command>

  • 感谢您为与问题描述无关但与问题标题无关的原因来到这里的人们提供答案.+1 (2认同)
  • [请勿在任何情况下使用Windows应用程序,工具,脚本,控制台等创建和/或修改Linux文件](https://blogs.msdn.microsoft.com/commandline/2016/11/17/do - 不是改变-Linux的文件 - 使用 - 窗口的应用程序和工具/) (2认同)

小智 15

登录你的linux.触发命令.要小心,因为编辑sudoer是一个冒险的主张.

$ sudo visudo
Run Code Online (Sandbox Code Playgroud)

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

  1. 评论出来 Defaults requiretty

    # Defaults    requiretty
    
    Run Code Online (Sandbox Code Playgroud)
  2. 转到文件末尾并添加

    jenkins ALL=(ALL) NOPASSWD: ALL
    
    Run Code Online (Sandbox Code Playgroud)


小智 12

在詹金斯:

echo '<your-password>' | sudo -S command
Run Code Online (Sandbox Code Playgroud)

例如: -

echo '******' | sudo -S service nginx restart
Run Code Online (Sandbox Code Playgroud)

您可以使用Mask Password Plugin隐藏密码


Ale*_*lls 10

这对我有用:

echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
Run Code Online (Sandbox Code Playgroud)

你的用户是"myuser"的地方

对于Docker镜像,这只是:

RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
Run Code Online (Sandbox Code Playgroud)


omr*_*umi 9

确保您正在执行的命令是您的命令的sudo一部分PATH.

如果您有一个(或多个,但不是ALL)命令sudoers条目,您将获得sudo: no tty present and no askpass program specified命令不在路径中的时间(并且未指定完整路径).

您可以通过向您添加命令PATH或使用绝对路径调用它来修复它,即

sudo /usr/sbin/ipset

代替

sudo ipset


ken*_*orb 6

命令sudo失败,因为它尝试提示root密码并且没有分配伪tty(因为它是脚本的一部分).

您需要以root身份登录才能运行此命令或在/etc/sudoers (或:)中设置以下规则sudo visudo:

# Members of the admin group may gain root privileges.
%admin  ALL=(ALL) NOPASSWD:ALL
Run Code Online (Sandbox Code Playgroud)

然后确保您的用户属于admin组(或wheel).

理想情况下(更安全)将root权限限制为可以指定为的特定命令 %admin ALL=(ALL) NOPASSWD:/path/to/program


小智 6

我想我可以为某人提供帮助。

首先,我/etc/sudoers参考上面的答案更改了用户设置。但是它仍然没有用。

myuser   ALL=(ALL) NOPASSWD: ALL
%mygroup  ALL=(ALL:ALL) ALL
Run Code Online (Sandbox Code Playgroud)

就我而言,myuser在中mygroup

而且我不需要团体。因此,删除该行。

(不要像我一样删除该行,而只是标记评论。)

myuser   ALL=(ALL) NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)

有用!