我想在两台服务器之间传输目录,但在传输之前压缩远程主机上的目录,然后解压缩到另一台主机。我确信可以将所有东西都通过管道连接并在一个内衬中完成。
我意识到如果我可以直接在主机之间传输当然会更好,但这会涉及传输密钥之类的,而且我喜欢 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