You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:28:32