Недавно у меня была интересная задача — пингануть несколько хостов одновременно. Для многих это может показаться тривиальным из-за множества инструментов, которые позволяют это сделать, но загвоздка в том, что хосты находятся за SSH-прокси, и у меня нет возможности дополнительный софт.
Еще по теме: Виртуальный номер для приема СМС
Как пинговать несколько хостов одновременно
Для решения этой задачи потребуется:
- cat — позволяет прочитать IP-адреса из CSV-файла.
- xargs — для распараллеливания заданий ping.
- bash — для создания сессии bash для каждого задания ping.
- ssh — для выполнения ping через прокси.
- echo — для вывода сообщений на экран.
Как на прямую пинговать несколько хостов
Давайте рассмотрим простой случай. Необходимо пингануть несколько хостов, которые доступны напрямую. Это можно сделать с помощью доп. инструментов, но я предлагаю не устанавливать лишний софт.
Создаем файл с именем server.csv и добавляем хосты, которые необходимо пингануть:
1 2 3 4 |
server1 server2 server3 server4 |
После чего выполняем команду:
1 |
cat servers.csv | xargs -I {} -P8 bash -c "ping -c4 {} &> /dev/null && echo {}:success || echo {}:fail" |
Ожидаемый результат, если все хосты доступны, будет таким:
1 2 3 4 |
server1:success server2:success server3:success server4:success |
Если один или несколько хостов не пингуются:
1 2 3 4 |
server1:success server2:success server3:fail server4:success |
Это работает следующим образом:
- cat передает содержимое server.csv в xargs.
- xargs запускает команду bash -c «», все, что находится между «», будет выполнено bash.
- Параметр -I указывает xargs заменить {} каждой строкой из файла server.csv.
- Параметр -P8 создает 8 параллельных процессов xargs.
- Команда ping -c4 {} отправляет 4 пакета ICMP на имя хоста/ip, которые заменят {}
- &> /dev/null это перенаправит все stdout и stderr из ping в /dev/null, чтобы скрыть любой вывод ping с экрана.
- && echo {}:success || echo {}:fail, если ping удалось получить ответ ping от хоста, тогда он отобразит имя/ip хоста и добавит к нему success (успешное соединение), если ему не удастся, отобразит имя/ ip хоста и добавит к нему fail (соединение не удалось).
Как пинговать несколько хостов под SSH-прокси
В моем случае имя прокси-сервера ssh — proxy01. В таком случае нужно внести следующие изменения в предыдущую команду:
1 |
cat servers.csv | xargs -P8 -I {} bash -c "ssh proxy01 'ping -c4 {} &> /dev/null && echo {}:success || echo {}:fail'" |
Я добавил в команду ssh proxy01 ''. Команда подключится к серверу proxy01 и выполнит команды ping, как вы можете видеть, изменений немного, но в результате все команды теперь выполняются из proxy01, у которого есть доступ к хостам, которые я хочу пингануть.
Полезные заметки:
- -P — изменение этого параметра изменяет количество параллельных заданий.
- -c4 — изменение этого параметра изменит количество посылаемых на хост ICMP (пинг-пакетов).
- ssh — может принимать множество различных параметров, которые я не использовал. Например, имя пользователя; если вы не используете ключи ssh. Он запросит у вас пароль, если вы не используете инструмент sshpass.
На этом все. Теперь вы знаете, как пинговать несколько хостов одновременно. Надеюсь, статья была интересной и полезной.
РЕКОМЕНДУЕМ: