scpと圧縮を同時に、中間保存なし


64

正規の方法は何ですか:

  • scp リモートロケーションへのファイル
  • 転送中のファイルを圧縮します(tarまたは、単一のファイルまたはフォルダー全体、7zaまたはさらに効率的な何か)
  • 中間ファイルを保存せずに上記を行います

私はこのようなシェルパイプに精通しています:

tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z

基本的に:

  • フォルダー全体を1つにまとめる tar
  • 介してデータを渡すstdoutstdin圧縮プログラムの
  • 積極的な圧縮を適用する

sshリンクを介してこれを行う最良の方法は何ですか?リモートファイルシステムにファイルがランディングしますか?


sshfsマウントしない方が好きです。


これは動作しません:

scp <(tar cvf - MyBackups | 7za a -si -mx=9 -so) localhost:/tmp/tmp.tar.7z

なぜなら:

/dev/fd/63: not a regular file

回答:


103

あなたがしたいことをする多くの方法があります。最も簡単なのは、pìpeを使用することです。

tar zcvf -  MyBackups | ssh user@server "cat > /path/to/backup/foo.tgz"

ここで、tar呼び出しはgzipzflag)によって処理されています。compressZ)およびbzipj)も使用できます。の場合7z、これを行います:

tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z | 
   ssh user@server "cat > /path/to/backup/foo.7z"

最善の方法は、しかし、おそらくです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持っているあまりにも多くのオプションを。それらを実際に読む価値はありますが、一見怖いです。ただし、このコンテキストで重要なのは次のとおりです。

    -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上記のように直接使用するだけです。本当にこれをしたい場合は、サブシェルを引数として渡すことで試すことができますrsync。私のシステムでは、7za圧縮データを端末に書き込むことができないため、これを使用できませんでした。実装が異なる可能性があります。次のようなものを試してください(これは私にはうまくいきません):

    rsync $(tar cf - MyBackups | 7za a -an -txz -si -so) \
      user@server:/path/to/backup
    
  • もう1つのポイントは、7z Linuxでのバックアップには使用しないことです7zmanページに記載されているとおり:

    Linux / Unixでは、バックアップ目的で7-zip形式を使用
    しないでください:-7-zipはファイルの所有者/グループを保存しません。


3
追加する良いメモは、インターネットなどの一般的に低速なネットワークを介して転送する場合を除き、転送速度を低下させるだけなので、圧縮を避けることが最善です。LANでは-z、少なくとも2倍遅いです。ssh経由のrsyncingよりもさらに高速にするには、-Wフラグを使用してrsyncデーモンとrsyncをセットアップします(ファイル全体をコピーします(デルタxferアルゴリズムなし)
。-laebshade

2
ありがとう!私はこの偉大な答えを受け入れるが、してください、両方を使用し、フル、スタンドアローンのコマンドラインを追加するつもりですrsync 7za、リモートファイルシステムへの最終的な出力で。私は好きでした-zが、圧縮段階を切り離したいと思いますrsync。その場合、どのように使用しますか?
Robottinosino

2
@Robottinosinoは更新された回答を参照してください。で使用rsyncしても意味がありません7z。それはすべき示すようにrsyncとsubshelで動作するが、私はどのようにとにかく見つけ出すことができませんでした。
テルドン

4
+1 scp -C。圧縮ファイルを保持するのに十分なスペースがリモートディスク上になかったため、転送前に圧縮できませんでした。1つの小さなコマンドラインオプションにより、問題が解決しました。
user37931 14

1
@knutoleは最初にファイルを圧縮し、次にrsyncします。詳細が必要な場合は、新しい質問をしてください。
テルドン

13

このコマンドはトリックを実行すると思います

ssh user@host "cd /path/to/data/;tar zc directory_name" | tar zx 

編集:以前のバージョンは2つの間違った「f」オプションがありました。

さて、まず最初に、ターゲットホストからこのコマンドを実行する必要があります。そして、説明される詳細:

  1. ssh user @ hostは、ホストマシンへの接続を開き、そこからデータが転送されます。
  2. cd / path / to / dataは、必要なデータが保存されているディレクトリに移動します
  3. tar zc *は圧縮を開始し、STDOUTに配置します
  4. これで、pipe(|)は、ソースのSTDOUTを「tar zx」が実行されている宛先のSTDINにパイプラインし、ソースからのデータストリームを継続的に解凍します。

ご覧のとおり、このコマンドはオンザフライで圧縮し、帯域幅を節約します。より良い結果を得るために他の圧縮も使用できますが、圧縮と解凍にはCPUサイクルが必要であることを忘れないでください。

参照


tar:古いオプション 'f'には引数が必要です。
ディミトリコプリワ

7

dkbhadeshiyaの答えの小さな改善:する必要はありませんcd dirtar代わりに作業ディレクトリを指定するだけです:

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/"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.