あるときネットワーク越しにいろいろなことやりたくて、shellのコマンド調べていて覚えたことを覚え書き的に記しておきます。
下記はコマンドラインから、ネットワーク越しにその場で書いた内容のファイルを作る方法です。
% cat <<EOT | ssh $SERVER "cat > /path/to/file" content content content content EOT
これの応用で、パッチを複数サーバであてたいときは、
% cat <<EOT | ssh $SERVER "cat > /path/to/patch" --- /path/to/orig 2005-11-29 13:45:42.129125170 +0900 +++ /path/to/new 2005-11-29 13:46:27.540536045 +0900 @@ -1,3 +1,3 @@ aaa -bbb +ddd ccc EOT % ssh $SERVER "patch < /path/to/patch"
とか、もっとやるとファイルなぞ作らなくても直接patchをあてちゃったりできる。
% cat <<EOT | ssh $SERVER patch --- /path/to/orig 2005-11-29 13:45:42.129125170 +0900 +++ /path/to/new 2005-11-29 13:46:27.540536045 +0900 @@ -1,3 +1,3 @@ aaa -bbb +ddd ccc EOT
こんな感じです。知ってる人には常識中の常識なのかもしれませんが…。
あと自分は複数サーバで同時にあるコマンドを実行したいときは下記のようにコマンドラインでやっちまいます。
Borne Shellでは
% for x in 192.168.0.1 192.168.0.2 192.168.0.3; do command; done
tcshだったら
% foreach x (192.168.0.1 192.168.0.2 192.168.0.3) foreach?command foreach?end
みたいな感じで。サーバのIPはserver_list.txtとかに1サーバ1行で書いてcatする方法でもいけます。
んで疑問なのは、tcshでborne shellみたいにコマンドラインで1行でone-linerが書けないのかということなんですが、調べてみたんですがどうもできなそうなんですよね…。教えてエラい人!(注:NDOメソッド)

どうぞ。
% echo 'for x in 192.168.0.1 192.168.0.2 192.168.0.3; do command; done' | /bin/sh
ぬ…確かにそれでできるけどw
これだとborne shell使ってるからなんか負けた気がする…。
% foreach x (192.168.0.1 192.168.0.2 192.168.0.3); command; end
こんなことできないのかな~と思って。
っ% sudo rm `which tcsh`
っ% foreach x (192.168.0.1 192.168.0.2 192.168.0.3)^Jcommand^Jend
(^J はtcshではなぜか C-v C-m で入力; 他のshellでは C-v C-j)
キタ━━━━(゚∀゚)━━━━!!
% foreach x (1 2 3)^Jecho $x^Jend
とかでいけました。これは詰りエスケープシークエンスで改行コードを入れるのか。
C-v C-mだと^JでC-v C-jだと^Mが入力されるな…。