不在同一网络中的两台服务器之间的 scp

Dan*_*k82 13 ssh scp routing vlan

我可以通过 2 个不同的 VPN 连接访问两台服务器。我设法让两个 VPN 在我的机器上同时运行(一些路由规则)。

我想scp <remote1>:some/file <remote2>:destination/folder从我的笔记本电脑终端做一个。但是当我尝试这个时,scpremote1上调用的命令找不到remote2,因为它们不在同一个网络中。是否可以强制scp命令作为路由器通过我的笔记本电脑?

如果我尝试使用 Nautilus(连接到服务器,两台服务器,然后复制粘贴)它可以工作,但我想从终端执行此操作。

小智 34

较新版本的 scp 有选项 -3

-3

Copies between two remote hosts are transferred through the local host. Without this option the data is copied directly between the two remote hosts
Run Code Online (Sandbox Code Playgroud)


Ank*_*nko 9

如果您需要比 更大的灵活性scp -3,plainssh和 pipe 很有趣。

这相当于在本地机器上重定向流:

ssh sourceRemote 'cat /path/to/sourceFile' \
| ssh destinationRemote 'cat > /path/to/destinationFile'
Run Code Online (Sandbox Code Playgroud)

然后,您可以在任何时候添加更多流重定向,例如链接多个中间机器,或在路由传输文件时保存其本地副本。

  • 如果源机器安装了 `pv` 并且你用它替换了第一个 `cat`,你会得到一个不错的进度条。 (2认同)

ari*_*lCo 6

扩展@Anko 的答案,您可以将其tar用于多个文件:

ssh -q user@sourcehost 'cd /source/path; tar -czf - files...' | \
ssh -q user@desthost 'cd /dest/path; tar -xzf -'
Run Code Online (Sandbox Code Playgroud)

压缩完全是可选的 - 您的数据可能不是非常可压缩或大到足以保证开销。如果您的版本tar不支持-z开关,请分别通过管道gzip -c和管道gzip -dc

PS:注意tar那些在提取时不会去除前导斜杠的版本(即,如果提供,则写入绝对路径名)。

编辑:-e none管道不需要,因为没有分配伪终端。

  • @Anko,这里使用`-C` 的问题是本地机器必须解压缩和重新压缩数据。告诉 `tar` 进行压缩意味着压缩后的数据直接通过管道而不进行任何处理。 (4认同)