シェルスクリプト:同じドメインのサーバーにログインしてコマンドを実行して終了します。

シェルスクリプト:同じドメインのサーバーにログインしてコマンドを実行して終了します。

私は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または)の場合、非常に簡潔な出力のために冗長すぎます。たとえば、私のホームネットワークでは:uptimedshbak

# 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 -gpdsh -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 -auname -aすべてのサーバーで実行されます。 Server1とServer2でのみ実行されます pdsh -g web uptime。サーバー 1、2、5、6 で実行されます。など。uptimepdsh -g web,mysql df -h /df

しかし、1つの奇妙なことは、基本的に代わりに使用されるようにpdsh構成されていることです。rshssh

  1. -R sshpdshコマンドラインで使用してください(例:pdsh -R ssh -w server[0-9] ...
  2. export PDSH_RCMD_TYPE=ssh走る前にpdsh
  3. 永続的なデフォルトにecho ssh > /etc/pdsh/rcmd_default設定するには実行してください。ssh

配布用にパッケージされていない場合は、pdshLLNLにあります。https://computing.llnl.gov/linux/pdsh.html


同じことができる他のツールもいくつかありますpdsh。そのうちのいくつかを使ってみた結果、一般的に設定して使用するのが面倒でした。 pdsh動作するには、ほぼゼロまたは最小限の設定が必要です。

関連情報