如何修复'sudo:没有tty present和没有askpass程序指定'错误呢?

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

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

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

sudo: no tty present and no askpass program specified

它第一次碰到sudo命令。

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

还有其他解决办法吗?

960722 次浏览

默认情况下,sudo将从附加的终端读取密码。您的问题是,从netbeans控制台运行时没有附加终端。所以你必须使用另一种方法来输入密码:这被称为askpass程序。

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

为了做到这一点,你必须指定要使用的程序,可以使用环境变量SUDO_ASKPASS,也可以在sudo.conf文件中指定(详情请参阅man sudo)。

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

试一试:

ssh -t remotehost "sudo <cmd>"

这将消除上述错误。

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

sudo visudo

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

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

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

将允许用户john在不提示输入密码的情况下执行poweroffstartstop

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

试一试:

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

    jenkins ALL=(ALL) NOPASSWD: ALL
    
  2. Put the line after all other lines in the sudoers file.

That worked for me (Ubuntu 14.04).

当你试图从一些非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

[这使用了预计 TCL扩展的一个替代方案:ruby_expect gem]。

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

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

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

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

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

试试这个:

echo '' | sudo -S my_command

作为参考,以防其他人遇到同样的问题,我在一个小时内被这个错误卡住了,因为我使用的是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被用于某些守护进程)时,他将遇到错误“no tty present and no askpass program specified”。

为什么?

因为在/etc/sudoers文件的末尾缺少一个逗号…

(我甚至怀疑这是否是预期的行为,而不是sudo中的错误,因为这种情况下正确的错误消息应该是“对不起,用户bguser不允许执行等”)

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

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

你可以通过将命令添加到PATH或使用绝对路径调用它来修复它。

sudo /usr/sbin/ipset

而不是

sudo ipset

没有人告诉会导致这个错误的原因,如果从一个主机迁移到另一个主机,请记住在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 present,也没有指定askpass程序

登录到您的linux。执行以下命令。要小心,因为编辑sudoer是一个有风险的命题。

$ sudo visudo

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

  1. 注释掉Defaults requiretty

    # Defaults    requiretty
    
  2. Go to the end of the file and add

    jenkins ALL=(ALL) NOPASSWD: ALL
    

其他选项,不基于NOPASSWD:

  • 以root权限启动Netbeans ((sudo Netbeans)或类似权限),这可能会用root派生构建过程,因此sudo将自动成功。
  • 执行您需要执行的suexec操作——使它们由root拥有,并将mode设置为4755。(当然,这将允许机器上的任何用户运行它们。)那样的话,他们就不需要sudo了。
  • 用引导扇区创建虚拟硬盘文件根本不需要sudo。文件只是文件,引导扇区只是数据。即使是虚拟机也不一定需要root,除非您执行高级设备转发。

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

sudo -S <cmd>

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

Source .

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

echo <password> | sudo -S <cmd>

如果你碰巧来这里是因为你不能在Windows10自带的Ubuntu中sudo

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

  2. 要消除no tty present错误,请始终执行sudo -S <command>

我得到这个错误是因为我限制了我的用户只有一个可执行的“systemctl”,并错误地配置了visudo文件。

以下是我得到的答案:

jenkins ALL=NOPASSWD: systemctl

然而,你需要包括可执行文件的完整路径,即使它默认在你的路径上,例如:

jenkins ALL=NOPASSWD: /bin/systemctl

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

在詹金斯:

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

: -

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

你可以使用掩码密码插件来隐藏你的密码

适用于Ubuntu 16.04用户

有一个文件你必须阅读:

cat /etc/sudoers.d/README

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

myuser  ALL=(ALL) NOPASSWD: ALL

应该能解决这个问题。

不要忘记:

chmod 0440 /etc/sudoers.d/myuser

这招对我很管用:

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

你的用户是myuser

对于Docker映像,这将是:

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

当我试图挂载sshfs时,我有同样的错误消息,需要sudo:命令是这样的:

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

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

运行包含来自jenkins的sudo命令的shell脚本可能无法按预期运行。要解决这个问题,请遵循以下步骤

简单的步骤:

  1. 在基于ubuntu的系统中,运行" $ sudo visudo "

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

  3. 如果jenkins用户已经在该文件中,那么修改如下:

NOPASSWD:所有

  1. 保存文件

  2. 重新开始你的jenkins工作

  3. 你不应该再看到错误信息:)

我想我能帮到别人。

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

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

在我的例子中,myusermygroup中。

我不需要小组。删除了这一行。

(不应该像我一样删除这一行,只是标记注释。)

myuser   ALL=(ALL) NOPASSWD: ALL

它的工作原理!

虽然这个问题很老了,但它仍然与我的最新系统相关。在启用sudo (Debug sudo /var/log/sudo_debug all@info in /etc/sudo.conf)的调试模式后,我被指向/dev: "/dev is world writable"。所以你可能需要检查tty文件权限,特别是tty/pts节点所在目录的那些。

我能够做到这一点,但请确保正确地遵循步骤。 这是为任何得到导入错误的人准备的

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

chmod 777 filename

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

步骤3:打开终端类型此命令。

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中运行的所有进程。

< p > 附加元件: 使用下面的代码检查系统中的用户

cut -d: -f1 /etc/passwd

谢谢你!

打开/etc/sudoers

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

2添加/修改linux用户

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

<USERNAME> ALL=(ALL) NOPASSWD: ALL

3保存并退出编辑模式

如果你将这一行添加到你的/etc/sudoers中(通过visudo),它将修复这个问题,而不必禁用输入密码,并且当sudo -S的别名不起作用时(脚本调用sudo):

Defaults visiblepw

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

使用管道:

echo your_pswd | sudo -S your_cmd

使用here文档:

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"

我在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:没有tty,也没有指定askpass程序

这是所有。

我希望这对你们有帮助

这个问题的解决办法是

如果您在Jenkins实例之外的任何地方遇到了这个问题,请从第二步开始。第一步是针对遇到Jenkins实例问题的用户。

进入谷歌云控制台的Jenkins实例。 输入命令 sudo苏< / p >

Visudo -f /etc/sudoers

在末尾添加以下一行

jenkins所有= NOPASSWD:所有

签出在这里以了解此问题的根源

以下操作适用于ubuntu20

  1. 编辑/etc/sudoers
visudo

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

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