最近、Jump Host がすべてのデバイスとやり取りできるようになりました。これは 6.x で、root アクセス権がありません。スクリプトは Autoexpect と bash のみで実行できます。モジュールは使用できません。
ソース: デバイスが 5000 台あります (1 行に 1 台、引数はそれぞれ 3 つ - 場所、ホスト名、IP - タブで区切られています)。
タスク: 場所 (ARGV1) ごとにすべてのデバイスを検索し (たとえば 5000 個、1 つの場所に 40 個)、出力を一時ファイルにリダイレクトし (出力なし、エコーはオフ)、一時ディレクトリ内の各デバイスに対してコマンドを実行します。出力は、IP ではなく、HostName ARGV2 に対して行われます。
たとえば、tmp 内の各デバイスに ping を実行して各ホストに対して成功を返すか、各デバイスにログインしてコマンドを実行し、ホストに対して結果を出力して、tmp ファイル内の次のデバイスに移動します。
入力ファイル構造の例:
AA Torp1 1.1.1.1
AA Torp2 2.2.2.2
BB Torp97 9.9.9.9
たとえば、AA の場所から各デバイスに ping を実行したいとします。スクリプトをcat hosts.txt | grep AA
tmp に作成し、各 IP に ping を実行すると1.1.1.1
、2.2.2.2
出力は次のようになります。
Torp1 pingが成功した場合はOK Torp2 pingが成功しなかった場合はNOK
これは基本的な例です。つまり、場所に基づいて grep された各 IP に対して、ssh コマンドを実行して出力を印刷し、tmp ファイルを削除します。
答え1
これを行う簡単な方法はwhile read
ループを使用することです。一般的な形式は次のとおりです。
while read var1 var2 ... varN; do something; done < inputFile
デフォルトでは、各入力行は空白で分割されるため、基本的には次のものが必要です。
while read location hostname ip; do
printf "Ping of $hostname ($ip): "
ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED"
done < ips.txt
または、特定の場所だけに限定するには:
grep location ips.txt | while read location hostname ip; do
printf "Ping of $hostname ($ip): "
ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED"
done
このファイルでこれをテストすると:
location1 example.com 93.184.216.34
location2 google.com 8.8.8.8
location1 bad.com 123.456.7.8
我々が得る:
$ grep -w "^$location" ips.txt |
while read location hostname ip; do
printf "Ping of $hostname ($ip): ";
ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED";
done
Ping of example.com (93.184.216.34): OK
Ping of bad.com (123.456.7.8): FAILED