如何修复“ sudo:不存在tty且未指定AskPass程序”错误?


438

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

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

但是我希望能够在NetBeans中编译源代码。因此,我启动了一个项目,并向netbeans展示了在哪里可以找到源代码,但是当我编译该项目时会出现错误:

sudo: no tty present and no askpass program specified

第一次命中sudo命令。

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

还有其他解决方案吗?


3
我正在编译一个玩具操作系统。我需要做一些事情来设置虚拟机,包括用启动扇区创建一个虚拟硬盘。
hebbo 2014年


正如serverfault.com/a/597268中指出的那样,sudo -n my-command为我工作。嗨!
andreyevbr '17

1
请选择一个答案。

1
@andreyevbr我不这么认为。sudo: a password is required

Answers:


260

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

sudo visudo

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

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

例如

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

将允许用户johnsudo poweroffstartstop不会提示您输入密码。

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


4
是的,sudoers手册页使我对实际上应该如何使用sudo睁开了眼睛。
斯宾塞·威廉姆斯

6
visudo应该在您的环境配置为使用的任何EDITOR中打开,这很可能是(并且应该是^ _ ^)vi。
马特·斯泰尔斯

8
确保NOPASSWD数学线在任何可能匹配且没有NOPASSWD标志的其他sudo线之后(如%wheel)。
安东尼

27
我不能“ sudo visudo”,因为我不能首先使用sudo!
古巴创'16

8
考虑将文件添加到/etc/sudoers.d并保持visudo文件不变。
xlttj

183

尝试:

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

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

这对我有用(Ubuntu 14.04)。


13
我首先在其他用户配置之后添加了该行,但是只有当在lubuntu 14.04.1。上的文件中绝对最后一行放置时,它才起作用。
user77115

第二部分是我所需要的解决方案。现有的配置行(用于车轮组)也与我的sudo命令匹配,但没有NOPASSWD:条目。在将新行放在优先位置之后,将其放置在新行中,不允许我需要的特定命令使用密码。
安东尼

5
正如@ user77115所提到的,只有在将它放在sudoers文件的最后一行时才起作用,即使在Ubuntu 16.04中也是如此。附带说明一下,为jenkins赋予所有命令sudo权限是一个非常大的安全问题。考虑包装您的jenkins脚本,只允许访问特定命令,例如: jenkins ALL=(ALL) NOPASSWD: /var/lib/jenkins/wrapper_script
ivandov

jenkins只是一个用户名?它必须是来自主机的用户的用户名吗?如果主机上的用户名与远程服务器上的用户名匹配怎么办?
mrgloom

这是詹金斯特定的,看起来stackoverflow.com/a/22651598/1041319是更通用的解决方案。
arntg

167

尝试:

ssh -t remotehost "sudo <cmd>"

这将消除上述错误。


7
-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machine另请参见:sudo-no-tty-present-and-askpass-program-specifiedsudo -A允许设置一个sudoAskPass程序,但我只看到GUI。有谁知道一个通​​行证允许ssh remotehost sudo -A askpass吗?
这里

1
更正,-Afor sudo不接受参数,而是需要环境SUDO_ASKPASSsudo.conf 所以So ssh remotehost sudo -A command仍然可以工作。仍然对基于终端的AskPass程序感到好奇。
在这里

7
这对我不起作用(大概是因为我从脚本中调用ssh),给了我错误Pseudo-terminal will not be allocated because stdin is not a terminal.:(
knocte

对我来说很棒。谢谢!
xfra35

1
这不能回答问题。
bschlueter '17

125

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

sudo -S <cmd>

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

资源

上面的命令仍然需要输入密码。要删除手动输入的密码(例如jenkins),此命令有效:

echo <password> | sudo -S <cmd> 

这似乎解决了我的问题。但是使用此命令是否有副作用?
齐晓东

3
sudo -S <command>- true恰好是返回退出代码为0的虚拟命令(false是返回1的命令)。谢谢,这是一个真实的答案,因为其他所有人都希望“ sudo”能够正常工作!
亚当·普洛彻

1
-S:将提示写入标准错误,并从标准输入中读取密码,而不使用终端设备。密码后必须带有换行符。
fileinster

这可以立即生效,并且可能会在超时之前使sudo工作,但无法解决可能存在的任何潜在问题,并且问题可能会再次出现。
nealmcb

我不知道它是否有效,但显示Password:没有任何反应。我无法输入密码。

43

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

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

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

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


当前的解决方案需要gui。什么askpass程序在终端上工作。
这里

@here:嗯...如果您从终端运行ssh,它将直接要求输入密码,您不需要任何特殊的操作...或者您是在询问从另一终端请求密码而不是从另一终端请求密码运行ssh会话?
rodrigo 2014年

1
嗯,现在我看到这-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将不使用缓存的凭据,它将始终请求密码。
安东尼

作为adendum你可能想看看我的笔记上的密码输入程序... ict.griffith.edu.au/anthony/info/crypto/passwd_input.txt
安东尼

26

对于Ubuntu 16.04用户

您必须阅读以下文件:

cat /etc/sudoers.d/README

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

myuser  ALL=(ALL) NOPASSWD: ALL

应该解决问题。

不要忘记:

chmod 0440 /etc/sudoers.d/myuser

真好 比流行的解决方案更清洁。
Paul Praet

2
不要盲目跟随。如此处所述,我在/etc/sudoers.d中创建了一个新文件,最终无法使用sudo了..必须通过恢复模式删除该文件。
斯蒂安

25

试试这个:

echo '' | sudo -S my_command

它对我有用,但是谁能解释为什么有帮助?
ololobus

@ololobus,您将空密码发送到第一个提示输入密码
Nikita Koksharov

工作了!评分较高的答案都没有为我解决。
drerD

1
它返回以下错误:[sudo] password for alper: Sorry, try again. [sudo] password for alper: sudo: 1 incorrect password attempt @sNICkerssss
alper

16

如果有机会您来到这里是因为您无法在Windows10随附的Ubuntu中进行sudo

  1. 从Windows(使用记事本)编辑/ etc / hosts文件,该文件位于:%localappdata\lxss\rootfs\etc,add 127.0.0.1 WINDOWS8,这将消除找不到主机的第一个错误。

  2. 要摆脱no tty present错误,请务必这样做sudo -S <command>


2
感谢您为来这里的人提供与问题描述无关但与问题标题相匹配的答案。+1
Jayant Bhawal '16


15

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

$ sudo visudo

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

  1. 注释掉 Defaults requiretty

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

    jenkins ALL=(ALL) NOPASSWD: ALL
    


11

这为我工作:

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

您的用户是“ myuser”

对于Docker映像,将只是:

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

9

确保您要sudo输入的命令是您的一部分PATH

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

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

sudo /usr/sbin/ipset

代替

sudo ipset


1
这实际上是为我分叉的。在git post-update钩返回中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.gitno ttysudo -u lamparna /usr/bin/git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.git
福田2015年

7

命令 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: >>> /etc/sudoers: syntax error near line 120 <<< sudo: parse error in /etc/sudoers near line 120 sudo: no valid sudoers sources found, quitting sudo: unable to initialize policy plugin
muaaz

1
顺便说一句,它运作良好,apache ALL=(ALL) NOPASSWD: ALL但存在安全风险。:)
muaaz

6

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

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

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

就我而言,myuser在中mygroup

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

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

myuser   ALL=(ALL) NOPASSWD: ALL

有用!


3

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

简单步骤:

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

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

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

jenkins ALL =(全部)NOPASSWD:全部

  1. 保存文件

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

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


3

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

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

chmod 777 filename

步骤2:检查哪个用户有权执行它。

第三步:打开终端输入此命令。

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

谢谢!


2

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


2

供参考,以防万一其他人遇到相同的问题,我被困在一个好时机中,因为我正在使用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执行,等等。”)


2

我收到此错误消息是因为我将用户限制为仅一个可执行文件'systemctl',并且对visudo文件进行了错误配置。

这是我所拥有的:

jenkins ALL=NOPASSWD: systemctl

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

jenkins ALL=NOPASSWD: /bin/systemctl

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


1

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


1

其他选项(不基于NOPASSWD):

  • 以root特权((sudo netbeans)或类似的特权)启动Netbeans,这大概会以root生成构建过程,因此sudo将自动成功。
  • 使您需要执行suexec的操作-使它们由root拥有,并将mode设置为4755。(当然,这将使计算机上的任何用户都可以运行它们。)那样,它们根本不需要sudo。
  • 使用启动扇区创建虚拟硬盘文件完全不需要sudo。文件只是文件,引导扇区只是数据。除非您执行高级设备转发,否则即使虚拟机也不一定需要root用户。

1

也许这个问题尚不清楚,为什么没有答案与之匹配,但是当我尝试挂载需要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

因此,通过阅读其他答案,我可以使用以下命令在/etc/sudoer.d/usermy.server.tld中创建文件:

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

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


0

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


0

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

Defaults visiblepw

当然,请您自己阅读该手册以理解它,但是对于我的用例来说,lxc exec instance -- /bin/bash它是通过LXD容器运行的,因此非常安全,因为它没有通过网络打印密码。


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"

-1

1个打开的/ etc / sudoers

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

2添加/修改linux用户

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

<USERNAME> ALL=(ALL) NOPASSWD: ALL

3保存并退出编辑模式

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.