如何使用 ssh 通过代理转发复制文件多跳?

如何使用 ssh 通过代理转发复制文件多跳?

我有一组服务器,均已正确配置 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进入家用笔记本电脑。

但有时我需要传输文件。我不想一跳一跳地多次传输rsyncscp

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 -Lssh -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 拒绝与两个远程位置一起工作时。

相关内容