我正在尝试使用makefile编译一些源代码。在makefile中有一堆需要以sudo
运行的命令。
当我从终端编译源时,一切正常,并且在第一次运行sudo
命令等待密码时,make暂停。输入密码后,请重新开始并完成。
但我希望能够在NetBeans中编译源代码。所以,我开始了一个项目并展示了netbeans在哪里可以找到源代码,但是当我编译项目时它会给出错误:
sudo: no tty present and no askpass program specified
第一次点击sudo
命令。
我在互联网上查找了这个问题,我发现的所有解决方案都指向一件事:禁用此用户的密码。由于这里的用户是root用户。我不想那样做。
还有其他解决方案吗?
答案 0 :(得分:204)
授予用户使用该命令而不提示输入密码应该可以解决问题。首先打开一个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 - 并且在没有保存的情况下退出,不会出现任何问题。健康警告:破坏此文件会产生严重后果,请小心编辑!
答案 1 :(得分:154)
尝试:
对所有命令使用NOPASSWD
行,我的意思是:
jenkins ALL=(ALL) NOPASSWD: ALL
将该行放在sudoers
文件中的所有其他行之后。
这对我有用(Ubuntu 14.04)。
答案 2 :(得分:139)
尝试:
ssh -t remotehost "sudo <cmd>"
这将消除上述错误。
答案 3 :(得分:96)
在所有选择之后,我发现:
let textfields = view.subviews.filter({$0.isKindOfClass(UITextField)})
-S(stdin)选项导致sudo从标准输入而不是终端设备读取密码。
以上命令仍需要输入密码。要手动删除输入密码,在jenkins等情况下,此命令有效:
sudo -S <cmd>
答案 4 :(得分:39)
sudo
将从连接的终端读取密码。您的问题是从netbeans控制台运行时没有连接终端。因此,您必须使用另一种方法输入密码:称为 askpass 程序。
askpass 程序不是特定程序,而是任何可以要求输入密码的程序。例如,在我的系统x11-ssh-askpass
中工作正常。
为了做到这一点,您必须使用环境变量SUDO_ASKPASS
或sudo.conf
文件指定要使用的程序(有关详细信息,请参阅man sudo
)。
您可以使用sudo
选项强制-A
使用askpass程序。默认情况下,只有在没有连接的终端时才会使用它。
答案 5 :(得分:21)
试试这个:
echo '' | sudo -S my_command
答案 6 :(得分:15)
对于Ubuntu 16.04用户
您需要阅读一个文件:
cat /etc/sudoers.d/README
将文件0440的文件放在/etc/sudoers.d/myuser中,内容如下:
myuser ALL=(ALL) NOPASSWD: ALL
应该解决问题。
不要忘记:
chmod 0440 /etc/sudoers.d/myuser
答案 7 :(得分:15)
如果你有任何机会来到这里,因为你不能在Windows10附带的Ubuntu中进行sudo
从Windows编辑/ etc / hosts文件(带记事本),它位于:%localappdata\lxss\rootfs\etc
,添加127.0.0.1 WINDOWS8
,这将摆脱第一个错误它无法找到主机。
要摆脱no tty present
错误,请始终sudo -S <command>
答案 8 :(得分:13)
登录你的linux。触发命令。要小心,因为编辑sudoer是一个冒险的主张。
$ sudo visudo
vi编辑器打开后,进行以下更改:
评论Defaults requiretty
# Defaults requiretty
转到文件末尾并添加
jenkins ALL=(ALL) NOPASSWD: ALL
答案 9 :(得分:9)
在Jenkins :
echo '<your-password>' | sudo -S command
例如: -
echo '******' | sudo -S service nginx restart
您可以使用Mask Password Plugin隐藏密码
答案 10 :(得分:8)
这对我有用:
echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
您的用户是“myuser”
对于Docker镜像,它只是:
RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
答案 11 :(得分:8)
确保您sudo
PATH
的命令属于sudoers
。
如果您有一个(或多个,但不是全部)命令sudo: no tty present and no askpass program specified
条目,当命令不属于您的路径时(以及完整路径),您将获得PATH
未指定)。
您可以通过将命令添加到sudo /usr/sbin/ipset
或使用绝对路径调用它来修复它,即
sudo ipset
而不是
<link id="myStyleSheet" href="stylesheet1.css" rel="stylesheet" type="text/css"> I put an id in stylesheet
<div id="changeLook">
Change style:
<select id="changeStyle" onchange="changeStyleFunction()">
<option value="stylesheet1.css">Style 1</option>
<option value="stylesheet2.css">Style 2</option>
<option value="stylesheet3.css">Style 3</option>
<option value="stylesheet4.css">Style 4</option>
</select>
</div>
答案 12 :(得分:5)
命令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
答案 13 :(得分:3)
我认为我可以为某人提供帮助。
首先,我参考上述答案更改了/etc/sudoers
中的用户设置。但是它仍然没有用。
myuser ALL=(ALL) NOPASSWD: ALL
%mygroup ALL=(ALL:ALL) ALL
就我而言,myuser
在mygroup
中。
我不需要团体。因此,删除该行。
(不要像我一样删除该行,而只是标记评论。)
myuser ALL=(ALL) NOPASSWD: ALL
有效!
答案 14 :(得分:2)
运行的jenkins中包含sudo命令的shell脚本可能无法按预期运行。要解决此问题,请遵循
简单步骤:
在基于ubuntu的系统上,运行“ $ sudo visudo”
这将打开/ etc / sudoers文件。
jenkins ALL =(全部)NOPASSWD:全部
保存文件
重新开始您的詹金斯工作
您不应再看到该错误消息:)
答案 15 :(得分:1)
如果将此行(通过/etc/sudoers
添加到visudo
中,它将解决此问题而不必禁用输入密码,并且sudo -S
的别名不起作用时(调用sudo
的脚本:
Defaults visiblepw
当然,请您自己阅读manual才能理解它,但是我认为通过lxc exec instance -- /bin/bash
在LXD容器中运行的用例是非常安全的,因为它不会通过网络打印密码
答案 16 :(得分:1)
我在 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
仅此而已。
我希望这会有所帮助
答案 17 :(得分:1)
我收到此错误是因为我将用户限制为仅限一个可执行文件&#39; systemctl&#39;并错误配置了visudo文件。
这就是我所拥有的:
jenkins ALL=NOPASSWD: systemctl
但是,您需要包含可执行文件的完整路径,即使它默认位于您的路径上,例如:
jenkins ALL=NOPASSWD: /bin/systemctl
这允许我的jenkins用户重新启动服务但没有完全root权限
答案 18 :(得分:1)
作为参考,如果其他人遇到同样的问题,我会在一个很好的时间内遇到这个错误,因为我使用的是NOPASSWD参数,所以不会发生这种错误。
我不知道的是,当没有tty时,sudo可能会引发完全相同的错误消息,并且用户尝试启动的命令不是/ etc / sudoers文件中允许命令的一部分。
这是我的问题的文件内容的简化示例:
bguser ALL = NOPASSWD: \
command_a arg_a, \
command_b arg_b \
command_c arg_c
当bguser尝试启动“sudo command_b arg_b”而没有任何tty(bguser用于某个守护进程)时,他会遇到错误“no tty present and no askpass program”。
为什么?
因为/ etc / sudoers文件中的行尾缺少逗号...
(我甚至想知道这是否是预期的行为,而不是sudo中的错误,因为对于这种情况的正确错误消息应该是“抱歉,不允许用户bguser执行等。”)
答案 19 :(得分:1)
当您尝试从某个非shell脚本运行终端命令(需要root密码)时,也可能出现此错误,例如来自Ruby程序的sudo ls
(在反引号中)。在这种情况下,您可以使用期望实用程序(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]。
答案 20 :(得分:0)
也许问题不清楚为什么没有答案匹配它 但是当我尝试安装需要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
因此,通过阅读其他人的回答,我开始在my.server.tld上的/etc/sudoer.d/user
创建一个文件:
user ALL=NOPASSWD: /usr/lib/openssh/sftp-server
现在我可以安装驱动器而不会给用户太多额外的权利。
答案 21 :(得分:0)
没有人告诉可能导致此错误的内容,如果从一个主机迁移到另一个主机,请记住检查sudoers文件中的主机名:
所以这是我的/ etc / sudoers config
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程序
答案 22 :(得分:0)
尽管这个问题很旧,但对于我或多或少的最新系统仍然有用。启用sudo的调试模式(Debug sudo /var/log/sudo_debug all@info
中的/etc/sudo.conf
)后,我指向/ dev:“ /dev is world writable
”。因此,您可能需要检查tty文件权限,尤其是tty / pts节点所在目录的权限。
答案 23 :(得分:0)
我能够完成此操作,但请确保正确执行以下步骤。 这适用于遇到导入错误的任何人。
第1步:检查文件和文件夹是否具有执行权限问题。 Linux用户使用:
chmod 777 filename
步骤2 :检查哪个用户有权执行该操作。
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
谢谢!
答案 24 :(得分:0)
键入sudo vi /etc/sudoers
。这将以编辑模式打开文件。
查找Linux用户的条目。如果找到,请进行以下修改或添加新行。
<USERNAME> ALL=(ALL) NOPASSWD: ALL
答案 25 :(得分:0)
使用管道:
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"
答案 26 :(得分:0)
问题的解决方法是
如果您在 Jenkins 实例以外的其他任何地方遇到此问题,请从第二步开始。第一步是针对 Jenkins 实例有问题的用户。
转到 Google Cloud Console 的 Jenkins 实例。 输入命令 须藤苏
visudo -f /etc/sudoers
在最后添加以下行
詹金斯所有= NOPASSWD:所有
检查 here 以了解此问题的根本原因
答案 27 :(得分:-1)
其他选项,不基于NOPASSWD:
答案 28 :(得分:-1)
以下操作适用于 ubuntu20
visudo
或
vi /etc/sudoers
userName ALL=(ALL) NOPASSWD: ALL
%sudo ALL=(ALL:ALL) NOPASSWD:ALL