質問: tar+sshコマンドの解説 以下は、tarとsshコマンドを組み合わせて一行で実行しているコマンドなのですが、やってることがいまいちわかりません。どなたか詳しい方説明していただけないでしょうか。 tar -cvf '-' /root/backup | ssh 192.168.1.2 "cat '-' > /tmp.tar" 自分なりの理解は以下の通りで、謎なところを解説していただければ非常に助かります。。 分解してみていきます。 1 tar -cvf '-' /root/backup tarで/root/backupを固めいている。 (謎1) -cvfあとの '-' は何なんでしょうか? 2 | ssh 192.168.1.2 パイプでつないでssh接続 3"cat '-' > /tmp.tar" (謎2)全体的に謎です。。 たぶん'-'が理解できればわかるのかな・・? 詳しい方ぜひご教授下さい。よろしくお願いいたします。
回答: 説明は難しいですね。 '-'の意味はtarやcat等のコマンドの作りに依存しますが、一般的にunix系のコマンドでは状況に応じて標準入力、または、標準出力を意味します。 標準入力、標準出力は本来は端末画面に表示されるもの、ぐらいの理解でとりあえずは良いのではないでしょうか。 i)パイプ'|'は左側のコマンドの標準出力を右側の標準入力に接続します。 ii)リダイレクト'>'は左側のコマンドの標準出力を、右側に指定したファイルに出力します。 iii)"cat /etc/group | cat '-' > ~/group"は"cp /etc/group ~/group"とだいたい同じ動きをします。 これを踏まえて説明してみます。 (謎1の説明) tarの"-f"オプションに'-'を指定すると、標準出力に”tmp.tarの内容”を出力します。 パイプが右側にあるので、画面には出力されずにパイプの右側にあるコマンドに渡されます。 (謎2の説明) ”| cat '-' > /tmp.tar”でパイプの左側のコマンドが出力した内容、この場合は"tmp.tarの内容"、を持つファイル(/tmp.tar)を作成します。 今回はパイプとcatコマンドの間に"ssh 192.168.1.2"が割り込んでいます。 さらっと流した"| ssh 192.168.1.2"のところが理解する上では難しいかもしれません。 やっている事はパイプ'|'とcatコマンドの間に入って、192.168.1.2上で"cat '-' > /tmp.tar"を実行しています。 ただcatコマンドを実行する前にパイプの左側の標準出力とcatコマンドの標準入力を接続してデータが流れるようにしています。 sshが干渉せずにデータが流れるように動いてくれるため、192.168.1.2上に/tmp.tarファイルが作成されます。 参考までに、同一ホスト上に/tmp.tarを作成する次の4つのコマンドは同じ動きになります。 # tar -cvf /tmp.tar /root/backup # tar -cvf '-' /root/backup > /tmp.tar # tar -cvf '-' /root/backup | cat '-' > /tmp.tar # tar -cvf '-' /root/backup | ssh localhost "cat '-' > /tmp.tar" 192.168.1.2のsshdにはそれなりの設定がされていると思います。最後の例はそのまま実行しようとしても、sshdの設定によってエラーになるかもしれません。 "cat '-'"と"cat"は同じ意味とか、標準入出力のちゃんとした説明とか、いろいろ不足しているとは思いますが、理解できているところ、いないところを整理する手助けになれば幸いです。 以上