【问题标题】:How to fix 'sudo: no tty present and no askpass program specified' error?如何修复“sudo:不存在 tty 且未指定 askpass 程序”错误?
【发布时间】:2014-03-06 17:55:57
【问题描述】:

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

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

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

sudo: no tty present and no askpass program specified

第一次遇到sudo 命令。

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

还有其他解决办法吗?

【问题讨论】:

  • 我正在编译一个玩具操作系统。我需要做一些事情来设置 VM,包括创建一个带引导扇区的虚拟硬盘。
  • 正如serverfault.com/a/597268 中指出的那样,sudo -n my-command 为我工作。嗨!
  • 请选择一个答案。
  • @andreyevbr 我不这么认为。 sudo: a password is required

标签: linux sudo tty


【解决方案1】:

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

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

为此,您必须使用环境变量SUDO_ASKPASS 或在sudo.conf 文件中指定要使用的程序(有关详细信息,请参阅man sudo)。

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

【讨论】:

  • 当前解决方案需要 gui。什么 askpass 程序在终端上运行。
  • @here: 好吧...如果您从终端运行 ssh,它会直接要求输入密码,您不需要任何特殊的...与运行 ssh 会话的终端不同?
  • 啊现在我看到 -A 不接受参数。 -A 需要环境 SUDO_ASKPASSsudo.conf 文件。在这种情况下,ssh host "export SUDO_ASKPASS=askpass;sudo -A cat /etc/passwd" 仍然可以使用基于终端的 askpass,但是 @chandru 在下面使用ssh -t ... 时要简洁得多
  • 使用 -A 有一些注意事项。首先,如果使用了 -A 并且没有设置 SUDO_ASKPASS,你会得到一个错误。其次,当使用 -A 时,ssh 不会使用缓存的凭据,它总是会请求密码。
  • 作为附录,您可能想看看我关于密码输入程序的笔记...ict.griffith.edu.au/anthony/info/crypto/passwd_input.txt
【解决方案2】:

试试:

ssh -t remotehost "sudo <cmd>"

这将消除上述错误。

【讨论】:

  • -t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machine 另见:sudo-no-tty-present-and-no-askpass-program-specified 另外sudo -A 允许设置sudo askpass 程序,但我只看到GUI。有谁知道允许ssh remotehost sudo -A askpass 的askpass 吗?
  • 更正,sudo-A 不接受参数,而是需要环境SUDO_ASKPASSsudo.conf 所以ssh remotehost sudo -A command 仍然可以工作。仍然对基于终端的 askpass 程序感到好奇。
  • 这对我不起作用(大概是因为我从脚本调用 ssh),给我错误Pseudo-terminal will not be allocated because stdin is not a terminal. :(
  • 非常适合我。谢谢!
  • 这不能回答问题。
【解决方案3】:

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

sudo visudo

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

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

例如

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

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

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

【讨论】:

  • 是的,sudoers man page 让我看到了 sudo 的实际使用方式。
  • visudo 应该在您的环境配置使用的任何 EDITOR 中打开,这很可能是(并且应该是 ^_^)vi。
  • 确保 NOPASSWD 数学运算行位于任何其他可能匹配但没有 NOPASSWD 标志的 sudo 行之后(例如 %wheel)。
  • 我不能“sudo visudo”,因为我一开始就不能 sudo!
  • 考虑将文件添加到 /etc/sudoers.d 并保持 visudo 文件不变。
【解决方案4】:

试试:

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

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

这对我有用(Ubuntu 14.04)。

【讨论】:

  • 我首先在其他用户配置之后添加了该行,但它仅在 lubuntu 14.04.1 上的文件中作为绝对最后一行放置时才有效。
  • 第二部分是我需要的解决方案。现有的配置行(用于轮组)也与我的 sudo 命令匹配,但没有 NOPASSWD: 条目。将我的新行放在优先级之后,不允许对我需要的特定命令使用密码。
  • 正如@user77115 所提到的,这仅在您将其放在 sudoers 文件的最后一行时才有效,即使在 Ubuntu 16.04 中也是如此。附带说明一下,为 jenkins 授予所有命令的 sudo 权限是一个相当大的安全问题。考虑包装您的 jenkins 脚本并仅授予对特定命令的访问权限,例如:jenkins ALL=(ALL) NOPASSWD: /var/lib/jenkins/wrapper_script
  • jenkins 只是一个用户名?它必须是主机用户的用户名?如果主机上的用户名与远程服务器上的用户名匹配怎么办?
  • 这是詹金斯特有的,看起来stackoverflow.com/a/22651598/1041319 是更通用的解决方案。
【解决方案5】:

当您尝试从某个非 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

[这使用了 Expect TCL 扩展的替代方法之一:ruby_expect gem]。

【讨论】:

    【解决方案6】:

    命令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 的特定命令

    【讨论】:

    • 我知道,这样做更安全。虽然,我在sudoers 文件apache ALL = (ALL) NOPASSWD:/usr/share/apache-tomcat-7.0.61/bin/startup.sh 中编写了以下命令,但它对我不起作用。它给出了以下错误sudo: &gt;&gt;&gt; /etc/sudoers: syntax error near line 120 &lt;&lt;&lt; sudo: parse error in /etc/sudoers near line 120 sudo: no valid sudoers sources found, quitting sudo: unable to initialize policy plugin
    • 顺便说一句,它运行良好apache ALL=(ALL) NOPASSWD: ALL 但存在安全风险。 :)
    【解决方案7】:

    试试这个:

    echo '' | sudo -S my_command
    

    【讨论】:

    • 它对我有用,但谁能解释为什么它有帮助?
    • @ololobus 你发送一个空密码到第一个提示输入密码
    • 成功了!评分较高的答案都没有为我解决。
    • 返回以下错误:[sudo] password for alper: Sorry, try again. [sudo] password for alper: sudo: 1 incorrect password attempt @sNICkerssss
    • 运行 PHP 脚本时无法在 Centos 6 上运行 shell_exec 另一个脚本 - 它要求 apache 用户密码。
    【解决方案8】:

    作为参考,以防其他人遇到同样的问题,我在一个很好的时间里遇到了这个错误,因为我使用的是 NOPASSWD 参数,所以这个错误不应该发生。

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

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

    bguser ALL = NOPASSWD: \
        command_a arg_a, \
        command_b arg_b \
        command_c arg_c
    

    当 bguser 尝试在没有任何 tty 的情况下启动“sudo command_b arg_b”(bguser 被用于某些守护进程)时,他将遇到错误“没有 tty 存在并且没有指定 askpass 程序”。

    为什么?

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

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

    【讨论】:

      【解决方案9】:

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

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

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

      sudo /usr/sbin/ipset

      而不是

      sudo ipset

      【讨论】:

      • 这实际上是为我分叉的。在sudoers %sitd ALL=(lamparna) NOPASSWD: /usr/bin/git_push_to_lamparna.sh, /usr/bin/git 和使用sudo -u lamparna git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.git 在git post-update 挂钩返回no tty,但使用sudo -u lamparna /usr/bin/git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.git 无需密码即可工作。
      【解决方案10】:

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

      【讨论】:

        【解决方案11】:

        登录到您的 Linux。触发以下命令。小心,因为编辑 sudoer 是一个冒险的提议。

        $ sudo visudo
        

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

        1. 注释掉Defaults requiretty

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

          jenkins ALL=(ALL) NOPASSWD: ALL
          

        【讨论】:

          【解决方案12】:

          其他选项,不基于 NOPASSWD:

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

          【讨论】:

            【解决方案13】:

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

            sudo -S <cmd>
            

            -S (stdin) 选项使 sudo 从标准输入而不是终端设备读取密码。

            Source

            以上命令仍然需要输入密码。要手动删除输入密码,在 jenkins 等情况下,此命令有效:

            echo <password> | sudo -S <cmd> 
            

            【讨论】:

            • 这似乎解决了我的问题。但是使用这个命令有什么副作用吗?
            • sudo -S &lt;command&gt;- true 恰好是返回退出代码 0 的虚拟命令(false 是返回 1 的命令)。谢谢,这是一个真正的答案,因为所有其他人都希望“sudo”能够工作!
            • -S:将提示写入标准错误并从标准输入读取密码,而不是使用终端设备。密码后面必须跟一个换行符。
            • 这可以立即工作,并且可能会在超时之前让 sudo 工作,但不能解决可能存在的任何潜在问题,并且问题可能会再次出现。
            • 我不知道它是否工作但它显示Password: 然后什么也没有发生。我无法输入密码。
            【解决方案14】:

            如果你因为无法在 Windows10 自带的 Ubuntu 中使用 sudo 而来到这里

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

            2. 要消除no tty present 错误,请始终执行sudo -S &lt;command&gt;

            【讨论】:

            【解决方案15】:

            我收到此错误是因为我将我的用户限制为只有一个可执行的“systemctl”并且错误配置了 visudo 文件。

            这就是我所拥有的:

            jenkins ALL=NOPASSWD: systemctl
            

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

            jenkins ALL=NOPASSWD: /bin/systemctl
            

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

            【讨论】:

              【解决方案16】:

              在詹金斯

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

              例如:-

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

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

              【讨论】:

                【解决方案17】:

                对于 Ubuntu 16.04 用户

                有一个文件你必须阅读:

                cat /etc/sudoers.d/README
                

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

                myuser  ALL=(ALL) NOPASSWD: ALL
                

                应该解决问题。

                别忘了:

                chmod 0440 /etc/sudoers.d/myuser
                

                【讨论】:

                • 不错。比流行的解决方案更清洁。
                • 不要盲目跟风。我按照此处所述在 /etc/sudoers.d 中创建了一个新文件,最终无法再使用 sudo .. 不得不通过恢复模式删除该文件。
                【解决方案18】:

                这对我有用:

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

                您的用户是“myuser”

                对于 Docker 映像,这只是:

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

                【讨论】:

                  【解决方案19】:

                  当我尝试挂载需要 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
                  

                  现在我可以挂载驱动器,而无需给我的用户太多额外的权利。

                  【讨论】:

                    【解决方案20】:

                    运行其中包含来自 jenkins 的 sudo 命令的 shell 脚本可能无法按预期运行。要解决此问题,请遵循

                    简单的步骤:

                    1. 在基于 ubuntu 的系统上,运行“$ sudo visudo”

                    2. 这将打开 /etc/sudoers 文件。

                    3. 如果您的 jenkins 用户已经在该文件中,则修改为如下所示:

                    jenkins ALL=(ALL) NOPASSWD: ALL

                    1. 保存文件

                    2. 重新启动您的詹金斯工作

                    3. 您应该不会再次看到该错误消息 :)

                    【讨论】:

                      【解决方案21】:

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

                      首先,我参考上述答案更改了/etc/sudoers 中的用户设置。但它仍然没有工作。

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

                      就我而言,myusermygroup 中。

                      而且我不需要组。所以,删除了那行。

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

                      myuser   ALL=(ALL) NOPASSWD: ALL
                      

                      有效!

                      【讨论】:

                        【解决方案22】:

                        虽然这个问题很老,但它仍然与我或多或少最新的系统相关。在启用 sudo 的调试模式(/etc/sudo.conf 中的Debug sudo /var/log/sudo_debug all@info)后,我被指向 /dev:“/dev is world writable”。因此,您可能需要检查 tty 文件权限,尤其是 tty/pts 节点所在目录的权限。

                        【讨论】:

                          【解决方案23】:

                          我能够完成这项工作,但请确保正确执行这些步骤。 这适用于遇到导入错误的任何人。

                          Step1:检查文件和文件夹是否有执行权限问题。 Linux用户使用:

                          chmod 777 filename
                          

                          Step2:检查哪个用户有权限执行。

                          Step3:打开终端输入此命令。

                          sudo visudo
                          

                          将此行添加到下面的代码中

                          www-data ALL=(ALL) NOPASSWD:ALL
                          nobody ALL=(ALL) NOPASSWD:/ALL
                          

                          这是授予执行脚本的权限并允许它使用所有库。用户通常是“nobody”或“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
                          

                          谢谢!

                          【讨论】:

                          • chmod 777 危及您系统的安全性;它甚至可以让像nobody 这样完全不受信任的用户运行一个可执行文件,然后您可以使用sudo 运行该可执行文件。它应该从不被推荐,并且运行它的任何系统都应该被认为是受损和不可信的。
                          • -1。永远不要在打算与sudo 一起使用的可执行文件上使用 chmod 777。这完全破坏了sudo 和root 访问本身的目的,因为正如@CharlesDuffy 所说,每个人都可以在不使用sudo 的情况下访问它
                          • 明确地说,777 不仅让每个人访问可执行文件,它还允许每个人更改可执行文件。例如,将其替换为带有病毒或蠕虫的东西?当然,它设置为世界可写,为什么不呢?!
                          【解决方案24】:

                          1 打开 /etc/sudoers

                          输入sudo vi /etc/sudoers。这将以编辑模式打开您的文件。

                          2 添加/修改linux用户

                          查找 Linux 用户的条目。如果找到,请按以下方式修改或添加新行。

                          <USERNAME> ALL=(ALL) NOPASSWD: ALL
                          

                          3 保存并退出编辑模式

                          【讨论】:

                            【解决方案25】:

                            如果您将此行添加到您的/etc/sudoers(通过visudo),它将解决此问题而无需禁用输入您的密码,并且当sudo -S 的别名不起作用时(脚本调用sudo) :

                            Defaults visiblepw
                            

                            当然,请自己阅读manual 以了解它,但我认为对于我通过lxc exec instance -- /bin/bash 在 LXD 容器中运行的用例而言,它非常安全,因为它不会通过网络打印密码。

                            【讨论】:

                              【解决方案26】:

                              使用管道:

                              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"
                              

                              【讨论】:

                                【解决方案27】:

                                我在 Ubuntu 20.04 服务器上工作时遇到了这个问题。

                                我试图从远程计算机运行 sudo 命令以将应用程序部署到服务器。但是,当我运行命令时,我得到了错误:

                                sudo: no tty present and no askpass program specified
                                The remote script failed with exit code 1
                                

                                这是我修复它的方法

                                问题是由于执行了一个尝试请求密码的sudo 命令,但sudo 无权访问tty 来提示用户输入密码。由于找不到ttysudo 回退到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
                                

                                保存更改并退出文件。

                                如需更多帮助,请阅读此链接中的资源:@​​987654321@

                                就是这样。

                                我希望这会有所帮助

                                【讨论】:

                                  【解决方案28】:

                                  问题的解决办法是

                                  如果您在 Jenkins 实例之外的任何其他地方遇到此问题,请从第二步开始执行此操作。第一步是针对 Jenkins 实例有问题的用户。

                                  转到 Google Cloud Console 的 Jenkins 实例。 输入命令 须藤苏

                                  visudo -f /etc/sudoers

                                  在末尾添加以下行

                                  詹金斯 ALL= NOPASSWD: ALL

                                  结帐here 了解此问题的根本原因

                                  【讨论】:

                                    【解决方案29】:

                                    以下操作适用于 ubuntu20

                                    1. 编辑 /etc/sudoers
                                    visudo
                                    

                                    vi /etc/sudoers
                                    
                                    1. 添加以下内容
                                    userName   ALL=(ALL) NOPASSWD: ALL
                                    %sudo   ALL=(ALL:ALL) NOPASSWD:ALL
                                    

                                    【讨论】:

                                    • 这是一个非常糟糕的答案,不应该使用。这将授予对系统中sudo 的访问权限,无需密码。
                                    【解决方案30】:

                                    我不确定这是否是最近的更改,但我刚刚遇到了这个问题,sudo -S 为我工作。

                                    【讨论】:

                                      猜你喜欢
                                      • 2021-11-02
                                      • 2017-02-24
                                      • 1970-01-01
                                      • 2016-11-04
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多