linux - sudo找不到命令 - sudo python command not found




如何解决'sudo:没有tty礼物,没有askpass程序指定'错误? (13)

我正在尝试使用makefile编译一些源代码。 在makefile中有一堆命令需要作为sudo运行。

当我从终端编译源码时,一切正常,第一次sudo命令正在等待密码时,make暂停。 一旦我输入密码,进行恢复并完成。

但我希望能够在NetBeans中编译源代码。 所以,我开始了一个项目,并展示了netbeans在哪里可以找到源代码,但是当我编译项目时,它会给出错误:

sudo: no tty present and no askpass program specified

它第一次命中sudo命令。

我在网上找到了这个问题,我发现所有解决方案都指向了一件事:禁用该用户的密码。 由于这里所讨论的用户是root用户。 我不想这样做。

还有其他解决方案吗?


sudo默认会从连接的终端读取密码。 您的问题是从netbeans控制台运行时没有附加任何终端。 所以你必须使用另一种方式来输入密码:这就是所谓的askpass程序。

askpass程序不是一个特定的程序,而是任何可以要求输入密码的程序。 例如,在我的系统中, x11-ssh-askpass可以正常工作。

为了做到这一点,您必须指定要使用的程序,无论是使用环境变量SUDO_ASKPASS还是使用sudo.conf文件(有关详细信息,请参阅man sudo )。

您可以使用选项-A强制sudo使用askpass程序。 默认情况下,只有当没有连接的终端时才会使用它。


在詹金斯

echo '<your-password>' | sudo -S command

例如 : -

echo '******' | sudo -S service nginx restart

您可以使用Mask Password Plugin来隐藏您的密码


作为参考,如果其他人遇到同样的问题,我在一个小时内卡住了这个错误,因为我使用了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并且没有指定askpass程序”。

为什么?

由于在/ etc / sudoers文件的行尾缺少逗号...

(我甚至想知道这是否是预期的行为,而不是sudo中的错误,因为这种情况下的正确错误消息应该是“对不起,用户bguser不允许执行”等)。


其他选项,不基于NOPASSWD:

  • 启动具有root特权((sudo netbeans)或类似的)的Netbeans,这将推测用root分叉构建过程,因此sudo会自动成功。
  • 进行suexec所需的操作 - 使它们由root拥有,并将模式设置为4755.(这当然会让机器上的任何用户运行它们)。这样,它们根本不需要sudo。
  • 使用启动扇区创建虚拟硬盘文件根本不需要sudo。 文件只是文件,启动扇区就是数据。 即使虚拟机不一定需要root,除非您进行高级设备转发。

在所有选择之后,我发现了这一点

sudo -S true

是最快的答案,但我不知道为什么。


如果你有机会来到这里,是因为你无法在Windows10附带的Ubuntu中进行sudo操作

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

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


尝试:

ssh -t remotehost "sudo <cmd>"

这将消除上述错误。


当您尝试从某个非shell脚本运行终端命令(需要root密码)时,也可能会出现此错误,例如,Ruby程序中的sudo ls (在反引号中)。 在这种情况下,您可以使用Expect实用程序( 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

[这使用了期望 TCL扩展的替代方案之一: ruby_expect gem]。


授予用户在不提示输入密码的情况下使用该命令应该可以解决问题。 首先打开一个shell控制台并输入:

sudo visudo

然后编辑该文件以添加到最后:

username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand

例如

john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop

将允许用户'约翰'sudo关机,启动和停止,而不会提示输入密码。

在屏幕的底部查看你需要在visudo中使用的按键 - 这种方式并不是vi - 并且在出现任何问题的第一个迹象时退出而不保存。 健康警告:破坏此文件将产生严重后果,请谨慎编辑!


没有人告诉如果从一台主机迁移到另一台主机时可能导致此错误,请记住检查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程序


确保你要做的sudoPATH一部分。

如果你有一个(或多个,但不是全部)命令sudoers条目,你会得到sudo: no tty present and no askpass program specified当命令不是你的路径的一部分时sudo: no tty present and no askpass program specified (并且没有指定完整路径) 。

您可以通过将命令添加到PATH或使用绝对路径调用它来修复它,即

sudo /usr/sbin/ipset

代替

sudo ipset


试试这个:

echo '' | sudo -S my_command

适用于Ubuntu 16.04用户

有一个文件你必须阅读:

cat /etc/sudoers.d/README

将模式为0440的文件放在/etc/sudoers.d/myuser中,内容如下:

myuser  ALL=(ALL) NOPASSWD: ALL

应该解决这个问题。

不要忘记:

chmod 0440 /etc/sudoers.d/myuser




tty