我正在尝试使用makefile编译一些源代码。在makefile中,有一堆命令需要作为sudo运行。
当我从终端编译源代码时,一切都很好,并且在第一次运行sudo命令等待密码时,make会暂停。一旦我输入密码,做简历和完成。
但是我希望能够在NetBeans中编译源代码。所以,我开始了一个项目,并向netbeans展示了在哪里可以找到源代码,但当我编译项目时,它给出了错误:
sudo: no tty present and no askpass program specified
第一次执行sudo命令时。
我在网上查了这个问题,我找到的所有解决方案都指向一件事:禁用这个用户的密码。因为这里讨论的用户是根用户。我不想那样做。
还有其他解决办法吗?
允许用户使用该命令而不提示输入密码应该可以解决这个问题。首先打开一个shell控制台,输入:
sudo visudo
然后编辑该文件添加到最后:
username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand
eg
john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop
将允许用户约翰sudo关机,启动和停止没有提示密码。
查看屏幕底部你需要在visudo中使用的击键——顺便说一下,这不是vi——并在出现任何问题的第一个迹象时不保存就退出。健康警告:损坏此文件将导致严重后果,请小心编辑!
当您试图从一些非shell脚本运行终端命令(需要root密码)时,也可能出现此错误,例如从Ruby程序运行sudo ls(反引号)。在这种情况下,您可以使用Expect实用程序(http://en.wikipedia.org/wiki/Expect)或其替代方案。
例如,在Ruby中执行sudo ls而没有得到sudo: no tty present,也没有指定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
[这使用了Expect TCL扩展的一个替代方案:ruby_expect gem]。
命令sudo失败,因为它试图提示输入root密码,并且没有分配伪tty(因为它是脚本的一部分)。
您需要以root身份登录运行此命令,或者在/etc/sudoers中设置以下规则
(或:sudo visudo):
# Members of the admin group may gain root privileges.
%admin ALL=(ALL) NOPASSWD:ALL
然后确保您的用户属于admin组(或wheel)。
理想情况下(更安全),将根权限限制为只允许指定为%admin ALL=(ALL) NOPASSWD:/path/to/program的特定命令
作为参考,以防其他人遇到同样的问题,我在一个小时内被这个错误卡住了,因为我使用的是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不允许执行等”)
没有人告诉会导致这个错误的原因,如果从一个主机迁移到另一个主机,请记住在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 present,也没有指定askpass程序
我得到这个错误是因为我限制了我的用户只有一个可执行的“systemctl”,并错误地配置了visudo文件。
以下是我得到的答案:
jenkins ALL=NOPASSWD: systemctl
然而,你需要包括可执行文件的完整路径,即使它默认在你的路径上,例如:
jenkins ALL=NOPASSWD: /bin/systemctl
这允许我的jenkins用户重新启动服务,但不具有完全的根访问权限
当我试图挂载sshfs时,我有同样的错误消息,需要sudo:命令是这样的:
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在my.server.tld
user ALL=NOPASSWD: /usr/lib/openssh/sftp-server
现在我可以挂载驱动器,而不给我的用户太多额外的权利。
我能够做到这一点,但请确保按照正确的步骤。
这是为任何得到导入错误的人准备的。
步骤1:检查文件和文件夹是否有执行权限问题。
Linux用户使用:
chmod 777 filename
步骤2:检查哪个用户有执行它的权限。
Step3:打开终端键入此命令。
sudo visudo
将这些行添加到下面的代码中
www-data ALL=(ALL) NOPASSWD:ALL
nobody ALL=(ALL) NOPASSWD:/ALL
这是授予执行脚本的权限,并允许它使用所有的库。用户通常是“nobody”或“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
谢谢你!
我在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
OR
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
OR
# 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
这是所有。
我希望这对你们有帮助