Jak mogę pingować wiele adresów IP jednocześnie?


22

Zdaję sobie sprawę z metod, w których można uruchomić forpętlę Bash i pingwiele serwerów, czy istnieje narzędzie Linux CLI, którego mogę użyć, co pozwoli mi to zrobić bez konieczności pisania skryptu Bash na pingliście serwerów pojedynczo?

Coś takiego:

$ ping host1 host2 host3

UWAGA: Szukam konkretnie CentOS / Fedory, ale jeśli działa na innych dystrybucjach, to też jest w porządku.


8
Dlaczego robisz to przeciwko jednemu liniowemu skryptowi - pięknu i filozofii Linuksa ;-)? (Miej małe, proste programy i sam napisz klej na specjalne potrzeby.)
Peter - Przywróć Monicę

1
O wiele łatwiej jest zainstalować pakiet z repozytorium niż skopiować skrypt na ponad 2000 maszyn wirtualnych 8-). Mogę łatwo napisać dla siebie rozwiązanie skryptowe. Również odkąd sam na to odpowiedziałem, tworzę zawartość w Internecie, ponieważ mam użytkowników, którzy proszą o jedno polecenie cmd kontra skrypt powłoki i nie udało im się znaleźć prostej odpowiedzi na to, co postrzegają jako podstawowe pytanie.
slm

3
Jeśli masz zamiar wykonać wielokrotny ping z ponad 2000 maszyn wirtualnych, ... Nadal mogę tylko podrapać się w głowę
Hagen von Eitzen

@HagenvonEitzen - nie, instaluję oprzyrządowanie na ponad 2000 maszynach wirtualnych, aby użytkownicy mieli do dyspozycji takie narzędzia.
slm

1
Dlaczego miałbyś tego potrzebować?
Tvde1

Odpowiedzi:


32

Jeśli spojrzysz na projekt NMAP, zobaczysz, że zawiera on dodatkowe narzędzia nmap. Jednym z tych narzędzi jest nping, która obejmuje następującą zdolność:

Nping ma bardzo elastyczny i wydajny interfejs wiersza poleceń, który zapewnia użytkownikom pełną kontrolę nad generowanymi pakietami. Funkcje Nping obejmują:

  • Niestandardowe generowanie pakietów TCP, UDP, ICMP i ARP.
  • Obsługa specyfikacji wielu hostów docelowych.
  • Obsługa specyfikacji wielu portów docelowych.
  • ...

nping jest w standardowych repozytoriach EPEL do uruchomienia.

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

Stosowanie

Aby wysłać ping do wielu serwerów, wystarczy podać npingnazwy / adresy IP i jakiego protokołu chcesz użyć. Ponieważ chcemy naśladować tradycyjny pinginterfejs CLI, użyjemy 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

Jedyną wadą, jaką znalazłem w tym narzędziu, jest użycie trybu ICMP wymagającego uprawnień roota.

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

3
Co z tym wyjściem? Statystyki mówią, że wysłał 2 do każdego hosta, ale poprzednie dane pokazują, że wysłał 3 do scanme.nmap.org (45.33.32.156) i 1 do google.com (64.233.177.100). To mi się też zdarza, kiedy go uruchamiam.
JoL

4
Leży ... (oczywiście, ponieważ jest niespójny z samym sobą). Po uruchomieniu z funkcją strace widzę, że wysyła polecenie ping do google.com, ale wyświetla wiersz informujący, że wysłał go do scanme.nmap.org. Ciekawy błąd. Jednak nie zawsze tak się dzieje.
JoL

nmapobsługuje również ICMP bezpośrednio, określając opcję -sn. Zobacz moją odpowiedź, aby poznać szczegóły.
scai

@scai - dzięki za Twój A'er. Znalazłem to również podczas badania tego. Uważam, że moje podejście jest najczystsze.
slm

1
„Jedyną wadą, jaką znalazłem w tym narzędziu, jest korzystanie z trybu ICMP wymagającego uprawnień roota”. Tak, to interesująca rzecz, ale ma ona związek z możliwościami (przynajmniej w Linuksie; możesz także wykonać setuid exec dla roota). Nie to, że polecam użycie setcap lub nadanie mu setuid ....
Pryftan

18

fping jest w pakiecie Fedory o tej samej nazwie i pozwala na wiele hostów lub zestaw adresów 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 wyśle ​​pakiet ping i przejdzie do następnego celu w sposób okrężny ... jeśli cel odpowie, zostanie to odnotowane i usunięte z listy


9
oping host1 host2 host3

Opis:

oping używa pakietów ICMP (lepiej znanych jako „pakiety ping”) do testowania osiągalności hostów sieciowych. Obsługuje pingowanie wielu hostów równolegle przy użyciu IPv4 i / lub IPv6 w sposób przezroczysty.

Ten pakiet zawiera dwie aplikacje wiersza poleceń: „oping” zastępuje narzędzia takie jak ping (1), ping6 (1) i fping (1). „noping” to narzędzie oparte na ncurses, które wyświetla statystyki podczas pingowania i podkreśla nieprawidłowe czasy podróży w obie strony.


Po prostu pedantyczny: technicznie ICMP służy ogólnie do zgłaszania błędów i ma wiele różnych możliwości. W rzeczywistości ping używa typów ICMP ECHO_REQUEST / ECHO_REPLY (8 dla poprzedniego iirc, ale minęło dużo czasu - i jestem zbyt leniwy, aby to sprawdzić). Być może opis, który zacytowałeś, dotyczy w rzeczywistości samego wyboru, ale tak czy inaczej nie jest ściśle poprawny (lub jest o wiele bardziej uproszczony niż powinien być ... A może nie, myślę, że dla wielu jest to prawdopodobnie lepsze, ale i tak nie dla mnie ).
Pryftan


6

Wiem, że nie jest to dokładnie to, o co prosisz, ale skrypt bash, aby to osiągnąć:

#!/bin/bash

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

wait

Spowoduje to przyjęcie punktów końcowych jako argumentów wiersza poleceń i wysłanie każdemu z nich polecenia ping 5 zliczeń jako procesu w tle, a następnie poczekanie na zakończenie wszystkich przed wyjściem. Wydrukuje trzy ostatnie wiersze wyniku pingowania, który zawiera przydatne statystyki dotyczące wskaźnika powodzenia i opóźnienia.


3
Nie musisz pamiętać pid. Prosty waitbędzie czekał na wszystkie aktywne procesy potomne, dzięki czemu można uniknąć drugiej pętli. Myślę, że jednym z powodów, dla których poproszono go, aby nie wymagał pisania skryptu bash, jest posiadanie rozwiązania, które działa na dowolnej maszynie bez konieczności noszenia ze sobą lub pisania skryptu. Krótko mówiąc wydaje się bardziej sprzyjające, więc uważam, że lepiej unikać tego przypisywania argumentów i po prostu zrobić to for host; dow pierwszej pętli. Gdyby to było zsh, można uniknąć do, a donei tak zrobić, interatively:for host in google.com; ping -c5 "$host" |& tail -3 & wait
Jol

4
Pułapka SIGINT uczyniłaby ten skrypt o wiele bardziej praktycznym.
Gilles „SO- przestań być zły”

2
Do interaktywnego wykorzystania, to jest po prostu za pomocą polecenia tła (tj command &) w podpowłoce (tj zawijania z parens) i waitpołączyć dowolną liczbę poleceń w jedno polecenie sztucznego, na przykład: (for f in google.com yahoo.com microsoft.com; do ping $f & done; wait). Ich dane wyjściowe będą przeplatane, a kiedy ctrl + c to po tym poleceniu, wszystkie trzy procesy potomne zostaną zabite. Powłoka ma wiele potężnych konstrukcji kontroli zadań i jest to jedna z nich.
Lie Ryan,

2
Dziękuje wszystkim. Tak, wahałem się, czy to opublikować, ale wydaje mi się, że pytania dotyczą nie tylko OP, ale wszystkich, którzy mają podobny problem i myślę, że będą ludzie, którzy natkną się na to pytanie i nie będą chcieli instalować dodatkowego oprogramowania wykonać zadanie.
Jesse_b

@JoL Ale z pewnością te narzędzia nie są domyślnie instalowane na wszystkich hostach. To oczywiście nie oznacza, że ​​to, co mówisz, jest nieprawdziwe, ale ...
Pryftan

2

Myślę, że to może ci pomóc?

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

Wykorzystuje on printfzdolność do „auto-iteracji” swoich argumentów, ponownie wykorzystując ciąg formatu dla każdego argumentu. Dlatego powyższe printftworzy sekwencję ping <hostname> &ciągów znaków dla każdego hosta podaną jako argument i przekazuje taką sekwencję poleceń poprzez zastąpienie evalpolecenia do polecenia, aby je natychmiast wykonać.

printfa evalpolecenia są standardem POSIX, a także zastępowanie poleceń.

Zawarcie całej takiej komendy w podpowłoce zawierającej i-ed waittakie jak to:

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

zapewnia możliwość przerwania wszystkiego w prosty sposób Ctrl+C.

W przeciwnym razie możesz kontrolować każde pingpolecenie osobno poprzez zwykłą kontrolę zadań powłoki.

Jeśli twoja powłoka obsługuje także zastępowania procesów, możesz także użyć następujących poleceń:

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

o kilka znaków mniej do wpisania.

Istota jest taka sama jak dla eval, ale przekazuje sekwencję pings do polecenia .(aka source) poprzez podstawienie procesu.


2

Nmap obsługuje skanowanie pingów (ICMP) i wiele hostów:

nmap -sn -n 127.0.0.1 8.8.8.8

Możesz także utworzyć plik zawierający wszystkie docelowe adresy IP (oddzielone spacjami lub znakami nowej linii) targets.txt. Następnie uruchomić:

nmap -sn -n -iL targets.txt

Opcje wyjaśnione:

  • -sn Ping Scan.
  • -n Wyłącz rozpoznawanie DNS.
  • -iL Nazwa pliku wejściowego.

Inne interesujące opcje na wypadek, gdybyś chciał pingować naprawdę dużą liczbę celów:

  • -T4 Zwiększ czas, aby skrócić czas skanowania.
  • --min-parallelism 100 Zwiększ liczbę równoległych sond.
  • -oG <file> Zapisz wyniki skanowania do pliku w formacie Grepable.

Bez tworzenia pliku

Pamiętaj, że możesz również zrezygnować z tworzenia pliku i użyć a, -aby pobrać dane wejściowe z potoku |lub tradycyjnymi metodami przekierowywania danych wyjściowych za pomocą STDIN.

Przykłady:

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

-lub-

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

-lub-

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

Referencje


2

Za pomocą wspólnej xargskomendy zbuduj wiele pingżądań:

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

Gdzie host1 host2 host3może być zmienna liczba hostów (dowolna kombinacja adresu IP lub nazwy hosta).

To zmienia xargswartości domyślne, aby wymusić 1 argument wejściowy na wykonanie polecenia ping i pozwolić na nieograniczoną liczbę równoległych procesów potomnych (1 na hosta). Prawdopodobnie rozsądnie jest ustawić -P(aka --max-procs) na rozsądną wartość, jeśli zamierzasz pingować dużą liczbę hostów (wszystkie zostaną przetworzone; tylko kilka jednocześnie).

Jest wystarczająco krótki, aby używać go bezpośrednio, może zostać dodany jako funkcja do profilu powłoki lub pliku rc lub przekształcony w mały skrypt w twoim $PATH. W poniższych przykładach -Pustawiono wartość 10, aby uniknąć nadmiernego zużycia zasobów.

Przykładowy skrypt: /usr/bin/mping

#!/bin/sh

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

Przykładowa funkcja w obrębie ~/.bashrc

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

I użyj jako:

mping host1 host2 host3 ...

1
Możesz rozważyć użycie opcji -w 2, aby ping nie czekał dłużej niż 2 sekundy. Domyślnie jest to 10 sekund, co odpowiada wywołaniu polecenia ping, więc jego ukończenie może potrwać ponad 30 sekund.
Criggie

1
Tak, to dobry pomysł, jeśli pinguje więcej hostów niż ustawiłeś dla --max-procs/ -P. Jednak w przypadku mniejszej liczby hostów -Pwszystkie pingi są wykonywane równolegle - co oznacza, że ​​zajmie to tyle czasu, ile pojedyncze wykonanie ping, a nie ich suma.
Jason Musgrove

1

Nie wiem dokładnie, czego chcesz, ale możesz zmienić ostatni zestaw 8 bitów na liczbę dziesiętną 255, więc twoje hosty otrzymają transmisję, w rzeczywistości wyśle ​​pakiety ping do wszystkich urządzeń, które istnieją w sieci.

ping -c 1 xx.xx.xx.255

1
Nie tego szukam.
slm

8
Witamy na stronie - to dobra myśl i pokazuje zrozumienie Broadcast IP i jego celu w sieci IP i jest całkowicie poprawne. Jednak nie spełnia specyficznych wymagań OP w tym wąsko zdefiniowanym przypadku. Proszę, kontynuujcie i odpowiedzcie na inne pytania.
Criggie

0
ping google.com && ping localhost

Wydajność

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

Wadami tego są 1), że &&operator zezwala na uruchomienie drugiego polecenia tylko wtedy, gdy pierwsze polecenie zakończy się powodzeniem, (tj. Kod wyjścia 0) I 2) pierwszy ping nigdy się nie skończy bez ^ C, aby go przerwać. Rozważ dodanie parametru -c i -w. Witamy na stronie!
Criggie

-1

Tylko dla zabawy i zysku ...

#!/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

Można to łatwo poprawić. Co sprawia, że ​​jest całkiem przydatny. :)

Aby uzyskać dodatkowe opcje, zobacz strony podręcznika dla poleceń bsd ping i ping systemu Linux

HTH

EDYCJA: nieznacznie zaktualizowana, aby zakończyć zapytania ping po 6 pingów i dodać opcje strony podręcznika.


Pierwsze pingpołączenie nigdy nie powraca, chyba że napotka błąd krytyczny.
Gilles „SO- przestań być zły”

Naprawdę? Przetestowałem to przed opublikowaniem go tutaj i działało zgodnie z opisem. Wiesz, że nie każdy host zareaguje na pingowanie. Być może gospodarze, których pytałeś, nie odpowiadali. W każdym przypadku. Aby zapewnić szybszą informację zwrotną, ograniczyłem zapytania do 6 żądań na hosta.
ktoś

2
Teraz przynajmniej skrypt ma szansę na zakończenie w praktyce. Ale bez paralelizmu jest nadal całkiem bezużyteczne. Jeśli pierwszy host zareaguje, użytkownik nie otrzyma żadnych informacji o innych hostach przez pierwsze 5 sekund.
Gilles „SO- przestań być zły”

Cóż, miał to być bardziej przykład, na którym można budować, zgodnie z potrzebami. Mogę z łatwością stworzyć inny, który w pełni nasyci Twoją fajkę. Ale czy naprawdę tego chcesz? :)
ktoś

1
Co ja powinien zrobić jest stworzenie link do strony ping człowieka. Szczerze. Stworzyłem go tylko jako łatwy szablon, który można łatwo modyfikować na własne potrzeby. ping działa drastycznie inaczej w różnych systemach operacyjnych i pod wieloma różnymi warunkami sieciowymi, w których może pracować każda osoba. Dlatego nie ma „idealnej” wartości domyślnej dla wszystkich. Każda z nich ma swoje „słodkie miejsce”. :) Czy wspomniałem, że działa dla mnie idealnie? ;)
ktoś

-2

Użyj poniższego prostego polecenia:

$ 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.