我有一组服务器,均已正确配置 SSH 代理转发。这是典型的堡垒服务器样式配置,其中唯一可以从外部连接的机器是服务器 A。从服务器 A,您可以使用代理转发连接到服务器 B、C、D 等。一切都运行正常。
有时我想将文件从本地计算机复制到服务器 B。为了执行此操作,我必须先将文件 scp 到服务器 A。然后 ssh 到服务器 A,并将文件 scp 到服务器 B。然后我从服务器 A 中删除该文件。
有没有办法只需在本地机器上执行一个命令即可将文件通过服务器 A 直接从我的计算机复制到服务器 B?
答案1
如果你的 sshd 配置为允许 TCP 转发,那么你可以从你的计算机通过 A 到 B 设置隧道,然后使用它来复制内容。创建隧道
ssh -f -L 2050:B:22 A -N
-f
背景 ssh 命令,以便您可以重新使用终端。-L 2050:B22
将本地主机端口 2050 绑定到主机 B 端口 22-N
不执行远程命令。
然后从你的计算机复制到B
scp -P 2050 filetocopy localhost:/destination/path
编辑:如果你使用
ssh -L 2050:B:22 A -N &
然后,当 ssh 命令后台运行时,您将被告知该命令的 PID。
答案2
将类似这样的内容放入 .ssh/config 中:
Host B-p C-p D-p
ProxyCommand ssh -W %h:%p A.example.com
Host B-p
Hostname B.example.com
Host C-p
Hostname C.example.com
Host D-p
Hostname D.example.com
然后只需 ssh 或 scp 即可。如果您始终在“外面”,则B-p
可以省略后缀-p
并直接在等上配置 ProxyCommand 。B.example.com
这会在您的机器和堡垒主机之间产生一点流量开销,但无需代理转发即可工作。
答案3
我最近遇到了一个类似(甚至更复杂)的情况,并设法解决了这个问题。
简短的回答:使用ProxyCommand
而不是代理转发。
长话短说:
在我的案例中涉及四个主机:
- 我办公室里的 Linux 桌面
- 互联网上某处的 Linux VPN 服务器
- 我公寓里的 Linux 家庭服务器
- 我公寓里的 Linux 笔记本电脑
我公寓里的路由器没有从 ISP 获取公共地址,因此家用笔记本电脑和家用服务器都位于双 NAT 之后,我无法进行端口转发之类的操作,因为我无法控制 ISP 设备。出于某种原因,家用服务器始终连接到具有公共地址的 VPN 服务器。这样我就可以ssh -A
进入 VPN 服务器,然后ssh -A
进入家用服务器,最后ssh
进入家用笔记本电脑。
但有时我需要传输文件。我不想一跳一跳地多次传输rsync
。scp
ProxyCommand
来救援。将这些放入~/.ssh/ssh_config
:
# 主机A是具有公网地址的VPN网关。 主机 a.example.org 主机名 1.2.3.4 # 主机 B 是没有公网地址的家庭服务器/网关。 # 它通过 VPN 连接到主机 A。 主机 b.example.org 主机名 10.255.255.100 代理命令 ssh -W %h:%p a.example.org # 主机 C 是我的家用笔记本电脑。 主机 c.example.org 主机名 192.168.2.100 代理命令 ssh -W %h:%p b.example.org # vim: ft=sshconfig:
这可以无限链接。只要您的主机具有快速连接,您就可以继续链接主机 D、主机 E 等。无需手动执行ssh -L
或ssh -D
逐跳并通过非标准端口连接。我现在可以ssh c.example.org
直接从任何地方执行,只要我可以连接到a.example.org
。当然,其他基于 SSH 的协议(如 Rsync、SCP、SFTP 等)也自动受支持。
答案4
您可以使用 tar 来复制文件:
tar cC SRC-DIR SRC-FILE | ssh A.example.com ssh B.example.com tar xC DST-DIR
如果需要,请确保向 DST-DIR 添加正确数量的引用;它将由三个 shell 进行解释。
使用 ssh 和 tar 非常灵活,例如当 scp 拒绝与两个远程位置一起工作时。