繁体   English   中英

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

[英]How to fix 'sudo: no tty present and no askpass program specified' error?

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

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

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

sudo: no tty present and no askpass program specified

它第一次遇到sudo命令。

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

还有其他解决办法吗?

授予用户使用该命令而不提示输入密码应该可以解决问题。 首先打开一个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. 对所有命令使用NOPASSWD行,我的意思是:

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

这对我有用(Ubuntu 14.04)。

尝试:

ssh -t remotehost "sudo <cmd>"

这将消除上述错误。

在所有替代方案之后,我发现:

sudo -S <cmd>

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

来源

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

echo <password> | sudo -S <cmd> 

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

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

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

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

对于 Ubuntu 16.04 用户

有一个文件你必须阅读:

cat /etc/sudoers.d/README

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

myuser  ALL=(ALL) NOPASSWD: ALL

应该解决问题。

不要忘记:

chmod 0440 /etc/sudoers.d/myuser

试试这个:

echo '' | sudo -S my_command

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

$ sudo visudo

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

  1. 注释掉Defaults requiretty

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

    jenkins ALL=(ALL) NOPASSWD: ALL

如果您有任何机会来到这里是因为您无法在 Windows10 附带的 Ubuntu 中执行 sudo

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

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

在詹金斯

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

例如:-

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

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

这对我有用:

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

您的用户是“myuser”

对于 Docker 映像,这将是:

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

确保您要执行的sudoPATH一部分。

如果您有一个(或多个,但不是全部)命令sudoers条目,您将获得sudo: no tty present and no askpass program specified when the command is not your path (and the full path is not specified) .

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

sudo /usr/sbin/ipset

代替

sudo ipset

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

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

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

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

就我而言, myusermygroup

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

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

myuser   ALL=(ALL) NOPASSWD: ALL

有用!

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

简单步骤:

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

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

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

jenkins ALL=(ALL) NOPASSWD: ALL

  1. 保存文件

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

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

当您尝试从某些非 shell 脚本(例如,来自 Ruby 程序的sudo ls (反引号))运行终端命令(需要 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]。

作为参考,万一其他人遇到同样的问题,我在一个小时内被卡住了这个错误,因为我使用的是 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 执行等”)

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

这是我所拥有的:

jenkins ALL=NOPASSWD: systemctl

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

jenkins ALL=NOPASSWD: /bin/systemctl

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

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

Defaults visiblepw

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

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

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

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

这是我修复它的方法

该问题是由执行sudo命令引起的,该命令试图请求密码,但sudo无权访问tty以提示用户输入密码。 由于找不到ttysudoaskpass方法,但找不到配置的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

就这样。

我希望这有帮助

没有人知道是什么导致了这个错误,在从一台主机迁移到另一台主机的情况下,记得检查 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 程序

其他选项,不基于 NOPASSWD:

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

当我尝试挂载需要 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/user上的 /etc/sudoer.d/user 中创建一个文件:

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

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

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

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

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

chmod 777 filename

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

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

谢谢你!

1 打开/etc/sudoers

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

2 添加/修改linux用户

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

<USERNAME> ALL=(ALL) NOPASSWD: ALL

3 保存并退出编辑模式

使用管道:

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"

问题的解决方法是

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

转到 Google Cloud Console 的 Jenkins 实例。 输入命令 sudo su

visudo -f /etc/sudoers

在最后添加以下行

jenkins ALL= NOPASSWD: ALL

在这里结帐以了解此问题的根本原因

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

以下操作适用于 ubuntu20

  1. 编辑 /etc/sudoers
visudo

或者

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM