リモートマシンのファイル群のtarアーカイブをリモートマシンに一時ファイルを作成しないでsshで取得する

ありがちな方法(一時ファイル作成)

リモートマシンのファイル群をtarアーカイブとして取得する場合、以下のようのリモートマシンで一度tarアーカイブを作成することは、よく見る状況である。
  1. リモートマシンにSSHでログイン
  2. リモートマシンで、tarコマンドを実行してtarアーカイブを作成する
  3. ローカルマシンからscpで、リモートマシンのtarアーカイブをコピー
  4. リモートマシンで、tarアーカイブを削除
この方法の欠点は、リモートマシンに一時的にtarアーカイブを保存する空き容量が必要なことである。 大量のファイルをローカルにコピーするときは、これがネックになる。

一時ファイルを作らない方法

リモートマシンremoteの/home/foo以下をすべてtarアーカイブfoo.tar.gzとしてバックアップする場合、 ローカルマシンで以下のように入力する。
ssh remote tar czf - /home/foo > foo.tar.gz
上記の青字の部分は、リモートマシンで実行されるコマンドである。リモートで実行したコマンドの標準出力は、ローカルのsshコマンドそのものの標準出力に出力される。上記でtarの出力ファイルとして-(標準出力)を指定しているので、結果としてローカルのsshの標準出力にtarアーカイブの内容が出力される。そこで> foo.tar.gzでローカルのファイルにリダイレクトすれば、そのままtarアーカイブとなる。これを図にすると次のイメージである。
なお、標準入出力については下記を参照。 また、tarをカレントディレクトリが/home/fooで実行させるには以下のようにする。
ssh remote "(cd /home/foo; tar czf - .)" > foo.tar.gz

多段SSHごしでのtarアーカイブ取得

local -> remote -> remote2のようにremoteを介してremote2へ多段SSHして、remote2のファイル群のtarアーカイブを直接取得することもできる。
ssh -J remote remote2 tar czf - /home/goo > goo.tar.gz

0 件のコメント: