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

时间:2014-02-09 13:32:30

标签: linux sudo tty

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

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

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

sudo: no tty present and no askpass program specified

第一次点击sudo命令。

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

还有其他解决方案吗?

29 个答案:

答案 0 :(得分:204)

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

答案 1 :(得分:154)

尝试:

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

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

  3. 这对我有用(Ubuntu 14.04)。

答案 2 :(得分:139)

尝试:

ssh -t remotehost "sudo <cmd>"

这将消除上述错误。

答案 3 :(得分:96)

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

let textfields = view.subviews.filter({$0.isKindOfClass(UITextField)})
  

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

Source

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

sudo -S <cmd>

答案 4 :(得分:39)

默认情况下,

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

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

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

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

答案 5 :(得分:21)

试试这个:

echo '' | sudo -S my_command

答案 6 :(得分: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

答案 7 :(得分:15)

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

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

  2. 要摆脱no tty present错误,请始终sudo -S <command>

答案 8 :(得分:13)

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

$ sudo visudo

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

  1. 评论Defaults requiretty

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

    jenkins ALL=(ALL) NOPASSWD: ALL
    

答案 9 :(得分:9)

在Jenkins

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

例如: -

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

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

答案 10 :(得分:8)

这对我有用:

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

您的用户是“myuser”

对于Docker镜像,它只是:

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

答案 11 :(得分:8)

确保您sudo PATH的命令属于sudoers

如果您有一个(或多个,但不是全部)命令sudo: no tty present and no askpass program specified条目,当命令不属于您的路径时(以及完整路径),您将获得PATH未指定)。

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

sudo ipset

而不是

<link id="myStyleSheet" href="stylesheet1.css" rel="stylesheet" type="text/css"> I put an id in stylesheet <div id="changeLook"> Change style: <select id="changeStyle" onchange="changeStyleFunction()"> <option value="stylesheet1.css">Style 1</option> <option value="stylesheet2.css">Style 2</option> <option value="stylesheet3.css">Style 3</option> <option value="stylesheet4.css">Style 4</option> </select> </div>

答案 12 :(得分:5)

命令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

答案 13 :(得分:3)

我认为我可以为某人提供帮助。

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

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

就我而言,myusermygroup中。

我不需要团体。因此,删除该行。

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

myuser   ALL=(ALL) NOPASSWD: ALL

有效!

答案 14 :(得分:2)

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

简单步骤:

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

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

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

jenkins ALL =(全部)NOPASSWD:全部

  1. 保存文件

  2. 重新开始您的詹金斯工作

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

答案 15 :(得分:1)

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

Defaults visiblepw

当然,请您自己阅读manual才能理解它,但是我认为通过lxc exec instance -- /bin/bash在LXD容器中运行的用例是非常安全的,因为它不会通过网络打印密码

答案 16 :(得分:1)

我在 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

保存更改并退出文件。

如需更多帮助,请阅读此链接中的资源:sudo: no tty present and no askpass program specified

仅此而已。

我希望这会有所帮助

答案 17 :(得分:1)

我收到此错误是因为我将用户限制为仅限一个可执行文件&#39; systemctl&#39;并错误配置了visudo文件。

这就是我所拥有的:

jenkins ALL=NOPASSWD: systemctl

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

jenkins ALL=NOPASSWD: /bin/systemctl

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

答案 18 :(得分:1)

作为参考,如果其他人遇到同样的问题,我会在一个很好的时间内遇到这个错误,因为我使用的是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”。

为什么?

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

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

答案 19 :(得分:1)

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

答案 20 :(得分:0)

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

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

答案 21 :(得分:0)

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

所以这是我的/ etc / sudoers config

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程序

答案 22 :(得分:0)

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

答案 23 :(得分:0)

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

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

chmod 777 filename

步骤2 :检查哪个用户有权执行该操作。

Step3 :打开终端,键入以下命令。

sudo visudo

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

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

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

谢谢!

答案 24 :(得分:0)

1打开/ etc / sudoers

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

2添加/修改linux用户

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

<USERNAME> ALL=(ALL) NOPASSWD: ALL

3保存并退出编辑模式

答案 25 :(得分:0)

使用管道:

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"

答案 26 :(得分:0)

问题的解决方法是

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

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

visudo -f /etc/sudoers

在最后添加以下行

詹金斯所有= NOPASSWD:所有

检查 here 以了解此问题的根本原因

答案 27 :(得分:-1)

其他选项,不基于NOPASSWD:

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

答案 28 :(得分:-1)

以下操作适用于 ubuntu20

  1. 编辑 /etc/sudoers
visudo

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