Bash | Txt-Datei > tmp > Prozess tmp > Ausgabe

Bash | Txt-Datei > tmp > Prozess tmp > Ausgabe

Vor kurzem haben wir Jump Host dazu gebracht, mit all unseren Geräten zu interagieren. Es ist rot, hatte 6.x und wir haben keinen Root-Zugriff. Wir können nur auf Autoexpect und Bash scripten – keine Module möglich.

Quelle: Ich habe 5000 Geräte (1 pro Zeile, jeweils 3 Argumente – Standort, Hostname, IP – und sie sind durch Tabulatoren getrennt).

Aufgabe: Suche nach allen Geräten pro Standort (ARGV1) (sagen wir 5000, 40 wären für einen Standort), leite die Ausgabe in eine temporäre Datei um (keine Ausgabe, Echo aus) und führe einen Befehl für jedes Gerät im temporären Verzeichnis aus. Die Ausgabe sollte für Hostname ARGV2 erfolgen, nicht für IP.

Sagen wir „Pingen Sie jedes Gerät im temporären Speicherort“ und geben Sie für jeden Host eine Erfolgsmeldung zurück, oder melden Sie sich bei jedem Gerät an, führen Sie den Befehl aus, geben Sie das Ergebnis für den Host aus und wechseln Sie zum nächsten in der temporären Datei.

Beispiel für die Struktur einer Eingabedatei:

AA Torp1 1.1.1.1 
AA Torp2 2.2.2.2
BB Torp97 9.9.9.9

Angenommen, Sie möchten jedes Gerät vom Standort AA aus anpingen. Wie schreibe ich das cat hosts.txt | grep AAan tmp und pinge dann beispielsweise jede IP an, 1.1.1.1und 2.2.2.2die Ausgabe lautet:

Torp1 OK, wenn Ping erfolgreich ist. Torp2 NOK, wenn Ping nicht ok.

Dies ist das grundlegende Beispiel … oder sagen wir, für jede IP wird basierend auf dem Standort gesucht, SSH, führen Sie den Befehl aus, drucken Sie die Ausgabe und entfernen Sie dann die temporäre Datei.

Antwort1

Der einfachste Weg hierfür ist die Verwendung einer while readSchleife. Das allgemeine Format ist:

while read var1 var2 ... varN; do something; done < inputFile

Standardmäßig wird jede Eingabezeile an Leerzeichen getrennt, sodass dies im Wesentlichen bereits alles ist, was Sie benötigen:

while read location hostname ip; do
    printf "Ping of $hostname ($ip): "
    ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED"
done < ips.txt

Oder zur Beschränkung auf einen bestimmten Standort:

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

Wenn wir dies mit dieser Datei testen:

location1 example.com 93.184.216.34
location2 google.com 8.8.8.8
location1 bad.com 123.456.7.8

Wir bekommen:

$ 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

verwandte Informationen