当防火墙后面时,如何使用从远程服务器通过管道传输到 SSH 的 tar 在两个远程主机之间进行复制?

当防火墙后面时,如何使用从远程服务器通过管道传输到 SSH 的 tar 在两个远程主机之间进行复制?

我想在两台服务器之间传输目录,但在传输之前压缩远程主机上的目录,然后解压缩到另一台主机。我确信可以将所有东西都通过管道连接并在一个内衬中完成。

我意识到如果我可以直接在主机之间传输当然会更好,但这会涉及传输密钥之类的,而且我喜欢 Unix 单线电动工具。我相信人们可以想出几种不同的方法来做到这一点。我正在寻找最短的语法和最保守的带宽。

首先我有

ssh -n REMOTEHOST 'tar zcvf - DIRTOCOPY' | localZip.tar.gz 

答案1

类似于什么jw013在评论中建议使用单独的压缩/解压缩步骤,即将两个 ssh 命令与管道结合起来:

compress=gzip
decompress=gunzip

ssh remote1 "cd srcdir; tar cf - dir | $compress" |
ssh remote2 "cd destdir; $decompress | tar xvf -"

请注意,压缩/解压缩是可配置的,不依赖于tar.

更新

您还可以将校验和验证添加到管道中:

compress=gzip
decompress=gunzip

ckprg=md5sum
cksum=/tmp/cksum

ssh remote1 "cd srcdir; tar cf - dir | $compress | tee <($ckprg > $cksum)" |
ssh remote2 "cd destdir; tee <($ckprg > $cksum) | $decompress | tar xvf -"

ssh remote1 cat $cksum
ssh remote2 cat $cksum

答案2

如果您可以在两台主机之间建立直接连接,您的传输速度将会更快。但缺少这一点,最简单的方法是使用cp.首先使用挂载远程文件系统sshfs

mkdir ~/net ~/net/sourcehost ~/net/destinationhost
sshfs sourcehost: ~/net/sourcehost
sshfs destinationhost: ~/net/destinationhost
cp -Rp ~/net/sourcehost/path/to/source ~/net/destinationhost/path/to/destination

请务必激活您的压缩~/.ssh/config:

Host sourcehost
HostName sourcehost.example.com
Compression yes
CompressionLevel 9

Host destinationhost
HostName destinationhost.example.com
Compression yes
CompressionLevel 9

答案3

您建议的答案:

ssh -n REMOTEHOST 'tar zcvf - DIRTOCOPY' | localZip.tar.gz

对我不起作用 - 到文件的管道失败。

我这样做了,结果成功了:

ssh -n REMOTEHOST 'tar zcvf - DIRTOCOPY' | cat - > localZip.tar.gz

通过标准输入将其传输到“cat”并将输出重定向到文件。

另一种解决方案是删除“| cat -”并将 SSH 输出直接发送到 tarball:

ssh -n REMOTEHOST 'tar zcvf - DIRTOCOPY' > localZip.tar.gz

相关内容