正規の方法は次のとおりです。
scp
リモートの場所へのファイルtar
かどうか、単一のファイルまたはフォルダ全体、7za
または何かもっと効率的なもの)私はこのようなシェルパイプに精通しています:
tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z
基本的に:
tar
にローリングstdout
からstdin
にデータを渡すssh
リンクを介してこれを行う最良の方法は何ですか?
sshfs
マウントしたくない。
これは動作しません:
scp <(tar cvf - MyBackups | 7za a -si -mx=9 -so) localhost:/tmp/tmp.tar.7z
なぜなら:
/dev/fd/63: not a regular file
あなたがしたいことをする多くの方法があります。最も簡単なのは、pìpeを使用することです。
tar zcvf - MyBackups | ssh user@server "cat > /path/to/backup/foo.tgz"
ここで、圧縮はtar
(gzip
フラグ)を呼び出すz
によって処理されます。 compress
(Z
)およびbzip
(j
)も使用できます。 7z
の場合は、次のようにします。
tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z |
ssh user@server "cat > /path/to/backup/foo.7z"
bestの方法は、おそらくrsync
です。
Rsync is a fast and extraordinarily versatile file copying tool. It can copy
locally, to/from another Host over any remote Shell, or to/from a remote rsync dae‐
mon. It offers a large number of options that control every aspect of its behavior
and permit very flexible specification of the set of files to be copied. It is
famous for its delta-transfer algorithm, which reduces the amount of data sent over
the network by sending only the differences between the source files and the exist‐
ing files in the destination. Rsync is widely used for backups and mirroring and
as an improved copy command for everyday use.
rsync
にはwayオプションが多すぎます。それらを一読する価値はありますが、一見すると怖いです。このコンテキストで重要なのは次のとおりです。
-z, --compress compress file data during the transfer
--compress-level=NUM explicitly set compression level
-z, --compress
With this option, rsync compresses the file data as it is sent to the desti‐
nation machine, which reduces the amount of data being transmitted --
something that is useful over a slow connection.
Note that this option typically achieves better compression ratios than can
be achieved by using a compressing remote Shell or a compressing transport
because it takes advantage of the implicit information in the matching data
blocks that are not explicitly sent over the connection.
したがって、あなたの場合、あなたはこのようなものが欲しいでしょう:
rsync -z MyBackups user@server:/path/to/backup/
ファイルは転送中に圧縮され、解凍されて宛先に到着します。
さらにいくつかの選択肢:
scp
自体がデータを圧縮できます
-C Compression enable. Passes the -C flag to ssh(1) to
enable compression.
$ scp -C source user@server:/path/to/backup
rsync
と7za
を使ってニースをプレイする方法はあるかもしれませんが、そうする意味はありません。 rsync
の利点は、ローカルファイルとリモートファイル間で変更されたビットのみをコピーすることです。ただし、ローカルで小さな変更を加えると、圧縮ファイルが大きく異なる可能性があるため、rsync
を使用しても意味がありません。それは利益をもたらさずに問題を複雑にするだけです。上記のように直接ssh
を使用するだけです。 reallyがこれを実行したい場合は、rsync
の引数としてサブシェルを指定してみてください。私のシステムでは、これを7za
で動作させることができませんでした。圧縮データを端末に書き込むことができないためです。おそらく、実装が異なります。 (これは私にはうまくいきません)のようなものを試してください:
rsync $(tar cf - MyBackups | 7za a -an -txz -si -so) \
user@server:/path/to/backup
もう1つのポイントは、7z
Linuxでのバックアップには使用しないでくださいです。 7z
のマニュアルページに記載されているとおり:
Linux/Unixでのバックアップ目的で7-Zip形式を使用しないでください。理由は次のとおりです。
-7-Zipはファイルの所有者/グループを保存しません。
このコマンドでうまくいくと思います
ssh user@Host "cd /path/to/data/;tar zc directory_name" | tar zx
編集:以前のバージョンには2つの誤った「f」オプションがありました。
ここで、まず最初に、ターゲットホストからこのコマンドを実行する必要があります。そして説明される詳細:
ご覧のとおり、このコマンドはオンザフライで圧縮し、帯域幅を節約します。より良い結果を得るために他の圧縮も使用できますが、圧縮と解凍にはCPUサイクルが必要であることを覚えておいてください。
dkbhadeshiyaの答えの小さな改善 :cd dir
を実行する必要はなく、tar
に作業ディレクトリを指定するだけです代わりに:
ssh user@Host "tar -C /path/to/data/ -zc directory_name" | tar zx
同じ方法でディレクトリをアップロードすることもできます:
tar zc directory_name/ | ssh user@Host "tar zx -C /new/path/to/data/"