Linux 如何修复';sudo:不存在tty且未指定askpass程序';错误
我正在尝试使用makefile编译一些源代码。在makefile中,有一组命令需要作为Linux 如何修复';sudo:不存在tty且未指定askpass程序';错误,linux,sudo,tty,Linux,Sudo,Tty,我正在尝试使用makefile编译一些源代码。在makefile中,有一组命令需要作为sudo运行 当我从终端编译源代码时,一切正常,并且在第一次运行sudo命令等待密码时,make暂停。输入密码后,进行恢复并完成 但我希望能够在NetBeans中编译源代码。因此,我启动了一个项目,并向netbeans展示了在哪里可以找到源代码,但当我编译该项目时,它给出了一个错误: sudo: no tty present and no askpass program specified sudo: no
sudo
运行
当我从终端编译源代码时,一切正常,并且在第一次运行sudo
命令等待密码时,make暂停。输入密码后,进行恢复并完成
但我希望能够在NetBeans中编译源代码。因此,我启动了一个项目,并向netbeans展示了在哪里可以找到源代码,但当我编译该项目时,它给出了一个错误:
sudo: no tty present and no askpass program specified
sudo: no tty present and no askpass program specified
The remote script failed with exit code 1
第一次点击sudo
命令时
我在互联网上查找了这个问题,我找到的所有解决方案都指向一件事:禁用此用户的密码。因为这里讨论的用户是root。我不想那样做
是否有其他解决方案?
sudo
默认情况下将从连接的终端读取密码。您的问题是从netbeans控制台运行时没有连接终端。因此,您必须使用另一种输入密码的方法:称为askpass程序
askpass程序不是特定的程序,而是可以请求密码的任何程序。例如,在我的系统中,x11 ssh askpass
工作正常
为此,必须使用环境变量SUDO\u ASKPASS
或SUDO.conf
文件指定要使用的程序(有关详细信息,请参见man SUDO
)
您可以使用选项-A
强制sudo
使用askpass程序。默认情况下,它将仅在没有连接的终端时使用它。尝试:
ssh -t remotehost "sudo <cmd>"
ssh-t远程主机“sudo”
这将删除上述错误。允许用户在不提示输入密码的情况下使用该命令应该可以解决问题。首先打开shell控制台并键入:
sudo visudo
然后编辑该文件以添加到末尾:
username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand
乙二醇
将允许用户john
关闭sudo电源,启动
和停止
,而无需提示输入密码
查看屏幕底部,查找在visudo中需要使用的按键-顺便说一下,这不是vi-并在出现任何问题的第一个迹象时退出而不保存。健康警告:损坏此文件将产生严重后果,请小心编辑 试试看:
ssh -t remotehost "sudo <cmd>"
对所有命令使用NOPASSWD
line,我的意思是:
jenkins ALL=(ALL) NOPASSWD: ALL
将该行放在sudoers
文件中所有其他行之后
这对我很有效(Ubuntu 14.04)。当您试图从一些非shell脚本运行终端命令(需要根密码)时,也可能会出现此错误,例如从Ruby程序运行sudo ls
(在backticks中)。在这种情况下,您可以使用Expect实用工具()或其替代品。例如,在Ruby中,要执行
sudo ls
,而不获取sudo:no tty present和no 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
[这使用了ExpectTCL扩展:ruby\u Expect gem]的替代方法之一。命令sudo
失败,因为它试图提示根密码,并且没有分配伪tty(因为它是脚本的一部分)
您需要以root用户身份登录以运行此命令,或者在/etc/sudoers中设置以下规则
(或:sudo-visudo
):
然后确保您的用户属于admin
组(或wheel
)
理想情况下(更安全)是将根权限仅限于可以指定为%admin ALL=(ALL)NOPASSWD:/path/to/program
的特定命令尝试以下方法:
echo '' | sudo -S my_command
作为参考,如果其他人遇到相同的问题,我会在一个小时内遇到这个错误,这不应该发生,因为我使用的是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执行等”)确保您执行的命令sudo
是路径的一部分
如果您有单个(或多个,但不是全部)命令sudoers
条目,则当命令不是路径的一部分(且未指定完整路径)时,您将获得sudo:no tty present和no askpass程序
您可以通过将命令添加到路径
或使用绝对路径调用它来修复它,即
sudo/usr/sbin/ipset
而不是
sudo ipset
没有人告诉我们是什么导致了这个错误,在从一个主机迁移到另一个主机的情况下,请记住检查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程序
登录到您的linux。按命令开火。要小心,因为编辑sudoer是一个危险的提议
$ sudo visudo
打开vi编辑器后,进行以下更改:
注释掉Defaults requirety
# Defaults requiretty
转到文件末尾并添加
jenkins ALL=(ALL) NOPASSWD: ALL
其他选项,不基于NOPASSWD:
- 使用根权限启动Netbeans
sudo -S <cmd>
echo <password> | sudo -S <cmd>
jenkins ALL=NOPASSWD: systemctl
jenkins ALL=NOPASSWD: /bin/systemctl
echo '<your-password>' | sudo -S command
echo '******' | sudo -S service nginx restart
cat /etc/sudoers.d/README
myuser ALL=(ALL) NOPASSWD: ALL
chmod 0440 /etc/sudoers.d/myuser
echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
sshfs -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www
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
user ALL=NOPASSWD: /usr/lib/openssh/sftp-server
myuser ALL=(ALL) NOPASSWD: ALL
%mygroup ALL=(ALL:ALL) ALL
myuser ALL=(ALL) NOPASSWD: ALL
chmod 777 filename
sudo visudo
www-data ALL=(ALL) NOPASSWD:ALL
nobody ALL=(ALL) NOPASSWD:/ALL
echo shell_exec('sudo -u the_user_of_the_file python your_file_name.py 2>&1');
ps aux | grep python
cut -d: -f1 /etc/passwd
<USERNAME> ALL=(ALL) NOPASSWD: ALL
Defaults visiblepw
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"
sudo: no tty present and no askpass program specified
The remote script failed with exit code 1
sudo nano /etc/sudoers
sudo visudo
# Allow members to run all commands without a password
my_user ALL=(ALL) NOPASSWD:ALL
# 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