如何解决'sudo:没有tty目前没有askpass程序指定'错误?
我正在尝试使用makefile编译一些源代码。 在makefile中有一些命令需要作为sudo
运行。
当我从terminal编译源码时,一切正常,第一次sudo
命令正在等待密码时,make将暂停。 一旦我input密码,恢复并完成。
但我希望能够在NetBeans中编译源代码。 所以,我开始了一个项目,并展示了netbeans在哪里可以find源代码,但是当我编译这个项目时,它会给出错误:
sudo: no tty present and no askpass program specified
第一次命中sudo
命令。
我已经在互联网上查找了这个问题,我发现的所有解决scheme都指向了一件事:禁用此用户的密码。 由于这里的用户是根。 我不想这样做。
有没有其他解决scheme?
授予用户在不提示input密码的情况下使用该命令可以解决问题。 首先打开一个shell控制台并input:
sudo visudo
然后编辑该文件以添加到最后:
username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand
例如
john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop
将允许用户'john'sudo关机,启动和停止而不提示input密码。
在屏幕的底部查看你需要在visudo中使用的按键 – 这不是vi的方式 – 在没有任何问题的第一个迹象的情况下退出而不保存。 健康警告:破坏此文件将产生严重后果,请小心编辑!
尝试:
-
所有命令都使用
NOPASSWD
行,我的意思是:jenkins ALL=(ALL) NOPASSWD: ALL
-
将该行放在
sudoers
文件中的所有其他行之后。
这对我来说(Ubuntu 14.04)。
尝试:
ssh -t remotehost "sudo <cmd>"
这将消除上述错误。
所有的select,我发现
sudo -S true
是最快的答案,但我不知道为什么。
sudo
默认会从所连接的terminal读取密码。 您的问题是,从netbeans控制台运行时没有连接terminal。 所以你必须使用另一种方式来input密码:这就是所谓的askpass程序。
askpass程序不是一个特定的程序,而是任何可以要求input密码的程序。 例如在我的系统x11-ssh-askpass
工作正常。
为了做到这一点,您必须指定要使用的程序,无论是使用环境variablesSUDO_ASKPASS
还是使用sudo.conf
文件(有关详细信息,请参阅man sudo
)。
您可以使用选项-A
强制sudo
使用askpass程序。 默认情况下,只有在没有连接的terminal时才会使用它。
试试这个:
echo '' | sudo -S my_command
如果你有任何机会来到这里,因为你不能在Windows10附带的Ubuntu内进行sudo操作
-
编辑从Windows的/ etc / hosts文件(用记事本),它将位于:
%localappdata\lxss\rootfs\etc
,添加127.0.0.1 WINDOWS8
,这将摆脱它找不到的第一个错误主人。 -
为了摆脱
no tty present
错误,总是做sudo -S <command>
login到你的linux。 射击下面的命令。 小心,编辑sudoer是一个冒险的主张。
$ sudo visudo
一旦vi编辑器打开,进行以下更改:
-
注释掉
Defaults requiretty
# Defaults requiretty
-
转到文件的末尾并添加
jenkins ALL=(ALL) NOPASSWD: ALL
确保你要做的sudo
是PATH
一部分。
如果你有一个(或多个,但不是全部)命令sudoers
条目,你会得到sudo: no tty present and no askpass program specified
当命令不是你的path的一部分时sudo: no tty present and no askpass program specified
(并且没有指定完整path) 。
您可以通过将命令添加到PATH
或使用绝对path调用它来修复它
sudo /usr/sbin/ipset
代替
sudo ipset
在jenkins :
echo '<your-password>' | sudo -S command
例如 : –
echo '******' | sudo -S service nginx restart
您可以使用Mask密码插件来隐藏您的密码
命令sudo
失败,因为它试图提示根密码,并没有伪tty分配(因为它是脚本的一部分)。
您需要以root身份login才能运行此命令,或者在/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
特定命令上%admin ALL=(ALL) NOPASSWD:/path/to/program
对于Ubuntu 16.04用户
有一个文件,你必须阅读:
cat /etc/sudoers.d/README
将模式为0440的文件放在/etc/sudoers.d/myuser中,内容如下:
myuser ALL=(ALL) NOPASSWD: ALL
应该解决这个问题。
不要忘记:
chmod 0440 /etc/sudoers.d/myuser
当您尝试从某个非shell脚本运行terminal命令(需要root密码)时,也可能会出现此错误,例如,Ruby程序中的sudo ls
(在反引号中)。 在这种情况下,您可以使用Expect实用程序( http://en.wikipedia.org/wiki/Expect )或其替代方法。
例如,在Ruby中执行sudo ls
而不执行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
[这使用了期望 TCL扩展的替代scheme之一: ruby_expect gem]。
作为参考,如果有其他人遇到同样的问题,我被困在一个好时间,这个错误不应该发生,因为我使用NOPASSWD参数。
我不知道的是,当没有tty时,sudo可能会引发完全相同的错误消息,而用户尝试启动的命令不是/ etc / sudoers文件中允许的命令的一部分。
这里是我的问题的文件内容简化的例子:
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并且没有指定askpass程序”。
为什么?
由于在/ etc / sudoers文件的行尾缺less一个逗号…
(我甚至想知道这是否是一个预期的行为,而不是sudo中的错误,因为这种情况的正确的错误信息是“对不起,用户bguser不允许执行等”)
我得到这个错误,因为我已经限制我的用户只有一个可执行文件“systemctl”,并错误configuration了visudo文件。
这是我所拥有的:
jenkins ALL=NOPASSWD: systemctl
但是,您需要包含可执行文件的完整path,即使默认path在您的path上,例如:
jenkins ALL=NOPASSWD: /bin/systemctl
这让我的jenkins用户重新启动服务,但没有完全的根访问权限
没有人告诉过,如果从一台主机迁移到另一台主机,可能会导致这个错误,请记住检查sudoers文件中的主机名:
所以这是我的/ etc / sudoersconfiguration
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
它会popup这个错误:
没有tty礼物,没有askpass程序指定
其他选项,不基于NOPASSWD:
- 启动具有root特权((sudo netbeans)或类似的)的Netbeans,这将大概分叉生成过程与根,因此sudo将自动成功。
- 进行suexec所需的操作 – 使它们由root拥有,并将模式设置为4755.(这当然会让机器上的任何用户运行它们)。这样,它们根本不需要sudo。
- 用引导扇区创build虚拟硬盘文件根本不需要sudo。 文件只是文件,启动扇区就是数据。 即使虚拟机不一定需要root,除非您进行高级设备转发。