web-dev-qa-db-ja.com

複数のホストへのsshとSudoの複数のコマンド

複数のホストをループして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でさまざまなことを見てきましたが、理解できません。

  • パスワードなしでSudoを実行できる通常のユーザーとしてsshを実行しています(rootとしてのsshは有効になっていません)
  • command1が0を返さなくても、command2の実行などが妨げられることはないため、;
  • 私はMacからループを実行しているので、jot -wは、Linuxのseq -fとほぼ同等です。
  • centOS5.4へのSSH接続
  • Rootの$ PATHで実行したいので、コマンドへのフルパスを指定する必要はありませんが、完全に必要というわけではありません。

前もって感謝します!

2
carillonator

引用を正しくするのはかなり面倒だと思います。代わりに、パイプを介してリモートホストで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)
6
Zoredache

引用符で囲まれたコマンド文字列を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.

この種のことを頻繁に行うと、生活が楽になるさまざまなツールがあります。

などなど。私は通常、自分でシェルスクリプトを使用します。

6
larsks

pssh はあなたが扱う必要があるものだと思います。

1
adamo

http://sourceforge.net/projects/clusterssh/

これは明らかに勝者です:D

0
Arenstar

BatchLoginを見てください:

http://batchlogin.sourceforge.net/

BatchLoginは、さまざまな環境でサーバーへの接続をシリアル形式で管理できるようにするフリーソフトウェア(GPL)ライセンスツールです。これには制限がありますが、ほとんどの場合、「ゾーン」(iDMZ、DMZなど)の複雑さに関係なく、任意のスクリプトまたはデータファイルを複数のサーバー環境間で自動的に転送および実行できます。これは、シェルスクリプトとサーバーへのアクセスを「管理者ごと」に簡単に管理できる方法で行われます。

0
Hans