从 Jenkins 运行任何 sudo 命令时我收到以下错误:
sudo:没有 tty 存在并且没有指定 askpass 程序
我知道我可以通过NOPASSWD
在我的文件中添加一个条目来解决这个问题/etc/sudoers
,这将允许用户詹金斯无需密码即可运行命令。我可以添加这样的条目:
%jenkins ALL=(ALL)NOPASSWD:/home/vts_share/test/sudotest.sh
...但这会导致以下问题:如何避免在 sudoers 文件中指定完整路径?
我可以添加这样的条目:
%jenkins ALL=NOPASSWD: ALL
...但这允许用户詹金斯以避免所有命令都提示输入密码,这似乎有点不安全。我只是好奇我在这里有什么选择,以及是否有任何我应该考虑的最佳实践。
答案1
我相信你正在寻找这个选项man sudoers
requiretty If set, sudo will only run when the user is logged in to a real tty. When this flag
is set, sudo can only be run from a login session and not via other means such as
cron(8) or cgi-bin scripts. This flag is off by default.
以下是我按照从最安全到最不安全的顺序提出的建议:
1)根本不要让 jenkins sudo。如果您正在进行软件包构建,请查看fakeroot
。jenkins 不需要 root 来构建软件。
2)如果你做需要 jenkins 具有 root 权限,考虑使用 sudoersCmnd
选项限制 sudo 能力。
3) 在一次性虚拟机上运行 jenkins。如果有人 root 它,请重建它并重新评估您的安全选择。我还建议将 jenkins 作为内联网服务运行,只能通过 LAN 或 VPN 访问。不要忘记包含身份验证!
答案2
如果您以 jenkins 用户身份运行 sudo 作为脚本的一部分,您需要两样东西。
命令的精确副本..例如 /bin/chown www-data /var/www
sudo -n 精确命令
-n 将告诉它如果是 NOPASSWD 则不要询问提示。
这修复了我在 jenkins 调用的脚本中运行 sudo 的问题