两个终端之间的 scp windows(或多跳 scp)

scp between two terminal windows (or multihop scp)

我经常需要使用多跳通过 ssh 连接到多个系统。也经常发生我想将文件从目标系统复制到我的本地系统或以一种简单的方式相反(我当前的工作流程是将文件复制到两台机器都可以看到的外部位置,以便它为我节省了几步,或者如果文件不是二进制文件,则将其 copy/paste 发送到另一个终端 window)。 有没有简单的方法来做这样的事情?

我正在使用 OSX 和 iterm2(显然我不介意更改后者)。

所以连接类似于(本地机器)->(门户 A)->(机器 B)->(门户 C)->(机器 D)

所以我想以一种简单的方式将文件从机器 A 复制到机器 D(无需通过所有跃点复制文件或创建四个隧道)。

我不得不考虑这个问题一段时间,但如果您设置了使用密钥的无密码身份验证,则可以这样做:

$ cat test | ssh f21 "tee | ssh f20 \"tee test\""

加密的 ssh 密钥无关紧要。对于通过一跳进行传输,它非常简单,对于更多的跃点,它可能会变得混乱......

这并不完全是您的要求,但您可以使用 SSH 代理的一些技巧来极大地简化此类事情。首先要熟悉的是通过 netcat 代理多跳 SSH 连接。如果您在各种主机上有 OpenSSH 版本 5.4 或更高版本,请将类似的内容添加到您的 ~/.ssh/config:

Host B
    ProxyCommand ssh A -W %h:%p

Host C
    ProxyCommand ssh B -W %h:%p

Host D
    ProxyCommand ssh D -W %h:%p

如果任何中间件没有足够新的版本,但有 netcat (nc),您可以使用类似这样的东西:

Host D
    ProxyCommand ssh C nc %h %p

这将使 ssh D 自动打开一个到 C 的隧道到 运行 连接结束,这将自动打开一个到 B 的隧道,...你必须验证 4 次(到 A,然后是 B,等等)(除非你设置了 public-key 身份验证),但除此之外它是透明的。这意味着您可以将它与 sftp Dscp D:/path/to/file 等一起使用

现在,对于您所描述的内容,这方面存在一个重大限制。您当然可以从例如复制文件A 到 D 是这样的:

scp A:/path/to/file D:/path/to/file

...但是文件的内容将通过路径 A -> 您的计算机 -> A -> B -> C -> D。它们不会存储在该路径的任何位置,但是如果网络 link 你和 A 之间的速度很慢(例如你在家工作),这将是一个瓶颈。在这种情况下,最好将 C 和 D 的 ~/.ssh/config 条目复制到计算机 A 上,正常 ssh 到 A,然后使用 scp /path/to/file D:/path/to/file 并删除多余的跃点。

顺便说一句,如果你想要花哨的,你可以把这个添加到你的 ~/.ssh/config:

Host */* 
    ProxyCommand ssh $(dirname %h) -W $(basename %h):%p

然后使用ssh A/B/C/D等就地搭建隧道路径。有关详细信息,请参阅 the OpenSSH cookbook