Bash | テキストファイル > tmp> プロセス tmp> 出力

Bash | テキストファイル > tmp> プロセス tmp> 出力

最近、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 AAtmp に作成し、各 IP に ping を実行すると1.1.1.12.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

関連情報