首页 文章

如何修复'sudo: no tty present and no askpass program specified'错误?

提问于
浏览
299

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

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

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

sudo: no tty present and no askpass program specified

它第一次命中 sudo 命令 .

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

还有其他解决方案吗?

21 回答

  • 7

    尝试:

    • 对所有命令使用 NOPASSWD 行,我的意思是:
    jenkins ALL=(ALL) NOPASSWD: ALL
    
    • 将该行放在 sudoers 文件中的所有其他行之后 .

    这对我有用(Ubuntu 14.04) .

  • 8

    授予用户使用该命令而不提示输入密码应该可以解决问题 . 首先打开一个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 - 并且在没有保存时出现任何问题的第一个迹象 . Health 警告:破坏此文件会产生严重后果,请谨慎编辑!

  • 0

    尝试:

    ssh -t remotehost "sudo <cmd>"
    

    这将消除上述错误 .

  • 1

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

    sudo -S <cmd>
    

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

    Source

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

    echo <password> | sudo -S <cmd>
    
  • 7

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

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

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

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

  • 1

    试试这个:

    echo '' | sudo -S my_command
    
  • 135

    如果你有机会来到这里,因为你不能在Windows10附带的Ubuntu内部进行sudo

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

    • 要摆脱 no tty present 错误,请始终执行 sudo -S <command>

  • 15

    对于Ubuntu 16.04用户

    您需要阅读一个文件:

    cat /etc/sudoers.d/README
    

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

    myuser  ALL=(ALL) NOPASSWD: ALL
    

    应该解决这个问题 .

    不要忘记:

    chmod 0440 /etc/sudoers.d/myuser
    
  • 189

    登录你的linux . 按照命令触发 . 要小心,因为编辑sudoer是一个冒险的主张 .

    $ sudo visudo
    

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

    • 评论 Defaults requiretty
    # Defaults    requiretty
    
    • 转到文件末尾并添加
    jenkins ALL=(ALL) NOPASSWD: ALL
    
  • 19

    在詹金斯:

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

    例如:-

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

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

  • 1

    确保你 sudo 的命令是 PATH 的一部分 .

    如果您有一个(或多个但不是ALL)命令 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”的地方

    对于Docker镜像,那只是:

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

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

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

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

    然后确保您的用户属于 admin group(或 wheel ) .

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

  • 14

    从jenkins运行包含sudo命令的shell脚本可能无法按预期运行 . 要解决此问题,请按照以

    简单步骤:

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

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

    • 如果你的詹金斯用户已经在该文件中,然后修改为如下所示:

    jenkins ALL =(全部)NOPASSWD:全部

    • 保存文件

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

    • 你不应该再次看到错误信息:)

  • 0

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

  • 12

    作为参考,如果其他人遇到相同的问题,我在一个很好的时间内遇到了这个错误,这不应该发生,因为我使用的是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 and no askpass program specified” .

    为什么?

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

    (我甚至想知道这是否是预期的行为而不是sudo中的错误,因为这种情况的正确错误消息应该是"Sorry, user bguser is not allowed to execute etc.")

  • 127

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

    这就是我的所作所为:

    jenkins ALL=NOPASSWD: systemctl
    

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

    jenkins ALL=NOPASSWD: /bin/systemctl
    

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

  • 5

    我想我可以用我的案子来帮助别人 .

    首先,我参考上面的答案更改了 /etc/sudoers 中的用户设置 . 但它仍然没有奏效 .

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

    在我的情况下, myusermygroup .

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

    (不应该像我一样删除那行,只标记注释 . )

    myuser   ALL=(ALL) NOPASSWD: ALL
    

    有用!

  • 2

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

  • 37

    也许问题不清楚为什么没有答案匹配它但我在尝试安装需要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
    

    现在我能够安装驱动器而不会给我的用户额外的权利 .

  • -1

    其他选项,不基于NOPASSWD:

    • 使用root权限((sudo netbeans)或类似的)启动Netbeans,这可能会使用root分叉构建过程,因此sudo将自动成功 .

    • 进行suexec所需的操作 - 让root拥有它们,并将模式设置为4755.(这当然会让机器上的任何用户运行它们 . )这样,它们根本不需要sudo .

    • 使用bootsectors创建虚拟硬盘文件不应该是root用户,除非你进行高级设备转发 .

相关问题