複数のホストをループしてsshし、それぞれで一連のコマンドを実行する必要があります。
何かのようなもの:
for i in $(jot -w '%02.0f' 14 1)
>do ssh user@Host$i Sudo -i "command1; command2; command3"
>done
しかし、私はそれを正しく動作させることができません。 Sudo sh -c
、Sudoへのパイピングなど、Googleでさまざまなことを見てきましたが、理解できません。
;
jot -w
は、Linuxのseq -f
とほぼ同等です。前もって感謝します!
引用を正しくするのはかなり面倒だと思います。代わりに、パイプを介してリモートホストでbashするコマンドを渡す傾向があります。このようにして、sshコマンドラインでエスケープを正しく行うことを心配する必要はありません。インタラクティブに接続した場合に入力する内容を正確にパイプに渡すだけです。
CMDS="Sudo bash -c '/usr/bin/id; /usr/bin/id; '/usr/bin/id"
for i in 0 1; do
echo $CMDS | ssh -t Host$i bash
done
どちらが戻る
uid=0(root) gid=0(root) groups=0(root)
uid=0(root) gid=0(root) groups=0(root)
uid=0(root) gid=0(root) groups=0(root)
引用符で囲まれたコマンド文字列をsshに渡そうとすることは、常に課題です。表示されるエラーメッセージの種類については言及していませんが、ここにいくつかの考えがあります。
多くのシステムのデフォルトのSudo構成では、セッションに有効なTTYが関連付けられている必要があります。これには、(a)「-t」オプションを指定してsshを呼び出すか、(b)Sudo構成から「requiretty」オプションを削除する必要があります。
これは私にとってはうまくいきます(宛先はRHEL5システムのセットです):
for i in 0 1; do
ssh -t Host$i Sudo -i "echo one; echo two; echo 'three four'"
done
これにより、次のようになります。
one
two
three four
Connection to Host0 closed.
one
two
three four
Connection to Host1 closed.
この種のことを頻繁に行うと、生活が楽になるさまざまなツールがあります。
などなど。私は通常、自分でシェルスクリプトを使用します。
pssh はあなたが扱う必要があるものだと思います。
http://sourceforge.net/projects/clusterssh/
これは明らかに勝者です:D
BatchLoginを見てください:
http://batchlogin.sourceforge.net/
BatchLoginは、さまざまな環境でサーバーへの接続をシリアル形式で管理できるようにするフリーソフトウェア(GPL)ライセンスツールです。これには制限がありますが、ほとんどの場合、「ゾーン」(iDMZ、DMZなど)の複雑さに関係なく、任意のスクリプトまたはデータファイルを複数のサーバー環境間で自動的に転送および実行できます。これは、シェルスクリプトとサーバーへのアクセスを「管理者ごと」に簡単に管理できる方法で行われます。