Як я можу пінг декількох 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.