あるときネットワーク越しにいろいろなことやりたくて、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メソッド)