我在使用 Jenkins 在远程主机上创建文件夹时遇到问题。
本例中的远程主机是具有默认用户的 Ubuntu 20.04 AMI EC2 库存服务器ubuntu
。
ubuntu
我使用以下代码将用户连接到远程服务器:
sshagent(credentials : [branchConfig.SSH_CREDENTIALS_NAME]) {
sh 'ssh -o StrictHostKeyChecking=no ' + branchConfig.SSH_USER + '@' + branchConfig.DOCKER_HOST + ' "echo \"running whoami\" && whoami && echo \"running groups\" && groups && install --directory --mode 0755 --owner ' + branchConfig.SSH_USER + ' --group ' + branchConfig.SSH_USER + ' ~/importengine"'
}
这会输出以下错误:
+ ssh -o StrictHostKeyChecking=no [email protected] echo running whoami && whoami && echo running groups && groups && install --directory --mode 0755 --owner ubuntu --group ubuntu ~/importengine
Warning: Permanently added 'x.x.x.x' (ECDSA) to the list of known hosts.
running whoami
ubuntu
running groups
ubuntu docker
install: cannot change owner and permissions of ���/home/ubuntu/importengine���: Operation not permitted
我可以看到该文件夹已创建,但它具有以下权限:
drwxr-xr-x 2 root root 4.0K Oct 13 11:12 importengine
如果我删除该文件夹并运行以下命令(以 ubuntu 身份登录时):
install --directory --mode 0755 --owner ubuntu --group ubuntu ~/importengine
...然后使用以下权限创建文件夹:
drwxr-xr-x 2 ubuntu ubuntu 4.0K Oct 13 11:24 importengine
问题
为什么该文件夹首先被创建为 root 拥有?毕竟,我可以清楚地看到whoami
输出为ubuntu
, 而不是root
在错误输出中,因此它应该像 ubuntu 用户一样创建文件夹。
答案1
最后,我无法弄清楚是什么导致了这个问题,所以我不得不解决它通过在本地创建文件文件夹,然后对其进行 scp,就成功了。例如
sshagent(credentials : [SSH_CREDENTIALS_NAME]) {
// copy over the .env file in a subfolder. Have to use scp because of strange permissions issue.
sh 'mkdir -p ~/importengine && cp ' + ENV_FILEPATH + ' ~/importengine/.env'
sh 'scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -r ~/importengine ' + SSH_USER + '@' + DOCKER_HOST + ':~/.'
}
边注
这个问题让我和我的同事都很困惑。我认为它一定是詹金斯特定的。我无法通过从我的 Linux 机器(例如在 Jenkins 之外)手动运行任何步骤来重现此问题。