ファイアウォールの背後にあるときにリモートサーバーからSSHにtarパイプを使用して2つのリモートホスト間でコピーする方法は?

ファイアウォールの背後にあるときにリモートサーバーからSSHにtarパイプを使用して2つのリモートホスト間でコピーする方法は?

2つのサーバー間でディレクトリを転送したいが、転送する前にリモートホストのディレクトリを圧縮してから、別のホストに解凍してください。私はすべてをパイプで接続して1つのライナーで行うことができると確信しています。

ホスト間で直接転送できることは確かに良いことを知っていますが、これにはキー転送などが含まれ、私はUnixシングルワイヤー電動工具が好きです。私は人々がこれを行うためのいくつかの異なる方法を思い出すことができると確信しています。私は最も短い構文と最も保守的な帯域幅を探しています。

まず、

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

答え1

何に似ているjw013別々の圧縮/圧縮解除ステップを使用することが注釈で提案されました。つまり、2 つの 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

2 つのホスト間で直接接続を確立できる場合は、転送速度が速くなります。しかし、これが欠けている最も簡単な方法はcpsshfs

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

関連情報