Как я могу пинговать несколько IP-адресов одновременно?

22

Я знаю о методах, где вы можете запустить forцикл Bash и pingнесколько серверов, есть ли инструмент CLI для Linux, который я могу использовать, что позволит мне сделать это без необходимости писать сценарий Bash для pingсписка серверов один за раз?

Что-то вроде этого:

$ ping host1 host2 host3

ПРИМЕЧАНИЕ: я специально искал CentOS / Fedora, но если он работает и на других дистрибутивах, это тоже хорошо.

SLM
источник
8
Почему вы против небольшого однострочного сценария, делающего это - красота и философия Linux ;-)? (Имейте небольшие, простые программы и пишите клей для особых нужд самостоятельно.)
Питер - Восстановите Монику
1
Гораздо проще установить пакет из репозитория, чем копировать скрипт на 2000+ виртуальных машин 8-). Я мог бы легко написать решение для сценария для себя. Кроме того, так как я сам ответил на это, я создаю контент в Интернете, так как у меня есть пользователи, которые просят один cmd вместо сценария оболочки и не смогли найти простой ответ на вопрос, который они воспринимают как базовый Q.
SLM
3
Если ваше намерение состоит в том, чтобы сделать мульти-пинг из более чем 2000 виртуальных машин, ... я все еще могу только почесать голову
Хаген фон Айцен
@HagenvonEitzen - нет, я устанавливаю инструменты на более чем 2000 виртуальных машин, чтобы у пользователей были инструменты для этого.
SLM
1
Зачем вам это нужно?
Tvde1

Ответы:

32

Если вы посмотрите на проект NMAP, то обнаружите, что он включает в себя дополнительные инструменты помимо всего прочегоnmap . Одним из таких инструментов является npingследующее:

Nping имеет очень гибкий и мощный интерфейс командной строки, который предоставляет пользователям полный контроль над сгенерированными пакетами. Особенности Nping включают в себя:

  • Генерация пользовательских пакетов TCP, UDP, ICMP и ARP.
  • Поддержка нескольких целевых спецификаций хоста.
  • Поддержка нескольких целевых портов.
  • ...

nping находится в стандартном репозитории EPEL для загрузки.

$ repoquery -qlf nmap.x86_64 | grep nping
/usr/bin/nping
/usr/share/man/man1/nping.1.gz

использование

Чтобы пропинговать несколько серверов, вам нужно просто указать npingимена / IP-адреса и какой протокол вы хотите использовать. Здесь, поскольку мы хотим имитировать то, что pingделает традиционный CLI, мы будем использовать ICMP.

$ sudo nping -c 2 --icmp scanme.nmap.org google.com

Starting Nping 0.7.70 ( https://nmap.org/nping ) at 2019-06-14 13:43 EDT
SENT (0.0088s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=1] IP [ttl=64 id=57921 iplen=28 ]
RCVD (0.0950s) ICMP [45.33.32.156 > 10.3.144.95 Echo reply (type=0/code=0) id=42074 seq=1] IP [ttl=46 id=24195 iplen=28 ]
SENT (1.0091s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=2] IP [ttl=64 id=57921 iplen=28 ]
SENT (2.0105s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=2] IP [ttl=64 id=57921 iplen=28 ]
RCVD (2.0107s) ICMP [45.33.32.156 > 10.3.144.95 Echo reply (type=0/code=0) id=42074 seq=2] IP [ttl=46 id=24465 iplen=28 ]
SENT (3.0138s) ICMP [10.3.144.95 > 64.233.177.100 Echo request (type=8/code=0) id=49169 seq=2] IP [ttl=64 id=57921 iplen=28 ]

Statistics for host scanme.nmap.org (45.33.32.156):
 |  Probes Sent: 2 | Rcvd: 2 | Lost: 0  (0.00%)
 |_ Max rtt: 86.053ms | Min rtt: 0.188ms | Avg rtt: 43.120ms
Statistics for host google.com (64.233.177.100):
 |  Probes Sent: 2 | Rcvd: 0 | Lost: 2  (100.00%)
 |_ Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 4 (112B) | Rcvd: 2 (108B) | Lost: 2 (50.00%)
Nping done: 2 IP addresses pinged in 3.01 seconds

Единственный недостаток, который я обнаружил в этом инструменте, - это использование режима ICMP, требующего прав суперпользователя.

$ nping -c 2 --icmp scanme.nmap.org google.com
Mode ICMP requires root privileges.
SLM
источник
3
Что с этим выходом? Статистика говорит, что он отправил 2 каждому хосту, но предыдущий вывод показывает, что он отправил 3 на scanme.nmap.org (45.33.32.156) и 1 на google.com (64.233.177.100). Это происходит и со мной, когда я запускаю его.
JoL
4
Это ложь ... (конечно, так как она сама по себе несовместима). При запуске его с помощью strace я вижу, что он отправляет пинг на google.com, но выводит строку, сообщающую, что он отправил его на scanme.nmap.org. Интересная ошибка. Хотя это не всегда происходит.
JoL
nmapтакже поддерживает ICMP напрямую, указав параметр -sn. Смотрите мой ответ для деталей.
Scai
@scai - спасибо за твой A'er. Я нашел это также, исследуя это. Я нашел свой подход, чтобы быть самым чистым.
SLM
1
«Единственный недостаток, который я обнаружил в этом инструменте, - это использование режима ICMP, требующего прав суперпользователя». Да, это интересно, но это связано с возможностями (по крайней мере, в Linux; вы также можете сделать setuid exec для root). Не то, чтобы я рекомендовал использовать setcap или дать ему setuid ....
Pryftan
18

fping находится в пакете Fedora с тем же именем и допускает множество хостов или набор IP-адресов.

$ fping -a -A -c 1 hosta hostb
192.168.0.20 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.64/0.64/0.64
192.168.1.3  : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.50/0.50/0.50

fping отправит пакет проверки связи и перейдет к следующей цели в циклическом порядке ... если цель отвечает, она отмечается и удаляется из списка

meuh
источник
9
oping host1 host2 host3

Описание:

Опция использует пакеты ICMP (более известные как «пинг-пакеты») для проверки достижимости сетевых узлов. Он поддерживает пинг нескольких хостов параллельно, прозрачно используя IPv4 и / или IPv6.

Этот пакет содержит два приложения командной строки: «oping» является заменой для таких инструментов, как ping (1), ping6 (1) и fping (1). «noping» - это инструмент, основанный на ncurses, который отображает статистику во время пинга и выделяет аберрантное время прохождения туда-обратно.

GAD3R
источник
Просто чтобы быть педантичным: технически ICMP предназначен для сообщений об ошибках в целом, и у него есть много разных возможностей. На самом деле ping использует типы ICMP ECHO_REQUEST / ECHO_REPLY (8 для прежнего iirc, но это было давно - и мне лень это проверять). Может быть, описание, которое вы цитируете, на самом деле относится к самому выбору, но в любом случае оно не совсем корректно (или оно гораздо проще, чем должно быть ... Или, может быть, нет, я думаю, для многих это, вероятно, лучше, но в любом случае не для меня) ).
Прифтан
7

Я бы предложил использовать GNU Parallel

parallel -u ping ::: host1 host2 host3

вывод будет чередоваться

Диаа саами
источник
6

Я знаю, что это конкретно не то, что вы просите, а сценарий bash для этого:

#!/bin/bash

for host; do
    ping -c5 "$host" 2>&1 | tail -3 &
done

wait

Это примет ваши конечные точки в качестве аргументов командной строки и отправит каждому из них пинг с 5 счетами в качестве фонового процесса, а затем дождется завершения всех перед выходом. Он напечатает последние три строки вывода ping, которые содержат полезную статистику о частоте успеха и задержке.

Jesse_b
источник
3
Вам не нужно помнить пидс. Простое waitбудет ждать всех активных дочерних процессов, поэтому вы можете избежать второго цикла. Я думаю, что одна из причин, по которой его попросили не требовать написания сценария bash, заключается в том, что у него есть решение, которое работает на любой машине без необходимости носить с собой или писать сценарий. Делать его коротким кажется более выгодным, поэтому я думаю, что лучше избегать такого назначения аргументов и просто делать это for host; doв первом цикле. Если бы это было ЗШ, вы могли бы избежать doи doneи просто сделать, interatively:for host in google.com; ping -c5 "$host" |& tail -3 & wait
Йол
4
Ловушка SIGINT сделает этот сценарий более практичным.
Жиль "ТАК - прекрати быть злым"
2
Для интерактивного использования, это просто с помощью фоновой команды (то есть command &) в подоболочках (т.е. упаковке с скобками) и waitобъединить любое количество команд в одну команды искусственной, например: (for f in google.com yahoo.com microsoft.com; do ping $f & done; wait). Их выходные данные будут чередоваться, и при нажатии Ctrl + C после этой команды все три дочерних процесса будут уничтожены. Оболочка имеет множество мощных конструкций для управления заданиями, и это одна из них.
Ли Райан
2
Спасибо всем. Да, я не решался опубликовать его, но я полагаю, что вопросы и ответы здесь не только для OP, но и для всех, кто сталкивается с подобной проблемой, и я думаю, что найдутся люди, которые сталкиваются с этим вопросом и не хотят устанавливать дополнительное программное обеспечение. выполнить задачу.
Jesse_b
@JoL Но, конечно, эти инструменты не установлены по умолчанию на всех хостах. Это не делает то, что вы говорите, ложью, конечно, но ...
Прифтан
2

Я полагаю, это может сделать для вас?

eval $(printf 'ping "%s" & ' host1 host2 host3)

Он использует printfспособность «автоматически повторять» свои аргументы, повторно используя строку формата над каждым аргументом. Таким образом, вышеприведенное printfсоздает последовательность ping <hostname> &строк для каждого хоста, представленную в качестве аргумента, и передает такую ​​последовательность команд через подстановку evalкоманд в команду, чтобы они выполнялись немедленно.

printfи evalкоманды стандарт POSIX, а также подстановка команд.

Заключение всей подобной команды в подоболочку, содержащую и-ed, waitнапример:

(eval $(printf 'ping "%s" & ' host1 host2 host3) && wait)

предоставляет возможность прерывать все по желанию с помощью простого Ctrl+C.

Иначе вы можете управлять каждой pingкомандой по отдельности через обычное управление заданиями оболочки.

Если ваша оболочка поддерживает также подстановки процессов, вы также можете использовать следующее:

. <(printf 'ping "%s" & ' host1 host2 host3)

на несколько символов меньше, чтобы напечатать.

Суть та же, что и для eval, но передает последовательность pings в команду .(aka source) через замену процесса.

LL3
источник
2

Nmap поддерживает пинг-сканирование (ICMP) и несколько хостов:

nmap -sn -n 127.0.0.1 8.8.8.8

Вы также можете создать файл, содержащий все ваши целевые IP-адреса (разделенные пробелами или символами новой строки) targets.txt. Затем запустите:

nmap -sn -n -iL targets.txt

Варианты объяснил:

  • -sn Пинг Скан.
  • -n Отключить разрешение DNS.
  • -iL Имя входного файла.

Другие интересные варианты, если вы хотите пропинговать действительно большое количество целей:

  • -T4 Увеличьте время, чтобы уменьшить продолжительность сканирования.
  • --min-parallelism 100 Увеличьте количество параллельных зондов.
  • -oG <file> Записать результаты сканирования в файл в формате Grepable.

Без создания файла

Имейте в виду, что вы также можете отказаться от создания файла и использовать a -для получения ввода либо из канала |, либо с помощью традиционных методов перенаправления вывода через STDIN.

Примеры:

$ ( echo www.google.com; echo www.yahoo.com ) | sudo nmap -sn -n -iL -

-или-

$ sudo nmap -sn -n -iL - < <(echo www.google.com; echo www.yahoo.com)

-или-

$ sudo nmap -sn -n -iL - <<< $'www.google.com\nwww.yahoo.com'

Ссылки

SCAI
источник
2

Используя общую xargsкоманду для построения нескольких pingзапросов:

echo host1 host2 host3 | xargs -n1 -P0 ping -c 4

Где host1 host2 host3может быть переменное количество хостов (любая комбинация IP или имени хоста).

Это изменяет xargsзначения по умолчанию для принудительного ввода 1 входного аргумента на выполнение ping и допускает неограниченное количество параллельных дочерних процессов (1 на хост pinging). Вероятно, было бы целесообразно установить -P(иначе --max-procs) правильное значение, если намеревается пропинговать большое количество хостов (все они будут обработаны; только меньшее количество одновременно).

Он достаточно короткий для непосредственного использования, может быть добавлен как функция в ваш профиль оболочки или rc-файл или превращен в крошечный скрипт в вашем $PATH. В приведенных ниже примерах -Pбыло установлено значение 10, чтобы избежать чрезмерного потребления ресурсов.

Пример скрипта: /usr/bin/mping

#!/bin/sh

echo $@ | xargs -n1 -P10 ping -c4

Пример функции внутри ~/.bashrc

function mping() {
    echo $@ | xargs -n1 -P10 ping -c4
} 

И использовать как:

mping host1 host2 host3 ...
Джейсон Масгроув
источник
1
Вы можете использовать -w 2, чтобы пинг ожидался не более 2 секунд. По умолчанию установлено значение 10 секунд, что соответствует каждому вызову команды ping, так что это может занять более 30 секунд.
Кригги
1
Да, это хорошая идея, если вы пингуете больше хостов, чем вы установили для --max-procs/ -P. Тем не менее, если число узлов меньше -P, все пинги выполняются параллельно - это означает, что это займет столько времени, сколько будет длиться один самый длинный пинг, а не будет суммой их всех.
Джейсон Масгроув
1

Я не знаю, что именно вы хотите, но вы могли бы изменить последние 8 битов в десятичное 255, чтобы ваши хосты получали широковещательную рассылку, фактически она будет передавать пинг-пакеты на все устройства, которые существуют в сети.

ping -c 1 xx.xx.xx.255
CriticalSYS
источник
1
Это не то, что я ищу.
SLM
8
Добро пожаловать на сайт - это хорошая мысль, которая показывает понимание Broadcast IP и его назначения в IP-сети и является полностью правильной. Однако это не соответствует конкретному требованию OP в этом узко определенном случае. Пожалуйста, продолжайте и получите ответ на другие вопросы.
Кригги
0
ping google.com && ping localhost

Выход

Pinging google.com [xxxxxxx] with 32 bytes of data:
Reply from xxxxxxx: bytes=32 time=210ms TTL=49
Reply from ::1: time<1ms
Reply from xxxxxxx: bytes=32 time=212ms TTL=49
Reply from ::1: time<1ms
Reply from xxxxxxx: bytes=32 time=211ms TTL=49
Reply from ::1: time<1ms
Manish
источник
Недостатками этого являются 1) то, что &&оператор разрешает выполнение второй команды только в том случае, если первая команда выполнена успешно (т. Е. Код выхода 0) и 2) первый пинг никогда не закончится, если ^ C не прервет ее. Попробуйте добавить параметры -c и -w. Добро пожаловать на сайт!
Кригги
-1

Просто для удовольствия и выгоды ...

#!/bin/sh -

# sends six "pings" to a list of hosts defined in "hosts" below

hosts="
host.a
host.b
host.c
host.d
host.e
"

for p in $hosts
do
# ONLY CHOOSE ONE OF THE FOLLOWING, NOT BOTH
# dump results to file
    ping -c 6 $p >>./PINGED
# dump output to console
    ping -c 6 $p
done

exit

Это может быть легко улучшено. Что делает его довольно полезным. :)

Для дополнительных опций, пожалуйста, смотрите man-страницы для psd ps и Linux ping

НТН

РЕДАКТИРОВАТЬ: немного обновлено, чтобы завершить пинг-запросы @ 6 пингов каждый, и добавить параметры страницы руководства.

кто-то
источник
Первый pingвызов никогда не вернется, пока не произойдет фатальная ошибка.
Жиль "ТАК - прекрати быть злым"
В самом деле? Я проверил это перед публикацией здесь, и это работало, как описано. Вы знаете, что не каждый хост ответит на пинг. Возможно, запрошенные вами хосты не отвечают. В любом случае. Чтобы обеспечить более быструю обратную связь, я ограничил количество запросов 6 хостами.
кто-то
2
Теперь, по крайней мере, сценарий имеет шанс завершиться на практике. Но без параллелизма это все еще довольно бесполезно. Если первый хост отвечает, пользователь не получает никакой информации о других хостах в течение первых 5 секунд.
Жиль "ТАК - прекрати быть злым"
Ну, это было задумано, чтобы быть больше примером, на котором можно опираться по мере необходимости. Я мог бы легко создать другую, которая полностью насыщает вашу трубу. Но это то, что вы действительно после? :)
кто-то
1
Что я должен был сделать, так это создать ссылку на справочную страницу ping. Честно. Я только создал его как простой шаблон для одного, чтобы легко модифицировать для своих собственных средств. пинг работает резко отличается на разных ОС - х, и под множеством различных условий сети , что каждый человек может работать под. Так что не существует «идеального» дефолта для всех. У каждого свое «сладкое пятно». :) Я уже говорил, что у меня отлично работает? ;)
кто-то
-2

Используйте ниже простую команду:

$ getip(){ ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' 2>&1 | tee >> /tmp/result.log & }
$ getip 'hostname.number1.net'
$ getip 'hostname.number2.net'
$ getip 'hostname.number3.net'
$ getip 'hostname.number4.net'
$ getip 'hostname.number5.net'
$ getip 'hostname.number6.net'
$ getip 'hostname.number7.net'
$ getip 'hostname.number8.net'
$ cat /tmp/result.log
ABC.DEF.GHI.XY1
ABC.DEF.GHI.XY2
ABC.DEF.GHI.XY3
ABC.DEF.GHI.XY4
ABC.DEF.GHI.XY5
ABC.DEF.GHI.XY6
ABC.DEF.GHI.XY7
ABC.DEF.GHI.XY8
Кевин Ли
источник