在告诉我有关 /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 程序
有任何想法吗?
谢谢!
编辑:
我正在尝试在后续步骤作业中在从属机器上运行来自 jenkins 主机的 bash sudo 命令(已经与其他从属机器一起完成)。
当我运行该作业时,它失败并出现错误:sudo:没有 tty 存在并且没有指定 askpass 程序。从我的调试来看,问题似乎与主服务器无关,因为我尝试在从属机器内通过 ssh 发送 sudo 命令并收到相同的错误。
我的期望是让它工作。它已经在不同的从属机器上工作了。(我也通过 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
适用于并覆盖该命令。jenkins
NOPASSWD