web-dev-qa-db-ja.com

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

正規の方法は次のとおりです。

  • scpリモートの場所へのファイル
  • 転送中のファイルを圧縮する(tarかどうか、単一のファイルまたはフォルダ全体、7zaまたは何かもっと効率的なもの)
  • 中間ファイルを保存せずに上記を行います

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

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

基本的に:

  • フォルダ全体を1つの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
69
Robottinosino

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

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

ここで、圧縮はtargzipフラグ)を呼び出すzによって処理されます。 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"

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
    
  • rsync7zaを使ってニースをプレイする方法はあるかもしれませんが、そうする意味はありません。 rsyncの利点は、ローカルファイルとリモートファイル間で変更されたビットのみをコピーすることです。ただし、ローカルで小さな変更を加えると、圧縮ファイルが大きく異なる可能性があるため、rsyncを使用しても意味がありません。それは利益をもたらさずに問題を複雑にするだけです。上記のように直接sshを使用するだけです。 reallyがこれを実行したい場合は、rsyncの引数としてサブシェルを指定してみてください。私のシステムでは、これを7zaで動作させることができませんでした。圧縮データを端末に書き込むことができないためです。おそらく、実装が異なります。 (これは私にはうまくいきません)のようなものを試してください:

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

    Linux/Unixでのバックアップ目的で7-Zip形式を使用しないでください。理由は次のとおりです。
    -7-Zipはファイルの所有者/グループを保存しません。

111
terdon

このコマンドでうまくいくと思います

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サイクルが必要であることを覚えておいてください。

参考

15
dkbhadeshiya

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/"
9
tsionyx