关于linux:如何修复’sudo:no tty present and no askpass program specified’错误?

How to fix 'sudo: no tty present and no askpass program specified' error?

我正在尝试使用makefile编译一些源文件。在makefile中,有许多命令需要作为sudo运行。

当我从一个终端编译源代码时,一切正常,当第一次运行sudo命令等待密码时,Make暂停。输入密码后,恢复并完成。

但是我希望能够用netbeans编译源代码。因此,我启动了一个项目,并向netbeans展示了在哪里找到源代码,但是当我编译项目时,它给出了错误:

1
sudo: no tty present and no askpass program specified

第一次击中一个sudo命令。

我在互联网上查找了这个问题,找到的所有解决方案都指向一件事:禁用这个用户的密码。因为这里讨论的用户是根用户。我不想那样做。

还有其他解决办法吗?


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

1
sudo visudo

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

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

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

允许用户john使用sudo poweroffstartstop而不提示输入密码。

在屏幕的底部查看需要在visudo中使用的击键(顺便说一下,这不是vi)并在出现任何问题的第一个迹象时退出而不保存。健康警告:损坏此文件将产生严重后果,请小心编辑!


尝试:

  • 对所有命令使用NOPASSWD行,我的意思是:

    1
    jenkins ALL=(ALL) NOPASSWD: ALL
  • 将该行放在sudoers文件中所有其他行之后。

  • 这对我很有用(Ubuntu 14.04)。


    尝试:

    1
    ssh -t remotehost"sudo <cmd>"

    这将删除上述错误。


    在所有的选择之后,我发现:

    1
    sudo -S <cmd>

    The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device.

    来源

    上面的命令仍然需要输入密码。要手动删除输入密码,在Jenkins这样的情况下,此命令可以工作:

    1
    echo <password> | sudo -S <cmd>


    默认情况下,sudo将从所连接的终端读取密码。您的问题是,当从NetBeans控制台运行时,没有连接终端。因此,您必须使用另一种输入密码的方法:称为askpass程序。

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

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

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


    试试这个:

    1
    echo '' | sudo -S my_command


    对于Ubuntu 16.04用户

    您必须阅读一个文件:

    1
    cat /etc/sudoers.d/README

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

    1
    myuser  ALL=(ALL) NOPASSWD: ALL

    应该解决这个问题。

    不要忘记:

    1
    chmod 0440 /etc/sudoers.d/myuser


    如果你来这里是因为你不能在Ubuntu里用Windows10

  • 从Windows编辑/etc/hosts文件(带记事本),它将位于:%localappdata\lxss
    ootfs\etc
    ,添加127.0.0.1 WINDOWS8,这将消除它找不到主机的第一个错误。

  • 为了消除no tty present错误,总是执行sudo -S 操作。


  • 登录到Linux。按命令开火。小心点,因为编辑sudoer是一个危险的提议。

    1
    $ sudo visudo

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

  • 点评Defaults requiretty

    1
    # Defaults    requiretty
  • 转到文件结尾并添加

    1
    jenkins ALL=(ALL) NOPASSWD: ALL

  • 詹金斯:

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

    Eg:

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

    您可以使用mask password插件隐藏您的密码


    确保你的命令sudoing是你的PATH的一部分。

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

    您可以通过将命令添加到您的PATH或使用绝对路径(即

    sudo /usr/sbin/ipset

    而不是

    sudo ipset


    这对我很有用:

    1
    echo"myuser ALL=(ALL) NOPASSWD:ALL">> /etc/sudoers

    如果您的用户是"myuser"

    对于一个码头工人的形象,那就是:

    1
    RUN echo"myuser ALL=(ALL) NOPASSWD:ALL">> /etc/sudoers

    命令sudo失败,因为它试图提示根密码,并且没有分配伪tty(因为它是脚本的一部分)。

    您需要以根用户身份登录才能运行此命令,或者在您的/etc/sudoers
    中设置以下规则(或:sudo visudo中):

    1
    2
    # Members of the admin group may gain root privileges.
    %admin  ALL=(ALL) NOPASSWD:ALL

    然后确保您的用户属于admin组(或wheel组)。

    理想情况下(更安全),只将根权限限制在可以指定为%admin ALL=(ALL) NOPASSWD:/path/to/program的特定命令上。


    我想我可以帮助别人处理我的案件。

    首先,我修改了/etc/sudoers中的用户设置,参考上面的答案。但它仍然不起作用。

    1
    2
    myuser   ALL=(ALL) NOPASSWD: ALL
    %mygroup  ALL=(ALL:ALL) ALL

    在我的例子中,myusermygroup中。

    我不需要团体。所以,删除了那一行。

    (不应该像我一样删除那行,只标记评论。)

    1
    myuser   ALL=(ALL) NOPASSWD: ALL

    它起作用了!


    运行包含Jenkins中sudo命令的shell脚本可能无法按预期运行。要解决这个问题,请继续

    简单步骤:

  • 在基于Ubuntu的系统上,运行"$sudo-visudo"

  • 这将打开/etc/sudoers文件。

  • 如果您的Jenkins用户已经在该文件中,那么修改如下:
  • jenkins ALL=(ALL) NOPASSWD: ALL

  • 保存文件

  • 重新开始你的詹金斯工作

  • 您不应该再看到该错误消息:)


  • 我收到这个错误是因为我把我的用户限制为只有一个可执行文件"systemctl",并且错误地配置了visudo文件。

    以下是我的经历:

    1
    jenkins ALL=NOPASSWD: systemctl

    但是,您需要包括可执行文件的完整路径,即使默认情况下它在您的路径上,例如:

    1
    jenkins ALL=NOPASSWD: /bin/systemctl

    这允许我的Jenkins用户重新启动服务,但没有完全的根访问权限


    作为参考,如果其他人遇到同样的问题,我会在一个小时内遇到这个错误,因为我使用了nopasswd参数,所以不应该发生这种错误。

    我不知道的是,如果没有tty,并且用户尝试启动的命令不是/etc/sudoers文件中允许的命令的一部分,sudo可能会引发完全相同的错误消息。

    以下是我的问题文件内容的简化示例:

    1
    2
    3
    4
    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"(不存在tty且未指定askpass程序)。

    为什么?

    因为/etc/sudoers文件的行尾缺少逗号…

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


    当您试图从一些非shell脚本(如ruby程序的sudo ls(在backticks中))运行终端命令(需要根密码)时,也可能会出现此错误。在这种情况下,您可以使用Expect实用程序(http://en.wikipedia.org/wiki/expect)或其替代方法。例如,在Ruby中执行sudo ls而不获取sudo: no tty present and no askpass program specified时,可以运行以下命令:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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]。


    没有人告诉会导致此错误的原因,如果从一个主机迁移到另一个主机,请记住在sudoers文件中检查主机名:

    这是我的/etc/sudoers配置

    1
    2
    3
    User_Alias      POWERUSER = user_name
    Cmnd_Alias SKILL = /root/bin/sudo_auth_wrapper.sh
    POWERUSER hostname=(root:root) NOPASSWD: SKILL

    如果不匹配

    1
    2
    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

    它将弹出此错误:

    no tty present and no askpass program specified


    也许问题不清楚为什么没有答案与之匹配但我在尝试装载sshfs时收到了相同的错误消息,这需要sudo:该命令类似于:

    1
    sshfs -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" [email protected]:/var/www /mnt/sshfs/www

    通过添加选项-o debug

    1
    sshfs -o debug -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" [email protected]:/var/www /mnt/sshfs/www

    我对这个问题也有同样的看法:

    1
    sudo: no tty present and no askpass program specified

    因此,通过阅读其他答案,我开始在我的.server.tld上的/etc/sudoer.d/user中创建一个文件:

    1
    user ALL=NOPASSWD: /usr/lib/openssh/sftp-server

    现在我可以在不给用户太多额外权利的情况下安装驱动器。


    其他选项,不基于nopasswd:

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