避免Jenkins错误的最佳实践:sudo:没有tty存在,也没有指定askpass程序

从Jenkins运行任何sudo命令时,出现以下错误:

sudo:没有tty present,也没有askpass程序

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

 %jenkins ALL=(ALL)NOPASSWD:/home/vts_share/test/sudotest.sh 

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

我可以添加一个像这样的条目:

 %jenkins ALL=NOPASSWD: ALL 

…但是这允许用户jenkins避免所有命令的密码提示,这似乎有点不安全。 我只是好奇我的select在哪里,如果有什么最佳做法,我应该考虑。

我相信你正在寻找这个man sudoersselect

  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. 

这里是我的build议,从最安全到最不安全的顺序:

1)不要让jenkins sudo。 如果您正在构build包,请查看fakeroot 。 jenkins不需要root来构build软件。

2)如果你需要jenkins拥有根,可以考虑用sudoers Cmnd选项来限制sudo的能力。

3)在一次性虚拟机上运行jenkins。 如果有人根据它,重build它,并重新评估您的安全select。 我也build议将jenkins作为Intranet服务运行,只能通过LAN或VPN访问。 不要忘记包含身份validation!

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

  1. 确切的命令副本.. like / bin / chown www-data / var / www

  2. sudo -n确切的命令

-n会告诉它如果NOPASSWD不要求提示。

这固定了我在jenkins调用的脚本中运行sudo