Як я можу пінг декількох IP-адрес одночасно?


22

Мені відомо про методи, де можна запустити forцикл Bash і pingкілька серверів, чи є інструмент Linux CLI, який я можу використовувати, який дозволить мені це робити, не вдаючись до написання сценарію Bash до pingсписку серверів по одному?

Щось на зразок цього:

$ ping host1 host2 host3

ПРИМІТКА. Я шукаю спеціально для CentOS / Fedora, але якщо він працює і в інших дистрибутивах, це теж добре.


8
Чому ви проти маленького однолінійного сценарію робити це - краса та філософія Linux ;-)? (Майте невеликі, прості програми та пишіть клей для особливих потреб самостійно.)
— Пітер - Відновіть Моніку

1
Набагато простіше встановити пакет з репо-копіювання, скопіювавши сценарій у 2000+ VM 8-). Я міг би легко написати сценарій для себе. Крім того, оскільки я відповів на це самостійно, я створюю вміст в Інтернеті, оскільки у мене є користувачі, котрі запитують єдину програму cmd vs.
— slm

3
Якщо ваш намір зробити мульти-пінг з 2000+ віртуальних машин, ... я все одно можу почухати голову
— Хаген фон Ейтцен

@HagenvonEitzen - ні, я встановлюю інструменти на 2000+ VM, щоб користувачі мали доступ до них інструментів.
— 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, що вимагає привілеїв root.

$ nping -c 2 --icmp scanme.nmap.org google.com
Mode ICMP requires root privileges.

3
Що з цим виходом? Статистика говорить про те, що він надсилав 2 кожному хосту, але попередній результат показує, що він надіслав 3 на scanme.nmap.org (45.33.32.156) та 1 на google.com (64.233.177.100). Це трапляється і зі мною, коли я його запускаю.
— JoL

4
Він лежить ... (звичайно, хоча, оскільки він суперечить собі). Запускаючи його з strace, я бачу, як він надсилає ping на google.com, але виводить рядок із повідомленням про те, що він надіслав його на scanme.nmap.org. Цікавий клоп. Однак це не завжди буває.
— JoL

nmapтакож підтримує ICMP безпосередньо, вказавши параметр -sn. Детальну інформацію див. У моїй відповіді .
— scai

@scai - дякую за ваш А'ер. Я також виявив це, вивчаючи це. Я знайшов свій підхід найчистішим.
— slm

1
"Єдиний недолік, який я знайшов у цьому інструменті, - це використання режиму ICMP, що вимагає привілеїв root". Так, це цікава річ, але вона пов'язана з можливостями (принаймні в Linux; ви також можете зробити setuid exec для root). Не те, що я рекомендую використовувати setcap або дати йому
— встановити

18

fping знаходиться в однойменному пакеті Fedora і дозволяє отримати багато хостів або набір ip addressses.

$ 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 вишле пакет пінг і перейде до наступної цілі в круговій манері ... якщо ціль відповість, вона відзначається та видаляється зі списку


9
oping host1 host2 host3

Опис:

oping використовує пакети ICMP (більш відомий як "пакети пінг") для перевірки доступності мережевих хостів. Він підтримує синхронізування декількох хостів паралельно, використовуючи IPv4 та / або IPv6 прозоро.

Цей пакет містить два програми командного рядка: "oping" - це заміна таких інструментів, як ping (1), ping6 (1) і fping (1). "noping" - це інструмент на основі ncurses, який відображає статистику під час пінгу та підкреслює відмінні часи обходу.


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


6

Я знаю, що це конкретно не те, про що ви просите, а баш сценарій для цього:

#!/bin/bash

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

wait

Це спричинить ваші кінцеві точки як аргументи командного рядка та надішле кожний пінг з 5 рахунками як фоновий процес, а потім зачекайте, поки все закінчиться перед виходом. Він надрукує останні три рядки виводу ping, які містять корисні статистичні дані щодо рівня успішності та затримки.


3
Не потрібно пам’ятати про прищах. Простий waitбуде чекати всіх активних дочірніх процесів, тому ви можете уникнути другого циклу. Я думаю, що частиною причини, по якій просили не вимагати написання bash-скрипту, є рішення, яке працює на будь-якій машині без необхідності переносити або писати сценарій. Зробити це коротко, здається, сприятливішим, тому я вважаю, що краще уникнути цього присвоєння аргументу і просто зробити це for host; doу першому циклі. Якби це було zsh, ви могли б уникнути doта doneі просто робити, 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
Дякую всім. Так, я вагався, як це опублікувати, але я вважаю, що питання Q / A тут не тільки для ОП, але для всіх, хто відчуває подібну проблему, і я думаю, що будуть люди, які натрапляють на це питання і не хочуть встановлювати додаткове програмне забезпечення виконати завдання.
— Jesse_b

@JoL Але, безумовно, ці інструменти не встановлені за замовчуванням на всіх хостах. Це, звичайно, не робить те, що ви говорите, неправдою, але ...
— Прифтан

2

Я думаю, це може зробити для вас?

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

Він використовує printfможливість "автоматичного повторення" своїх аргументів, використовуючи повторно його рядок формату для кожного аргументу. Отже, вищезазначене printfстворює послідовність ping <hostname> &рядків для кожного хоста, наданого як аргумент, і подає таку послідовність команд через Command Substitution до 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) через Process Substitution.


2

Nmap підтримує сканування пінг (ICMP) та декілька хостів:

nmap -sn -n 127.0.0.1 8.8.8.8

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

nmap -sn -n -iL targets.txt

Параметри пояснено:

  • -sn Ping Scan.
  • -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'

Список літератури


2

Використовуючи загальну xargsкоманду для створення декількох pingзапитів:

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

Де host1 host2 host3може бути змінна кількість хостів (будь-яка комбінація IP або імені хоста).

Це змінює параметри xargsза замовчуванням, щоб змусити 1 вхідний аргумент на виконання ping, а також дозволить необмежену кількість паралельних дочірніх процесів (1 на хостинг-пінг). Мабуть, розумно встановити -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+ секунд.
— Criggie

1
Так, це гарна ідея, якщо надіслати більше хостів, ніж ви встановили для --max-procs/ -P. Однак, для кількості хостів менше, ніж -Pвсі пінг- файли виконуються паралельно - це означає, що це займе стільки часу, скільки виконання одного найдовшого пінгу, а не сума їх усіх.
— Jason Musgrove

1

Я не знаю, що саме ви хочете, але ви могли змінити останні 8 бітових наборів на десяткову 255, тому ваші хости отримають трансляцію, насправді він передаватиме пакети ping на всі пристрої, які існують у мережі.

ping -c 1 xx.xx.xx.255

1
Це не те, що я шукаю.
— slm

8
Ласкаво просимо на сайт. Це добре продумане і показує розуміння широкомовної IP-адреси та її мети в мережі IP, і цілком коректно. Однак це не відповідає конкретній вимозі ОП у цьому вузько визначеному випадку. Будь ласка, продовжуйте і маєте тріщини, відповідаючи на інші питання.
— Кріггі

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

Мінуси цього полягають у тому, що 1) &&оператор дозволяє виконувати другу команду лише в тому випадку, коли перша команда успішно виконана (тобто код виходу 0) та 2) перший ping ніколи не закінчиться без ^ C, щоб перервати її. Подумайте про додавання параметрів -c та -w. Ласкаво просимо на сайт!
— Criggie

-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

Це можна легко покращити. Що робить його досить корисним. :)

Щоб отримати додаткові параметри, перегляньте довідкові сторінки для bsd ping та Linux ping

HTH

EDIT: трохи оновлений, щоб припинити запити ping @ 6 пінгерів кожен, і додати параметри man page.


Перший pingвиклик ніколи не повертається, якщо не трапиться до фатальної помилки.
— Жил "ТАК - перестань бути злим"

Дійсно? Я перевірив це, перш ніж розміщувати його тут, і він працював, як описано. Ви знаєте, що не кожен хост відповість на пінг. Можливо, господарі, яких ви запитували, не відповідали. У будь-якому випадку. Прагнучи надати швидший зворотній зв'язок, я обмежив запити до 6 запитів на хоста.
— хтось

2
Тепер принаймні сценарій має шанс закінчитись на практиці. Але без паралелізму все ще досить марно. Якщо перший хост відповідає, користувач не отримує жодної інформації про інших хостів протягом перших 5 секунд.
— Жиль "ТАК - перестань бути злим"

Ну, це покликане було бути більше прикладом, на якому потрібно будувати, як потрібно. Я міг би легко створити ще одну, яка повністю наситить вашу трубу. Але це те, що ви насправді хочете? :)
— хтось

1
Що я повинен був зробити, це створити посилання на сторінку ping man. Чесно. Я створив його лише як простий шаблон для того, щоб легко змінити за власні кошти. 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.