避免 Jenkins 错误的最佳实践:sudo: no tty present and no askpass program specified

s g*_* g 5 linux ubuntu sudo jenkins

从 Jenkins 运行任何 sudo 命令时,我收到以下错误:

sudo:不存在 tty 且未指定 askpass 程序

我知道我可以通过NOPASSWD在我的/etc/sudoers文件中添加一个条目来解决这个问题,这将允许用户jenkins在不需要密码的情况下运行命令。我可以添加这样的条目:

%jenkins ALL=(ALL)NOPASSWD:/home/vts_share/test/sudotest.sh
Run Code Online (Sandbox Code Playgroud)

...但这会导致以下问题:如何避免在 sudoers 文件中指定完整路径?

我可以添加这样的条目:

%jenkins ALL=NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)

...但这允许用户jenkins避免所有命令的密码提示,这似乎有点不安全。我只是好奇我在这里有什么选择,如果有任何我应该考虑的最佳实践。

neo*_*ice 6

我相信你正在寻找这个选项 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.     
Run Code Online (Sandbox Code Playgroud)

以下是我的建议,按照最安全到最不安全的顺序:

1)根本不要让詹金斯sudo。如果您正在进行软件包构建,请查看fakeroot. jenkins 不需要 root 来构建软件。

2) 如果您确实需要 jenkins 拥有 root,请考虑使用 sudoersCmnd选项限制 sudo 功能。

3)在一次性虚拟机上运行詹金斯。如果有人根植它,请重建它并重新评估您的安全选择。我还建议将 jenkins 作为 Intranet 服务运行,只能通过 LAN 或 VPN 访问。不要忘记包括身份验证!


小智 5

如果您以 jenkins 用户身份运行 sudo 作为脚本的一部分,您需要做两件事。

  1. 命令的精确副本.. 像 /bin/chown www-data /var/www

  2. sudo -n 精确命令

-n 将告诉它如果它是 NOPASSWD,则不要询问提示。

这修复了我在 jenkins 调用的脚本中运行 sudo 的问题