
私は10個のUnixサーバーを持っていて、1つずつログインして4〜5行のコードを実行し、出力を保存して終了しようとしています。
例:10コピー:
最初はxyzサーバーで
サーバー1へのログイン - >行4〜5の実行 - > xyzサーバーへの出力の送信 - >終了
サーバー2へのログイン - >行4〜5の実行 - > xyzサーバーへの出力の送信 - >終了
....
サーバー10へのログイン - >行4〜5の実行 - > xyzサーバーへの出力の送信 - >終了
最後にファイルがXYZサーバに出力されます。
たとえば、時間を1時間に巻き戻す、新しい時間を出力として使用し、新しい時間を次の形式でxyzサーバー上のファイルに保存するなど、いくつかの時間コマンドを実行したいと思います。
Server Name New Time
=========== =========
Server1 Date and Time
Server2 Date and Time
答え1
元の質問には多くの説明がなかったので、次のように推測します。
次のように、SSH 経由でリモート呼び出しを実行して、リモートサーバーでコマンドを実行できます。
result=`ssh -t server1.mydomain.com "commands;separated;by;semicolons --with-args" > log-on-xyz.log 2>&1` echo "$result"
リスト内の各サーバーを繰り返してこれを行います。最後に、ログ出力を画面に表示して削除できます。
コマンドをセミコロンで区切って「接続」することで、パラメーターを使用できます。また、リモート呼び出しでローカル変数をパラメータとして使用できます。
編集:これはBASHスクリプトですが、少し変更すると他の言語でも機能します。
答え2
一部の情報が欠落しているため、質問は不明です。これまでの内容を試してみましょう。 10個のサーバーIPアドレスが192.168.1.11..192.168.1.20であるとします。
#!/bin/bash
for host in 192.168.1.{11..20}
do
echo "#############################################################################"
echo "$host:"
# check if host is alive, if positive, then execute command in remote server
ssh -q -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=quiet user@$host exit
if [ $? -ne 0 ];then
echo -e "\033[0;101m\033[1;37mOFFLINE\033[0m"
else
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=quiet user@$host "execute_command"
fi
done
シェルスクリプトを保存し、stdoutとstderrをログファイルにリダイレクトします。
./script.sh &> log.txt
答え3
Install を実行しpdsh
た後、次のコマンドを実行できます。
pdsh -w server[0-9],server10 'command1 ; command2 ;... ; command5' > logfile.txt
注:各サーバーのパスワードを入力したくない場合は、リモートサーバーにAuthorized_keyをインストールする必要があります。必要に応じて、環境変数を使用して、PDSH_SSH_ARGS
使用するIDファイル(-i
)を含むSSHオプションを指定できます。
コマンドが実行されます平行にすべてのサーバーで、対応する出力が混在しています(ホスト名は各出力行の前に追加されます)。ホストで区切られた正しい形式の出力を表示するために使用できるpdsh
ユーティリティdshbak
:
dshbak logfile.txt | less
または、ログファイルにリダイレクトする前にdshbakを介してパイプすることもできます。
pdsh -w server[0-9],server10 'command1 ; command2 ;... ; command5' |
dshbak > logfile.txt
IMOソースログファイルを保存し、必要に応じて使用する方が良いですが、dshbak
それは主観的な好みです。 1行の出力のみを生成するリモートコマンド(例:uname
または)の場合、非常に簡潔な出力のために冗長すぎます。たとえば、私のホームネットワークでは:uptime
dshbak
# pdsh -g all uptime
kali: 12:03:18 up 33 days, 23 min, 3 users, load average: 0.21, 0.06, 0.06
hanuman: 12:03:37 up 10 days, 21:59, 2 users, load average: 0.04, 0.05, 0.05
indra: 12:02:57 up 13 days, 1:12, 3 users, load average: 0.30, 0.26, 0.30
ganesh: 12:03:10 up 6 days, 10:11, 6 users, load average: 1.18, 1.34, 1.35
名前付きファイルにホストとホストグループを定義し、代わりに/etc/genders
ホストグループを指定できます。たとえば、次のファイルを使用します。pdsh -g
pdsh -w
/etc/genders
server1 all,web
server2 all,web
server3 all,mail
server4 all,mail
server5 all,mysql
server6 all,mysql
pdsh -g all uname -a
uname -a
すべてのサーバーで実行されます。 Server1とServer2でのみ実行されます pdsh -g web uptime
。サーバー 1、2、5、6 で実行されます。など。uptime
pdsh -g web,mysql df -h /
df
しかし、1つの奇妙なことは、基本的に代わりに使用されるようにpdsh
構成されていることです。rsh
ssh
-R ssh
pdshコマンドラインで使用してください(例:pdsh -R ssh -w server[0-9] ...
export PDSH_RCMD_TYPE=ssh
走る前にpdsh
- 永続的なデフォルトに
echo ssh > /etc/pdsh/rcmd_default
設定するには実行してください。ssh
配布用にパッケージされていない場合は、pdsh
LLNLにあります。https://computing.llnl.gov/linux/pdsh.html
同じことができる他のツールもいくつかありますpdsh
。そのうちのいくつかを使ってみた結果、一般的に設定して使用するのが面倒でした。 pdsh
動作するには、ほぼゼロまたは最小限の設定が必要です。