tmkzrの日記: 他のマシンにコピーしながらtarでアーカイブ 7
日記 by
tmkzr
たまに使うのにすぐやり方を忘れるからメモ。
[root@host ~]#tar zcvf - /home | ssh remotehost "cat > hosthome.tgz"
こうすることでローカルに容量が無い場合でもgzipしながらリモートにバックアップできる。tarの引数に"-"とするのは、出力を標準出力に変更する、という意味で、sshの第二引数のダブルクォーテーションの中身は、リモートで実行するコマンドだ。
これは bash? (スコア:1)
bash の場合、
という手もあります。
展開するときは
fjの教祖様
Re: (スコア:0)
# remote側でgzip/gungzipするのも、localが非力なCPUなら有効かも
# tar cvf - /home | ssh remotehost "gzip > hosthome.tgz" とかね
Re:これは bash? (スコア:1)
ふっっふっふ。stdin/stdout を指定していないのですよ。
…だけど、あれ? /home を指定するの忘れてた
は、
をバックグラウンドで実行する
を実行する
と同じ結果になる(実際には cat とかは動いてません)。
named pipe は「名前」がついていて「まるでファイルのように」open/close できる pipe だ。pipe なので基本的に単方向。そのへんは | と一緒。この場合は、tar は出力を ${PIPENAME}というファイルに書いているのだ、と思い込んでいる。一方で cat は ${PIPENAME} というファイルを読んで標準出力にだしている、と思っている。ただ、${PIPENAME} というファイルは「ファイルの実態としては」存在しない。一時的に /tmp の下にディレクトリエントリは作られるけど、使い終わったら自動的に消える。
.
このやり方だと何が嬉しいかというと、「stdin/stdout を使えないプログラム」相手でも pipe 処理ができる、ということ。ただしファイルの中を行ったり来たりするようなプログラム(lseek(2)を使うプログラム)には使えない。
もっとわかり易い例としては:
なんてのがある。host1 と host2 で設定の違う部分を比較したい場合に、それぞれのホストから passwd ファイルをコピーしてこなくてもよくて、なおかつ diff のように「2つのファイル」を指定する必要があるので stdin だけじゃ足りない…なんて場合でも対処できる。
.
まぁ、今回の場合は '- |' と '>()' なんでストローク数的にも同じだし、ゴミのような違いしかないんですけどね。
fjの教祖様
Re:これは bash? (スコア:2)
自分のマシン(ubuntu 9.04, bash 3.2.48)でやってみると、リモートのパスワードを聞かれて失敗してしまいました。先に鍵交換しておく必要があるのですね。
こんな感じ。"|"を使った方ではパスワードを聞かれるところで止まったので、そこでパスワード入力するとうまくコピーできます。 パスワードなんかいちいち入力しないで鍵をコピーしておけという話ですか。
Re:これは bash? (スコア:1)
おぉう。それは申し訳ない。てっきり公開鍵はすでにリモートにおいてあるものとばかり。
うーむ。ちょっとテストしていなくて申し訳ないのだけれど、-f オプションとかは効かない?
fjの教祖様
Re:これは bash? (スコア:1)
テストできる環境に来たので実験してみました。 -f は効かない
というわけで、公開鍵をリモートに置く以外手はないようだ。
# Expect とか使えば別なんだろうけれど。
fjの教祖様
Re:これは bash? (スコア:2)