web-dev-qa-db-ja.com

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

2つのサーバー間でディレクトリを転送したいのですが、転送する前にリモートホストのディレクトリを圧縮してから、別のホストに解凍します。すべてをパイプでつなぎ、1つのライナーでそれを実行することは可能だと確信しています。

もちろん、ホスト間で直接転送できればよいのですが、これにはキーの転送などが含まれます。Unixの1線式電源ツールが大好きです。私は人々がこれを行うためのいくつかの異なる方法を考え出すことができると確信しています。最短の構文と最も保守的な帯域幅を探しています。

始めに私は持っています

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

コメントで提案されているjw01と同様に、個別の圧縮/解凍ステップを使用して、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
7
Thor

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

あなたの提案された答え:

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
1
Mistere