如何通过SSH中心节点实现两台SSH客户端间直接文件传输?
两台SSH客户端通过中心服务器透明中转传输文件的实现方案
问题场景
现有两台仅作为SSH客户端的机器(节点A、B),二者均可访问同一台远程SSH服务器(节点C),且使用相同的共享账号shared。希望在A、B之间直接传输文件,通过C透明中转,无需将文件先存储到C的本地磁盘,如何配置实现?
当前的hub-spoke网络配置如下:
| Node | IP | Client | Server | Port | User | Status |
|---|---|---|---|---|---|---|
| A | 192.168.1.1 | Y | N | N/A | alice | authenticated |
| B | 192.168.1.2 | Y | N | N/A | bob | authenticated |
| C | 192.168.1.3 | Y | Y | 22 | shared | authorized |
已完成的密钥认证配置:
# 在节点A上生成密钥并上传到C alice@A: ssh-keygen alice@A: ssh-copy-id shared@C # 在节点B上生成密钥并上传到C bob@B: ssh-keygen bob@B: ssh-copy-id shared@C
当前低效的传输方式
目前只能先将文件传到C,再从C下载到B,不仅步骤繁琐,还会在C上留存文件副本:
# 从A上传到C alice@A: scp myfile shared@C:~ # 从C下载到B bob@B: scp shared@C:~/myfile .
可行解决方案
方案1:使用scp -3直接中转(无需修改网络结构)
scp -3参数会指定中心服务器C作为中转节点,直接在A和B之间建立数据通道,传输过程中文件不会被存储到C的本地磁盘。
执行命令(在节点A上操作):
scp -3 myfile shared@C:bob@B:~/
注:该方式依赖C能同时访问A和B的SSH服务,若A/B仅能主动连接C,需先在C上配置反向代理或端口转发,确保C能访问到A/B的SSH端口。
方案2:调整网络结构,实现透明代理传输
若要更彻底地实现A、B之间的直接访问体验,可修改网络角色:让A、B同时作为SSH服务器,通过C作为跳板实现透明中转。
操作步骤:
在A、B上启用SSH服务:
安装OpenSSH服务器并启动服务,同时调整防火墙规则,允许本地SSH端口(默认22)的访问。配置SSH跳转代理:
- 在节点A的
~/.ssh/config中添加以下配置,实现通过C访问B:Host B User bob ProxyJump shared@C - 在节点B的
~/.ssh/config中添加以下配置,实现通过C访问A:Host A User alice ProxyJump shared@C
- 在节点A的
直接传输文件:
完成配置后,A、B之间即可像本地网络一样直接使用scp传输,数据会自动通过C中转,且不会在C留存文件:# 从A传输到B alice@A: scp myfile B:~/ # 从B传输到A bob@B: scp myfile A:~/
内容的提问来源于stack exchange,提问作者sof
相关产品推荐
相关产品推荐

