[英]How to fix 'sudo: no tty present and no askpass program specified' error?
我正在尝试使用 makefile 编译一些源代码。在 makefile 中有一堆命令需要作为sudo
运行。
当我从终端编译源代码时一切正常,并且第一次运行sudo
命令等待密码时 make 暂停。 输入密码后,make resumes 并完成。
但我希望能够编译 NetBeans 中的源代码。因此,我启动了一个项目并向 .netbeans 展示了在哪里可以找到源代码,但是当我编译该项目时它给出了错误:
sudo: no tty present and no askpass program specified
它第一次遇到sudo
命令。
我在 inte.net 上查找了这个问题,我找到的所有解决方案都指向一件事:禁用该用户的密码。 由于这里有问题的用户是root。 我不想那样做。
还有其他解决办法吗?
授予用户使用该命令而不提示输入密码应该可以解决问题。 首先打开一个shell控制台并输入:
sudo visudo
然后编辑该文件以添加到最后:
username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand
例如
john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop
将允许用户john
sudo poweroff
, start
和stop
而不会提示输入密码。
在屏幕底部查看您需要在 visudo 中使用的击键 - 顺便说一下,这不是 vi - 并在出现任何问题的第一个迹象时退出而不保存。 健康警告:破坏此文件会造成严重后果,请谨慎编辑!
尝试:
对所有命令使用NOPASSWD
行,我的意思是:
jenkins ALL=(ALL) NOPASSWD: ALL
将该行放在sudoers
文件中的所有其他行之后。
这对我有用(Ubuntu 14.04)。
尝试:
ssh -t remotehost "sudo <cmd>"
这将消除上述错误。
在所有替代方案之后,我发现:
sudo -S <cmd>
-S (stdin) 选项使 sudo 从标准输入而不是终端设备读取密码。
以上命令仍然需要输入密码。 要删除手动输入密码,在 jenkins 等情况下,此命令有效:
echo <password> | sudo -S <cmd>
sudo
默认会从附加的终端读取密码。 您的问题是从 netbeans 控制台运行时没有附加终端。 因此,您必须使用另一种方式来输入密码:称为askpass程序。
askpass程序不是一个特定的程序,而是任何可以要求输入密码的程序。 例如在我的系统中x11-ssh-askpass
工作正常。
为此,您必须使用环境变量SUDO_ASKPASS
或在sudo.conf
文件中指定要使用的程序(有关详细信息,请参阅man sudo
)。
您可以使用选项-A
强制sudo
使用 askpass 程序。 默认情况下,只有在没有附加终端时才会使用它。
对于 Ubuntu 16.04 用户
有一个文件你必须阅读:
cat /etc/sudoers.d/README
在 /etc/sudoers.d/myuser 中放置一个模式为 0440 的文件,内容如下:
myuser ALL=(ALL) NOPASSWD: ALL
应该解决问题。
不要忘记:
chmod 0440 /etc/sudoers.d/myuser
试试这个:
echo '' | sudo -S my_command
登录到您的 Linux。 执行以下命令。 小心,因为编辑 sudoer 是一个冒险的提议。
$ sudo visudo
vi 编辑器打开后,进行以下更改:
注释掉Defaults requiretty
# Defaults requiretty
转到文件末尾并添加
jenkins ALL=(ALL) NOPASSWD: ALL
如果您有任何机会来到这里是因为您无法在 Windows10 附带的 Ubuntu 中执行 sudo
从 Windows 编辑 /etc/hosts 文件(使用记事本),它将位于: %localappdata\\lxss\\rootfs\\etc
,添加127.0.0.1 WINDOWS8
,这将摆脱它无法找到的第一个错误主人。
要摆脱no tty present
错误,请始终执行sudo -S <command>
在詹金斯:
echo '<your-password>' | sudo -S command
例如:-
echo '******' | sudo -S service nginx restart
您可以使用Mask Password Plugin隐藏您的密码
这对我有用:
echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
您的用户是“myuser”
对于 Docker 映像,这将是:
RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
确保您要执行的sudo
是PATH
一部分。
如果您有一个(或多个,但不是全部)命令sudoers
条目,您将获得sudo: no tty present and no askpass program specified
when the command is not your path (and the full path is not specified) .
您可以通过将命令添加到PATH
或使用绝对路径调用它来修复它,即
sudo /usr/sbin/ipset
代替
sudo ipset
命令sudo
失败,因为它试图提示 root 密码并且没有分配伪 tty(因为它是脚本的一部分)。
您需要以 root 身份登录才能运行此命令,或者在您的/etc/sudoers
(或: sudo visudo
)中设置以下规则:
# Members of the admin group may gain root privileges.
%admin ALL=(ALL) NOPASSWD:ALL
然后确保您的用户属于admin
组(或wheel
)。
理想情况下(更安全)将 root 权限限制为可以指定为%admin ALL=(ALL) NOPASSWD:/path/to/program
特定命令
我想我可以帮助某人处理我的案子。
首先,我参考上述答案更改了/etc/sudoers
的用户设置。 但它仍然没有奏效。
myuser ALL=(ALL) NOPASSWD: ALL
%mygroup ALL=(ALL:ALL) ALL
就我而言, myuser
在mygroup
。
而且我不需要团体。 因此,删除了该行。
(不应该像我一样删除那行,只是标记评论。)
myuser ALL=(ALL) NOPASSWD: ALL
有用!
从 jenkins 运行其中包含 sudo 命令的 shell 脚本可能无法按预期运行。 要解决此问题,请继续
简单步骤:
在基于 ubuntu 的系统上,运行“ $ sudo visudo ”
这将打开 /etc/sudoers 文件。
jenkins ALL=(ALL) NOPASSWD: ALL
保存文件
重新启动您的詹金斯工作
您不应该再次看到该错误消息:)
当您尝试从某些非 shell 脚本(例如,来自 Ruby 程序的sudo ls
(反引号))运行终端命令(需要 root 密码)时,也可能出现此错误。 在这种情况下,您可以使用Expect实用程序 ( http://en.wikipedia.org/wiki/Expect ) 或其替代品。
例如,在 Ruby 中执行sudo ls
而不得到sudo: no tty present and no askpass program specified
,你可以运行这个:
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]。
作为参考,万一其他人遇到同样的问题,我在一个小时内被卡住了这个错误,因为我使用的是 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 被用于某些守护程序)时,他将遇到错误“没有 tty 存在且没有指定 askpass 程序”。
为什么?
因为 /etc/sudoers 文件中的行尾缺少逗号...
(我什至想知道这是否是预期的行为而不是 sudo 中的错误,因为这种情况下的正确错误消息应该是“对不起,不允许用户 bguser 执行等”)
我收到此错误是因为我将我的用户限制为只有一个可执行文件“systemctl”并且错误配置了 visudo 文件。
这是我所拥有的:
jenkins ALL=NOPASSWD: systemctl
但是,您需要包含可执行文件的完整路径,即使默认情况下它在您的路径上,例如:
jenkins ALL=NOPASSWD: /bin/systemctl
这允许我的 jenkins 用户重新启动服务但没有完全的 root 访问权限
如果您将此行添加到您的/etc/sudoers
(通过visudo
),它将解决此问题而无需禁用输入您的密码,并且当sudo -S
的别名不起作用时(调用sudo
脚本):
Defaults visiblepw
当然自己阅读手册来理解它,但我认为对于我通过lxc exec instance -- /bin/bash
在 LXD 容器中运行的用lxc exec instance -- /bin/bash
它非常安全,因为它没有通过网络打印密码。
我在Ubuntu 20.04服务器上工作时遇到了这个问题。
我试图从远程机器运行sudo
命令以将应用程序部署到服务器。 但是,当我运行命令时,出现错误:
sudo: no tty present and no askpass program specified
The remote script failed with exit code 1
这是我修复它的方法:
该问题是由执行sudo
命令引起的,该命令试图请求密码,但sudo
无权访问tty
以提示用户输入密码。 由于找不到tty
, sudo
回askpass
方法,但找不到配置的askpass
命令,因此sudo
命令失败。
要解决此问题,您需要能够为该特定用户运行sudo
而没有密码要求。 /etc/sudoers
文件中配置了无密码要求。 要配置它,请运行以下任一命令:
sudo nano /etc/sudoers
或者
sudo visudo
注意:这将使用您的默认编辑器打开/etc/sudoers
文件。
接下来,在文件底部添加以下行:
# Allow members to run all commands without a password
my_user ALL=(ALL) NOPASSWD:ALL
注意:将my_user
替换为您的实际用户
如果您希望用户运行特定命令,您可以指定它们
# Allow members to run specific commands without a password
my_user ALL=(ALL) NOPASSWD:/bin/myCommand
或者
# Allow members to run specific commands without a password
my_user ALL=(ALL) NOPASSWD: /bin/myCommand, /bin/myCommand, /bin/myCommand
保存更改并退出文件。
如需更多帮助,请阅读此链接中的资源: sudo: no tty present and no askpass program specified
就这样。
我希望这有帮助
没有人知道是什么导致了这个错误,在从一台主机迁移到另一台主机的情况下,记得检查 sudoers 文件中的主机名:
所以这是我的 /etc/sudoers 配置
User_Alias POWERUSER = user_name
Cmnd_Alias SKILL = /root/bin/sudo_auth_wrapper.sh
POWERUSER hostname=(root:root) NOPASSWD: SKILL
如果不匹配
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
它会弹出这个错误:
不存在 tty 且未指定 askpass 程序
其他选项,不基于 NOPASSWD:
当我尝试挂载需要 sudo 的 sshfs 时,我收到了相同的错误消息:命令是这样的:
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
上的 /etc/sudoer.d/user 中创建一个文件:
user ALL=NOPASSWD: /usr/lib/openssh/sftp-server
现在我可以安装驱动器而不会给我的用户太多额外的权利。
虽然这个问题很老,但它仍然与我或多或少是最新的系统有关。 启用 sudo 的调试模式后(在/etc/sudo.conf
Debug sudo /var/log/sudo_debug all@info
)我被指向 /dev: “ /dev is world writable
”。 因此,您可能需要检查 tty 文件权限,尤其是 tty/pts 节点所在目录的权限。
我能够完成此操作,但请确保正确执行这些步骤。 这适用于遇到导入错误的任何人。
步骤1 :检查文件和文件夹是否有执行权限问题。 Linux用户使用:
chmod 777 filename
Step2 :检查哪个用户有权限执行它。
Step3 :打开终端输入此命令。
sudo visudo
将此行添加到下面的代码中
www-data ALL=(ALL) NOPASSWD:ALL
nobody ALL=(ALL) NOPASSWD:/ALL
这是授予执行脚本的权限并允许它使用所有库。 用户通常是“没人”或“www-data”。
现在将您的代码编辑为
echo shell_exec('sudo -u the_user_of_the_file python your_file_name.py 2>&1');
去终端检查进程是否正在运行,在那里输入这个...
ps aux | grep python
这将输出在 python 中运行的所有进程。
附加组件:使用以下代码检查系统中的用户
cut -d: -f1 /etc/passwd
谢谢你!
输入sudo vi /etc/sudoers
。 这将以编辑模式打开您的文件。
查找 Linux 用户的条目。 如果找到,请修改如下或添加新行。
<USERNAME> ALL=(ALL) NOPASSWD: ALL
使用管道:
echo your_pswd | sudo -S your_cmd
使用此处文档:
sudo -S cmd <<eof
pwd
eof
#remember to put the above two lines without "any" indentations.
打开终端询问密码(以有效者为准):
gnome-terminal -e "sudo cmd"
xterm -e "sudo cmd"
问题的解决方法是
如果您在 Jenkins 实例之外的其他任何地方遇到此问题,请从第二步开始。 第一步是针对 Jenkins 实例有问题的用户。
转到 Google Cloud Console 的 Jenkins 实例。 输入命令 sudo su
visudo -f /etc/sudoers
在最后添加以下行
jenkins ALL= NOPASSWD: ALL
在这里结帐以了解此问题的根本原因
我不确定这是否是最近的更改,但我只是遇到了这个问题并且sudo -S
为我工作。
以下操作适用于 ubuntu20
visudo
或者
vi /etc/sudoers
userName ALL=(ALL) NOPASSWD: ALL
%sudo ALL=(ALL:ALL) NOPASSWD:ALL
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.