パスワードを忘れた? アカウント作成
281215 journal

tmkzrの日記: 他のマシンにコピーしながらtarでアーカイブ 7

日記 by tmkzr
たまに使うのにすぐやり方を忘れるからメモ。

[root@host ~]#tar zcvf - /home | ssh remotehost "cat > hosthome.tgz"

こうすることでローカルに容量が無い場合でもgzipしながらリモートにバックアップできる。tarの引数に"-"とするのは、出力を標準出力に変更する、という意味で、sshの第二引数のダブルクォーテーションの中身は、リモートで実行するコマンドだ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • bash の場合、

    tar cvzf >( ssh remotehost 'cat > hosthome.tgz' )

    という手もあります。

    展開するときは

    tar xvzf <( ssh remotehost 'cat hosthome.tgz' )

    --
    fjの教祖様
    • by Anonymous Coward
      せんせー、tar で stdin/stdoutを指定する "-" が抜けてまっせ。

      # remote側でgzip/gungzipするのも、localが非力なCPUなら有効かも
      # tar cvf - /home | ssh remotehost "gzip > hosthome.tgz" とかね
      • せんせー、tar で stdin/stdoutを指定する "-" が抜けてまっせ。

        ふっっふっふ。stdin/stdout を指定していないのですよ。
        …だけど、あれ? /home を指定するの忘れてた

        tar cvzf >( ssh remotehost 'cat > hosthome.tgz' ) /home

        は、

        1. まず、named pipe を作る。pipeの名前はランダムで決まるので判らないがとりあえず ${PIPENAME} としよう。
        2. cat ${PIPENAME} | ssh remotehost 'cat > hosthome.tgz'

          をバックグラウンドで実行する

        3. tar cvzf ${PIPENAME} /home

          を実行する

        と同じ結果になる(実際には cat とかは動いてません)。

        named pipe は「名前」がついていて「まるでファイルのように」open/close できる pipe だ。pipe なので基本的に単方向。そのへんは | と一緒。この場合は、tar は出力を ${PIPENAME}というファイルに書いているのだ、と思い込んでいる。一方で cat は ${PIPENAME} というファイルを読んで標準出力にだしている、と思っている。ただ、${PIPENAME} というファイルは「ファイルの実態としては」存在しない。一時的に /tmp の下にディレクトリエントリは作られるけど、使い終わったら自動的に消える。

        .

        このやり方だと何が嬉しいかというと、「stdin/stdout を使えないプログラム」相手でも pipe 処理ができる、ということ。ただしファイルの中を行ったり来たりするようなプログラム(lseek(2)を使うプログラム)には使えない。

        もっとわかり易い例としては:

        diff <(ssh host1 'cat /etc/passwd') <(ssh host2 'cat /etc/passwd')

        なんてのがある。host1 と host2 で設定の違う部分を比較したい場合に、それぞれのホストから passwd ファイルをコピーしてこなくてもよくて、なおかつ diff のように「2つのファイル」を指定する必要があるので stdin だけじゃ足りない…なんて場合でも対処できる。

        .

        まぁ、今回の場合は '- |' と '>()' なんでストローク数的にも同じだし、ゴミのような違いしかないんですけどね。

        --
        fjの教祖様
        親コメント
        • by tmkzr (19129) on 2010年12月12日 20時01分 (#1872857) 日記
          そんなやりかたがあるんですね。

          tar cvzf >( ssh remotehost 'cat > hosthome.tgz' ) /home

          自分のマシン(ubuntu 9.04, bash 3.2.48)でやってみると、リモートのパスワードを聞かれて失敗してしまいました。先に鍵交換しておく必要があるのですね。

          tmkzr@remotehost's password:
          Permission denied, please try again.
          tmkzr@remotehost1's password:
          Permission denied, please try again.
          tmkzr@remotehost's password:
          Permission denied (publickey,gssapi-with-mic,password).
          tar: Child died with signal 13
          tar: 処理中にエラーが起きましたが、最後まで処理してからエラー終了させました

          こんな感じ。"|"を使った方ではパスワードを聞かれるところで止まったので、そこでパスワード入力するとうまくコピーできます。 パスワードなんかいちいち入力しないで鍵をコピーしておけという話ですか。

          親コメント
typodupeerror

ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家

読み込み中...