避免 Jenkins 错误的最佳实践:sudo:没有 tty present 并且没有指定 askpass 程序

避免 Jenkins 错误的最佳实践:sudo:没有 tty present 并且没有指定 askpass 程序

从 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 作为脚本的一部分,您需要两样东西。

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

  2. sudo -n 精确命令

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

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

相关内容