Bash | Текстовый файл > tmp> процесс tmp> вывод

Bash | Текстовый файл > tmp> процесс tmp> вывод

Недавно мы заставили Jump Host взаимодействовать со всеми нашими устройствами. Он красный, у него 6.x, и у нас нет прав root. Мы можем писать скрипты только на Autoexpect и bash — модули невозможны.

Источник: У меня есть 5000 устройств (по одному в строке, по 3 аргумента каждое — Местоположение, Имя хоста, IP — и они разделены табуляцией).

Задача: Поиск всех устройств в каждом местоположении (ARGV1) (например, out 5000, 40 будет для одного местоположения), перенаправление вывода во временный файл (без вывода, echo выключен) и запуск команды для каждого устройства во временном каталоге. Вывод должен быть для HostName ARGV2, а не IP.

Например, выполните команду ping для каждого устройства в файле tmp и верните успешный результат для каждого хоста или войдите в каждое устройство, выполните команду, выведите результат для хоста и перейдите к следующему устройству в файле tmp.

Пример структуры входного файла:

AA Torp1 1.1.1.1 
AA Torp2 2.2.2.2
BB Torp97 9.9.9.9

Скажем, вы хотите пинговать каждое устройство из локации AA. Как мне написать скрипт cat hosts.txt | grep AAдля tmp, а затем пинговать каждый IP, например, 1.1.1.1и 2.2.2.2вывод:

Torp1 OK, если пинг успешен Torp2 NOK, если пинг не удался

Это простой пример... или, скажем, для каждого 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

Связанный контент