
.txt ファイルには IP アドレスのリストがあります。例:
1.1.1.1
2.2.2.2
3.3.3.3
各IPアドレスの後にはサーバーがあり、各サーバーのポート22で実行されるSSHDがあります。すべてのサーバーがリストにあるわけではありませんknown_hosts
(私のPCではUbuntu 10.04 LTS / bash)。
これらのサーバーでコマンドを実行して出力を収集するにはどうすればよいですか?
理想的には、すべてのサーバーでコマンドを並列に実行したいと思います。
すべてのサーバーで公開鍵認証を使用します。
以下はいくつかの潜在的な落とし穴です。
- ssh は、指定されたサーバー SSH キーを自分の
known_hosts
ファイルに入れるように求めます。 - 指定されたコマンドは、出力が無効である可能性があることを示すゼロ以外の終了コードを返すことがあります。私はこれを実現しなければならない。
- たとえば、ネットワーク障害により特定のサーバーへの接続が確立されない場合があります。
- コマンドの実行に予想以上に時間がかかる場合、またはコマンドの実行中にサーバーにエラーが発生した場合は、タイムアウトが必要です。
サーバーはAIX / kshです(しかしそれは重要ではないと思います)。
答え1
答え2
好きならPythonスクリプトは
bash
スクリプト以上です。構造あなたに適したツールかもしれません。
~からファブリックホームページ:
Fabric は、アプリケーションのデプロイやシステム管理作業のための SSH の使用を簡素化するように設計された Python (2.5 以降) ライブラリであり、コマンドラインツールです。
これは、ローカルまたはリモートのシェルコマンド(通常またはsudoを介して)を実行し、ファイルをアップロード/ダウンロードするための基本的な作業セットだけでなく、ユーザー入力メッセージの表示や中断などの補助機能も提供します。
一般的な用途には、1つ以上の機能を含むPythonモジュールを作成し、fabコマンドラインツールを介して実行することが含まれます。
答え3
psshや他のソフトウェアをインストールできないと仮定すると、次のことができます。
tmpdir=${TMPDIR:-/tmp}/pssh.$$
mkdir -p $tmpdir
count=0
while IFS= read -r userhost; do
ssh -n -o BatchMode=yes ${userhost} 'uname -a' > ${tmpdir}/${userhost} 2>&1 &
count=`expr $count + 1`
done < userhost.lst
while [ $count -gt 0 ]; do
wait $pids
count=`expr $count - 1`
done
echo "Output for hosts are in $tmpdir"
答え4
非常に基本的な設定:
for host in $(cat hosts.txt); do ssh "$host" "$command" >"output.$host"; done
認証に名前/パスワードを使用することは本当に良い考えではありません。これには秘密鍵を設定する必要があります。
ssh-keygen && for host in $(cat hosts.txt); do ssh-copy-id $host; done