Jenkins Linux 文件访问或组问题

Jenkins Linux file access or group issue

我遇到了一个奇怪的文件访问问题。

Linux系统为RedHat 5.5

在这台机器上,当我以给定用户身份登录时:deploy_user,我可以看到我可以有效访问 /path/to/the/folder/subfolder/file.txt

ls -l /path/to/the/folder 显示(这意味着到这条路径我可以看到内容):

13:50:53 drwxr-x--- 2 root dbgroup    4096 Apr 27 14:38 subfolder

并且在文件夹 子文件夹 中,file.txt 具有以下访问权限(ls -l 输出)

13:50:53 -rwxr----- 1 root dbgroup  1620 Dec  9 15:28 file.txt

在 $ 提示符下的服务器上,如果我这样做:id deploy_user 我知道我是(deploy_user) 在 dbgroup 中(即 dbgroup 组中的任何人都可以将目录更改为 subfolder)和可以读取文件file.txt.

当我运行在自由式 Jenkins 作业中使用相同的命令并在这台 linux 机器上 运行将作业作为 node/slave(其中 Jenkins 仅作为用户 deploy_user 连接到此 node/slave 使用它的 SSH 密钥成功),我无法 cd(更改目录)和列表或 ls 并阅读或 cat 这个文件。

注意:我将 jenkins 作业限制为 运行 在特定从属设备上(使用标签),即它将 运行 作业仅在给定的机器上(如上所述)。

在詹金斯工作中,我运行宁是以下命令:

echo "I'm `whoami`"
echo "I'm in: $(id `whoami`)"
echo
groups
echo
echo "Again, my groups for: $(groups `whoami`)"
echo
cat /etc/group | grep "^dbgroup"
echo
echo
cd /path/to/the/folder
pwd && echo "It works! upto /path/to/the/folder path in Jenkins job."
echo
echo
cd /path/to/the/folder/subfolder || echo "cd to subfolder - didnt work"
echo
ls -l /path/to/the/folder/subfolder/file.txt || echo "ls on file.txt - didn't work"
echo
echo "Sleeping for 60 seconds ..." && sleep 60

Jenkins 作业的主要输出是:

13:50:53 I'm - deploy_user
13:50:53 I'm in: uid=3000(deploy_user) gid=3000(deploy_user) groups=4000(deployer),6001(dba),6081(osinstall),10121(dbgroup)
13:50:53
13:50:53 deployer dba osinstall
13:50:53
13:50:53 Again, my groups for: deploy_user : deployer dba osinstall dbgroup
13:50:53
13:50:53 dbgroup:x:10121:user1,user2,appuser3,svcuser4,deploy_user
13:50:53
13:50:53
13:50:53 /path/to/the/folder
13:50:53 It works! upto /path/to/the/folder path in Jenkins job.
13:50:53
13:50:53
13:50:53 /tmp/hudson58581.sh: line 7: cd: /path/to/the/folder/subfolder: Permission denied
13:50:53: cd to subfolder - didnt work
13:50:53
13:50:53 ls: /path/to/the/folder/subfolder/file.txt: Permission denied
13:50:53 ls on file.txt - didn't work
13:50:53
13:50:53 Sleeping for 60 seconds ...

知道为什么 groupsgroups deploy_user 的输出不同。默认情况下,groups 命令适用于当前登录的用户(whoami,它显示我是 deploy_user)。

我还检查了 ls -l 输出中 subfolder/file.txt 的 groupID,它是 10121

谢谢。

Jenkins 通常跨多台机器构建,有一个主机和一个从机。

检查两台机器的组 ID 是否相同 "id number"。如果不是,那么您可能会混淆主节点上的 "dbgroup" 和从属节点上的 "dbgroup",这是一个完全不同的组。 Linux只有真正用到的数字。

您也可以使用 "print groupID" 选项再次测试,而不是默认的 "print group name"。 ls -ln

此外,请记住 Jenkins 作业(在 /tmp/hudson58581.sh 中启动可能 运行 作为不同的用户)。预构建脚本、构建脚本和 post-build 脚本都有自己的 shell,这意味着从一个脚本中收集到的东西很少能应用于其他脚本。

此外,Jenkins 处理其 "on the master" 从属服务器的方式与远程主服务器完全不同。如果您是在主人的奴隶上建造,我建议您立即迁移到远程奴隶。是因为remote slaves scale,不值得积累逻辑。

好的,问题是最近有人添加了 dbgroup 用户,但它是在节点 created/configured/started 之后添加的,即节点要读取新设置,必须重新启动。

这就是为什么在机器本身上,在 $ 提示符下一切正常,但在 Jenkins 作业中却失败了。

在我重新启动节点后(运行 将作业限制为 运行 仅在带有标签的给定从机上),权限被拒绝错误消失了。

现在,groupsgroups `whoami` 这两个命令显示相同的组数。