How to fix 'sudo: no tty present and no askpass program specified' error?
我正在尝试使用makefile编译一些源文件。在makefile中,有许多命令需要作为
当我从一个终端编译源代码时,一切正常,当第一次运行
但是我希望能够用netbeans编译源代码。因此,我启动了一个项目,并向netbeans展示了在哪里找到源代码,但是当我编译项目时,它给出了错误:
1 | sudo: no tty present and no askpass program specified |
第一次击中一个
我在互联网上查找了这个问题,找到的所有解决方案都指向一件事:禁用这个用户的密码。因为这里讨论的用户是根用户。我不想那样做。
还有其他解决办法吗?
允许用户在不提示输入密码的情况下使用该命令应该可以解决问题。首先打开shell控制台并键入:
1 | sudo visudo |
然后编辑该文件以添加到最后:
1 | username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand |
如
1 | john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop |
允许用户
在屏幕的底部查看需要在visudo中使用的击键(顺便说一下,这不是vi)并在出现任何问题的第一个迹象时退出而不保存。健康警告:损坏此文件将产生严重后果,请小心编辑!
尝试:
对所有命令使用
1 | jenkins ALL=(ALL) NOPASSWD: ALL |
将该行放在
这对我很有用(Ubuntu 14.04)。
尝试:
1 | ssh -t remotehost"sudo <cmd>" |
这将删除上述错误。
在所有的选择之后,我发现:
1 | sudo -S <cmd> |
The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device.
来源
上面的命令仍然需要输入密码。要手动删除输入密码,在Jenkins这样的情况下,此命令可以工作:
1 | echo <password> | sudo -S <cmd> |
默认情况下,
askpass程序不是特定的程序,而是任何可以请求密码的程序。例如,在我的系统中,
为了做到这一点,您必须指定要使用的程序,可以使用环境变量
您可以使用选项
试试这个:
1 | echo '' | sudo -S my_command |
对于Ubuntu 16.04用户
您必须阅读一个文件:
1 | cat /etc/sudoers.d/README |
在/etc/sudoers.d/myuser中放置模式为0440的文件,内容如下:
1 | myuser ALL=(ALL) NOPASSWD: ALL |
应该解决这个问题。
不要忘记:
1 | chmod 0440 /etc/sudoers.d/myuser |
如果你来这里是因为你不能在Ubuntu里用Windows10
从Windows编辑/etc/hosts文件(带记事本),它将位于:
ootfs\etc
为了消除
登录到Linux。按命令开火。小心点,因为编辑sudoer是一个危险的提议。
1 | $ sudo visudo |
一旦vi编辑器打开,进行以下更改:
点评
1 | # Defaults requiretty |
转到文件结尾并添加
1 | jenkins ALL=(ALL) NOPASSWD: ALL |
詹金斯:
1 | echo '<your-password>' | sudo -S command |
Eg:
1 | echo '******' | sudo -S service nginx restart |
您可以使用mask password插件隐藏您的密码
确保你的命令
如果您有一个(或多个,但不是全部)命令
您可以通过将命令添加到您的
而不是
这对我很有用:
1 | echo"myuser ALL=(ALL) NOPASSWD:ALL">> /etc/sudoers |
如果您的用户是"myuser"
对于一个码头工人的形象,那就是:
1 | RUN echo"myuser ALL=(ALL) NOPASSWD:ALL">> /etc/sudoers |
命令
您需要以根用户身份登录才能运行此命令,或者在您的
1 2 | # Members of the admin group may gain root privileges. %admin ALL=(ALL) NOPASSWD:ALL |
然后确保您的用户属于
理想情况下(更安全),只将根权限限制在可以指定为
我想我可以帮助别人处理我的案件。
首先,我修改了
1 2 | myuser ALL=(ALL) NOPASSWD: ALL %mygroup ALL=(ALL:ALL) ALL |
在我的例子中,
我不需要团体。所以,删除了那一行。
(不应该像我一样删除那行,只标记评论。)
1 | myuser ALL=(ALL) NOPASSWD: ALL |
它起作用了!
运行包含Jenkins中sudo命令的shell脚本可能无法按预期运行。要解决这个问题,请继续
简单步骤:
在基于Ubuntu的系统上,运行"$sudo-visudo"
这将打开/etc/sudoers文件。
jenkins ALL=(ALL) NOPASSWD: ALL
保存文件
重新开始你的詹金斯工作
您不应该再看到该错误消息:)
我收到这个错误是因为我把我的用户限制为只有一个可执行文件"systemctl",并且错误地配置了visudo文件。
以下是我的经历:
1 | jenkins ALL=NOPASSWD: systemctl |
但是,您需要包括可执行文件的完整路径,即使默认情况下它在您的路径上,例如:
1 | jenkins ALL=NOPASSWD: /bin/systemctl |
这允许我的Jenkins用户重新启动服务,但没有完全的根访问权限
作为参考,如果其他人遇到同样的问题,我会在一个小时内遇到这个错误,因为我使用了nopasswd参数,所以不应该发生这种错误。
我不知道的是,如果没有tty,并且用户尝试启动的命令不是/etc/sudoers文件中允许的命令的一部分,sudo可能会引发完全相同的错误消息。
以下是我的问题文件内容的简化示例:
1 2 3 4 | 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"(不存在tty且未指定askpass程序)。
为什么?
因为/etc/sudoers文件的行尾缺少逗号…
(我甚至想知道这是否是一种预期的行为,而不是sudo中的错误,因为这种情况的正确错误消息应该是"对不起,不允许用户bguser执行等")。
当您试图从一些非shell脚本(如ruby程序的
1 2 3 4 5 6 7 8 9 10 | 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 |
[这使用了TCL扩展的备选方案之一:ruby_expect gem]。
没有人告诉会导致此错误的原因,如果从一个主机迁移到另一个主机,请记住在sudoers文件中检查主机名:
这是我的/etc/sudoers配置
1 2 3 | User_Alias POWERUSER = user_name Cmnd_Alias SKILL = /root/bin/sudo_auth_wrapper.sh POWERUSER hostname=(root:root) NOPASSWD: SKILL |
如果不匹配
1 2 | uname -a Linux other_hostname 3.10.17 #1 SMP Wed Oct 23 16:28:33 CDT 2013 x86_64 Intel(R) Core(TM) i3-4130T CPU @ 2.90GHz GenuineIntel GNU/Linux |
它将弹出此错误:
no tty present and no askpass program specified
也许问题不清楚为什么没有答案与之匹配但我在尝试装载sshfs时收到了相同的错误消息,这需要sudo:该命令类似于:
1 | sshfs -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" [email protected]:/var/www /mnt/sshfs/www |
通过添加选项
1 | sshfs -o debug -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" [email protected]:/var/www /mnt/sshfs/www |
我对这个问题也有同样的看法:
1 | sudo: no tty present and no askpass program specified |
因此,通过阅读其他答案,我开始在我的.server.tld上的
1 | user ALL=NOPASSWD: /usr/lib/openssh/sftp-server |
现在我可以在不给用户太多额外权利的情况下安装驱动器。
其他选项,不基于nopasswd:
- 使用根特权(sudo netbeans)或类似的特权启动netbeans,这可能会用根分叉构建过程,因此sudo将自动成功。
- 执行执行suexec所需的操作——将它们归root所有,并将模式设置为4755。(这当然会让机器上的任何用户运行它们。)这样,它们根本不需要sudo。
- 用引导扇区创建虚拟硬盘文件根本不需要sudo。文件只是文件,引导扇区只是数据。即使是虚拟机也不一定需要根目录,除非您执行高级设备转发。