如何解决'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的方式 – 在没有任何问题的第一个迹象的情况下退出而不保存。 健康警告:破坏此文件将产生严重后果,请小心编辑!

尝试:

  1. 所有命令都使用NOPASSWD行,我的意思是:

     jenkins ALL=(ALL) NOPASSWD: ALL 
  2. 将该行放在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操作

  1. 编辑从Windows的/ etc / hosts文件(用记事本),它将位于: %localappdata\lxss\rootfs\etc ,添加127.0.0.1 WINDOWS8 ,这将摆脱它找不到的第一个错误主人。

  2. 为了摆脱no tty present错误,总是做sudo -S <command>

login到你的linux。 射击下面的命令。 小心,编辑sudoer是一个冒险的主张。

 $ sudo visudo 

一旦vi编辑器打开,进行以下更改:

  1. 注释掉Defaults requiretty

     # Defaults requiretty 
  2. 转到文件的末尾并添加

     jenkins ALL=(ALL) NOPASSWD: ALL 

确保你要做的sudoPATH一部分。

如果你有一个(或多个,但不是全部)命令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,除非您进行高级设备转发。