在Jenkins中以root用户身份运行shell命令?

19

我最近开始使用Jenkins进行集成。一切都很顺利,直到我在主节点上运行作业时没有使用shell命令,但我不得不在主节点和包含shell命令的从节点上运行作业。我无法以root用户身份运行这些shell命令。我尝试了以下方法:

  1. 使用SSH密钥。
  2. 在shell命令中设置用户名。
  3. 使用sudo。

每次使用上述任何一种方法时,我都会收到“permission denied”错误。

9个回答

46

我建议不要将jenkins用户作为root用户运行。这可能会暴露操作系统和jenkins可以构建的所有代码库。

以root身份运行脚本是一个安全风险,但稍微更安全的方法是授予jenkins用户sudo访问权限,只允许运行一个脚本,而无需输入密码。

sudo visudo

并添加以下内容:

jenkins    ALL = NOPASSWD: /var/lib/jenkins/jobs/[job name]/workspace/script

当构建脚本失败时,请通过控制台日志仔细检查您的路径。此处显示的是默认路径。

现在,在Jenkins任务中,您可以调用sudo $WORKSPACE/your script


我需要在我的Jenkinsfile中的每个命令后面添加sudo,这样做真的是正确的方法吗? - Julio Marins
1
通常情况下不需要,如果你能找到其他的方法就用其他的方法。但是如果你必须使用root访问权限,那么这是更安全的做法。请记住,如果你运行的脚本被攻击了,那么Jenkins服务器也会受到影响。 - oden
在你的第二步中添加被修改的文件名... sudo vi /etc/sudoers - masher

35

您需要修改 jenkins 用户的权限,以便能够运行 shell 命令。 您可以安装 Jenkins 作为服务(下载 rpm 包),您可能需要更改端口,因为默认情况下它在 8080 端口上运行 http 和在 8009 端口上运行 AJP。



以下过程适用于 CentOS
1. 打开此脚本(使用 VIM 或其他编辑器):

vim /etc/sysconfig/jenkins

2. 找到 $JENKINS_USER 并将其更改为“root”:

$JENKINS_USER="root"

3. 然后更改Jenkins主目录、webroot和日志的所有权:

chown -R root:root /var/lib/jenkins
chown -R root:root /var/cache/jenkins
chown -R root:root /var/log/jenkins

4)重启Jenkins并检查用户是否已更改:

service jenkins restart
ps -ef | grep jenkins

现在您应该能够以root用户身份运行Jenkins作业,所有shell命令都将以root执行。


32
在服务中暴露允许您以root身份运行脚本的Web界面是一个非常糟糕的想法。 - JamesP
1
+1 给 @JamesP。然而,AWS CLI 的错误安装和 Jenkins 用户权限不足可能导致这个问题。 - Lovey
有什么想法,如何在MacOSX中实现这个? - Geek
dscl . -append /Groups/admin GroupMembership jenkins - Guy Mazuz
1
这看起来很有前途,但后来我回退了,没有使用上述命令,还需要找到更好的解决方案。 - Manohar Reddy Poreddy
显示剩余3条评论

3

针对Linux,尝试遵循以下步骤:

这对我有效。

更改Jenkins用户:sudo vi /etc/default/jenkins

更改root用户或您用于访问文件的用户: $JENKINS_USER="root"

使用之前设置的用户执行:

sudo chown -R root:root /var/lib/jenkins
sudo chown -R root:root /var/cache/jenkins
sudo chown -R root:root /var/log/jenkins
  1. 将 Jenkins 作为服务运行:

    service jenkins restart
    systemctl jenkins restart

您可以在 Linux 上以 UI 的方式执行 Jenkins 进程并禁用无头模式。

/etc/alternatives/java -Djava.awt.headless=false -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --httpPort=8080 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20

验证Jenkins是否正在运行:

ps -ef | grep jenkins

1
另一个选择是设置一个 Jenkins“从属节点”,实际上在主节点上以 root 身份运行,并将其限制为绑定作业,然后将作业指向该从属节点。远非理想,但肯定是一个快速解决方案。

0

或者您可以更改docker.sock的权限。确保您的Docker容器以root用户运行。

docker exec <jenkinsContainerID> chmod 777 /var/run/docker.sock

0
我遇到了与EC2 "Azazon Linux 2023 AMI"相同的问题。我查看了许多解决方案,但不幸的是,没有一个能正常工作,因为缺少一个步骤来覆盖服务配置。
vi user/lib/systemd/system/jenkins.service中,需要更改文件中的User=rootGroup=root,因为默认情况下它们将是jenkins。运行systemctl daemon-reload
然后,
vi /etc/sysconfig/jenkins中更改JENKINS_USER="root"。 运行chown -R root:root /var/lib/jenkins。 运行chown -R root:root /var/cache/jenkins。 运行chown -R root:root /var/log/jenkins
完成这些步骤后,问题将得到解决。

0

除了选定答案中提到的所有步骤外,我还需要执行以下操作:

  1. 找出 Jenkins 服务文件所在位置,在 Centos 7/8 上

    vim /usr/lib/systemd/system/jenkins.service

  2. 将用户从 jenkins 更改为 root

    User=root

    Group=root


0
我遇到了同样的问题,但是不允许执行sudo visudo。相反,我创建了/etc/sudoers.d/jenkins文件,并在其中添加了这行内容。
jenkins ALL=NOPASSWD:/var/lib/jenkins/scripts/script.sh

如果有人对这种方法可能存在的安全问题有任何疑虑,请告诉我。 - undefined

-2

您只需要在Jenkins上使用Root权限在Linux机器上运行shell命令即可。

步骤:

1)sudo vi /etc/sudoers

2)添加以下行:

jenkins ALL=NOPASSWD:/path of script/

3) 从Jenkins,在远程shell上使用sudo运行脚本。 例如:sudo ps -ef

4) 现在构建Jenkins作业。 此作业使用root权限在Linux机器上运行脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接