Ubuntu 18.04-sudo:没有 tty 存在并且没有指定 askpass 程序

Ubuntu 18.04-sudo:没有 tty 存在并且没有指定 askpass 程序

在告诉我有关 /etc/sudoers 文件之前,它是:

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL
jenkins ALL=(ALL) NOPASSWD: ALL

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

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

一开始我试图远程运行 sudo 命令。我使用 visudo 编辑了 sudoers 文件,让 jenkins 用户能够运行 sudo 命令而无需输入密码。

当我意识到我有另一个问题时,我甚至尝试运行(当我以 jenkins 用户身份登录时)以下命令:ssh localhost“sudo w”,但即使这样也不起作用。

收到此错误:sudo:没有 tty 存在并且没有指定 askpass 程序

有任何想法吗?

谢谢!

编辑:

  1. 我正在尝试在后续步骤作业中在从属机器上运行来自 jenkins 主机的 bash sudo 命令(已经与其他从属机器一起完成)。

  2. 当我运行该作业时,它失败并出现错误:sudo:没有 tty 存在并且没有指定 askpass 程序。从我的调试来看,问题似乎与主服务器无关,因为我尝试在从属机器内通过 ssh 发送 sudo 命令并收到相同的错误。

  3. 我的期望是让它工作。它已经在不同的从属机器上工作了。(我也通过 ssh 发送 sudo 命令指向 localhost 来测试另一台从属机器中的相同逻辑 --- 工作正常

似乎没有用于 ssh 上的 sudo 命令的 tty...我不是 TTY 或 SSH 专家。也许我错过了什么...

解决了! 我觉得这是一个BUG...

我将这一行移至 /etc/sudoers 的末尾,它就起作用了!

jenkins ALL=(ALL) NOPASSWD: ALL

所以文件看起来像这样:

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

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

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
jenkins ALL=(ALL) NOPASSWD: ALL

答案1

问题是文件是按顺序读取的。请参阅“SUDOERS 文件格式”部分man sudoers

当多个条目与用户匹配时,将按顺序应用它们。如果有多个匹配项,则使用最后一个匹配项(不一定是最具体的匹配项)。

因此,它首先读取以下行:

jenkins ALL=(ALL) NOPASSWD: ALL

并允许jenkins在没有密码的情况下运行 sudo 命令(顺便说一句,这似乎是一个非常糟糕的想法,但现在我们先不考虑安全性)。然后,它继续读取文件并发现:

%sudo   ALL=(ALL:ALL) ALL

由于jenkins是该组的一部分,因此这也sudo适用于并覆盖该命令。jenkinsNOPASSWD

相关内容