Jenkins Pipeline中sshagent环境下scp命令权限拒绝问题
Jenkins Pipeline中sshagent下scp跨主机权限拒绝问题解决
问题根源
当执行scp userFoo@server.b:~/thisFile.txt userBar@server.a:~/thisFile.txt时,scp默认会让server.b直接发起对server.a的SSH连接,而Jenkins的sshagent仅在Jenkins运行节点上加载了密钥凭据,server.b上并没有能访问server.a的有效密钥,因此触发权限拒绝错误。而单独的ssh命令能成功,是因为这些命令是Jenkins节点直接连接server.a或server.b,sshagent的密钥能正常生效。
解决方案
方案一:通过Jenkins节点中转(推荐,无需修改服务器配置)
把跨主机传输拆分成两步:先将文件从server.b拉取到Jenkins节点,再上传到server.a。修改Pipeline中的sh命令:
ssh userBar@server.a hostname -f ssh userBar@server.a ls -l ssh userFoo@server.b hostname -f ssh userFoo@server.b "echo 'hello world' >> thisFile.txt && ls -l" # 第一步:从server.b拉取文件到Jenkins节点 scp userFoo@server.b:~/thisFile.txt ./temp_scp_file.txt # 第二步:将文件上传到server.a scp ./temp_scp_file.txt userBar@server.a:~/thisFile.txt # 清理临时文件(可选) rm ./temp_scp_file.txt
方案二:开启SSH代理转发(适合需要直接跨主机传输的场景)
通过SSH代理转发,让Jenkins节点的sshagent被转发到server.b上,这样server.b就能借助该代理访问server.a。修改命令如下:
ssh userBar@server.a hostname -f ssh userBar@server.a ls -l # 连接server.b时开启代理转发(-A参数) ssh -A userFoo@server.b "echo 'hello world' >> thisFile.txt && ls -l" # scp时开启代理转发(-o ForwardAgent=yes参数) scp -o ForwardAgent=yes userFoo@server.b:~/thisFile.txt userBar@server.a:~/thisFile.txt
注意:需要确保server.b的sshd配置文件/etc/ssh/sshd_config中AllowAgentForwarding设置为yes(默认通常开启,若未开启需修改后重启sshd服务)。
不推荐的方案:在server.b上配置访问server.a的密钥
直接在server.b的userFoo用户下生成密钥并添加到server.a的userBar用户授权列表中。这种方式会增加服务器间的密钥管理复杂度,且不符合CI/CD环境中凭据集中管理的最佳实践,因此不建议使用。
内容的提问来源于stack exchange,提问作者Alistair Hardy
相关产品推荐
相关产品推荐

