特定のホストのリストを実行し、これらのホストで特定のコマンドを実行する簡単なスクリプトを作成しました。スクリプトは基本的に次のようになります。
while read host; do
ssh -f $user@$host $@
echo < servers
スクリプトを実行して、stdinからの行を「リッスン」し、$@ではなくループで実行できるようにしたいと思います。スクリプトは通常の終了(ctrl + c)によって動作を停止します。
何か案が?
私が質問を正しく読んでいるなら、あなたは一連のコマンドをたくさんのサーバーに送りたいと思うでしょう。それらはすべて単独で渡されます。
このためには、内側のループを外側の読み取りループでラップする必要があります。似たようなもの:
while read command; do
while read host; do
ssh -f $user@$host "$command"
echo
done < servers
done
実行時にコマンドを入力すると、すべてのサーバーで実行されます。リモートシステムに送信されるシェルエスケープ文字の問題を解決することは、開発者にとっての課題です。
あなたのスクリプトはすでにそれを行っています!それがどのように機能するかを理解してください-それをsome.bashファイルに保存するだけです:
user="myuser"
while read host; do
ssh -f $user@$host $@
done
$ @は、コマンドラインから残りのパラメーターを追加することを意味します。noneを使用すると、noneが追加されます。
read hostは、単語だけでなく、行を読み取ります。
つまり、基本的に、実行すると次のようになります。
www.somehost.com -> ssh -f myuser@www.somehost.com www.somehost.comその他のパラメータ -> ssh-fmyuser@www.somehost.comその他のパラメーター