Wie kann ich mehrere IP-Adressen gleichzeitig anpingen?

22

Mir sind die Methoden bekannt, mit denen Sie eine Bash- forSchleife und pingmehrere Server ausführen können. Es gibt ein Linux-CLI-Tool, mit dem ich dies tun kann, ohne ein Bash-Skript auf pingeine Liste von Servern schreiben zu müssen eins nach dem anderen?

Etwas wie das:

$ ping host1 host2 host3

HINWEIS: Ich suche speziell nach CentOS / Fedora, aber wenn es auf anderen Distributionen funktioniert, ist das auch in Ordnung.

slm
quelle
8
Warum bist du gegen ein kleines Einzeiler-Skript, das das macht - die Schönheit und Philosophie von Linux ;-)? (Haben Sie kleine, einfache Programme und schreiben Sie den Kleber für spezielle Bedürfnisse selbst.)
Peter - Setzen Sie Monica
1
Es ist viel einfacher, ein Paket von einem Repository zu installieren, als ein Skript auf mehr als 2000 VMs zu kopieren. 8-). Ich könnte leicht eine Skriptlösung für mich selbst schreiben. Da ich dies selbst beantwortete, erstelle ich Inhalte im Internet, da ich Benutzer habe, die nach einem einzelnen Cmd oder einem Shell-Skript fragen und es nicht geschafft haben, eine einfache Antwort auf das zu finden, was sie als grundlegendes Q ansehen.
slm
3
Wenn Sie ab 2000 VMs einen Multi-Ping durchführen möchten, ... kann ich mich immer noch nur am Kopf kratzen
Hagen von Eitzen,
@HagenvonEitzen - nein, ich installiere Tools auf über 2000 VMs, damit die Benutzer Tools zur Verfügung haben, um dies zu tun.
slm
1
Warum brauchst du das?
Tvde1,

Antworten:

32

Wenn Sie sich das NMAP-Projekt ansehen, werden Sie feststellen, dass es zusätzliche Tools zusätzlich zu nur enthält nmap. Eines dieser Tools npingumfasst die folgenden Funktionen:

Nping verfügt über eine sehr flexible und leistungsstarke Befehlszeilenschnittstelle, über die Benutzer die vollständige Kontrolle über generierte Pakete erhalten. Zu den Funktionen von Nping gehören:

  • Benutzerdefinierte Generierung von TCP-, UDP-, ICMP- und ARP-Paketen.
  • Unterstützung für mehrere Zielhostspezifikationen.
  • Unterstützung für die Spezifikation mehrerer Zielports.
  • ...

nping ist in den Standard-EPEL-Repos zu booten.

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

Verwendung

Um mehrere Server zu pingen, müssen Sie lediglich npingdie Namen / IPs und das zu verwendende Protokoll angeben. Da wir hier nachahmen möchten, was die traditionelle pingCLI tut, verwenden wir 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

Der einzige Nachteil, den ich bei diesem Tool festgestellt habe, ist die Verwendung des ICMP-Modus, für den Root-Berechtigungen erforderlich sind.

$ nping -c 2 --icmp scanme.nmap.org google.com
Mode ICMP requires root privileges.
slm
quelle
3
Was ist mit dieser Ausgabe? Den Statistiken zufolge wurden 2 an jeden Host gesendet, die vorherige Ausgabe zeigt jedoch, dass 3 an scanme.nmap.org (45.33.32.156) und 1 an google.com (64.233.177.100) gesendet wurden. Das passiert mir auch, wenn ich es leite.
15.
4
Es lügt ... (natürlich, da es nicht mit sich selbst übereinstimmt). Wenn ich es mit strace ausführe, kann ich sehen, dass es einen Ping an google.com sendet, aber eine Zeile ausgibt, die besagt, dass es an scanme.nmap.org gesendet wurde. Interessanter Bug. Das passiert aber nicht immer.
JoL
nmapUnterstützt auch ICMP direkt durch Angabe der Option -sn. Siehe meine Antwort für Details.
17.
@scai - danke für deine A'er. Das habe ich auch gefunden, als ich das recherchiert habe. Ich fand meinen Ansatz am saubersten.
slm
1
"Der einzige Nachteil, den ich bei diesem Tool festgestellt habe, ist die Verwendung des ICMP-Modus, für den Root-Berechtigungen erforderlich sind." Ja, das ist eine interessante Sache, hat aber mit den Fähigkeiten zu tun (zumindest unter Linux; Sie könnten auch setuid exec für root ausführen). Nicht, dass ich setcap empfehlen oder setuid geben würde ...
Pryftan
18

fping ist in einem gleichnamigen Fedora-Paket enthalten und ermöglicht viele Hosts oder eine Reihe von IP-Adressen.

$ 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 sendet ein Ping-Paket und wechselt im Round-Robin-Verfahren zum nächsten Ziel. Wenn ein Ziel antwortet, wird es notiert und aus der Liste entfernt

meuh
quelle
9
oping host1 host2 host3

Beschreibung:

oping verwendet ICMP-Pakete (besser bekannt als "Ping-Pakete"), um die Erreichbarkeit von Netzwerkhosts zu testen. Es unterstützt das parallele Pingen mehrerer Hosts mithilfe von IPv4 und / oder IPv6 auf transparente Weise.

Dieses Paket enthält zwei Befehlszeilenanwendungen: "oping" ist ein Ersatz für Tools wie ping (1), ping6 (1) und fping (1). "noping" ist ein auf ncurses basierendes Tool, das beim Pingen Statistiken anzeigt und abweichende Umlaufzeiten hervorhebt.

GAD3R
quelle
Um pedantisch zu sein: Technisch gesehen dient ICMP im Allgemeinen der Fehlerberichterstattung und verfügt über viele verschiedene Funktionen. Tatsächlich verwendet ping die ICMP-Typen ECHO_REQUEST / ECHO_REPLY (8 für das frühere iirc, aber es ist lange her - und ich bin zu faul, um das zu überprüfen). Vielleicht ist die Beschreibung, die Sie zitieren, eigentlich für das Oping selbst, aber so oder so ist sie nicht genau richtig (oder sie ist viel einfacher als es sein sollte) ).
Pryftan,
7

Ich würde vorschlagen, GNU Parallel zu verwenden

parallel -u ping ::: host1 host2 host3

Die Ausgabe wird verschachtelt

Diaa Sami
quelle
6

Ich weiß, dass es nicht das ist, wonach Sie fragen, sondern ein Bash-Skript, um dies zu erreichen:

#!/bin/bash

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

wait

Dadurch werden Ihre Endpunkte als Befehlszeilenargumente verwendet, und es wird jeweils ein Ping mit 5 Zählern als Hintergrundprozess gesendet. Warten Sie, bis alle beendet sind, bevor Sie das Programm beenden. Es werden die letzten drei Zeilen der Ping-Ausgabe gedruckt, die nützliche Statistiken zur Erfolgsrate und Latenz enthalten.

Jesse_b
quelle
3
Sie müssen sich nicht an die Pids erinnern. Ein einfaches waitwartet auf alle aktiven untergeordneten Prozesse, sodass Sie die zweite Schleife vermeiden können. Ich denke, ein Grund, warum es nicht erforderlich war, ein Bash-Skript zu schreiben, ist, eine Lösung zu haben, die auf jedem Computer funktioniert, ohne ein Skript mit sich herumtragen oder schreiben zu müssen. Es scheint günstiger zu sein, es kurz zu halten, also würde ich es besser finden, diese Argumentzuweisung zu vermeiden und es einfach for host; doin Ihrer ersten Schleife zu tun . Wenn dies zsh wäre, könnten Sie das dound vermeiden doneund nur interaktiv tun:for host in google.com; ping -c5 "$host" |& tail -3 & wait
JoL
4
Eine SIGINT-Falle würde dieses Skript viel praktischer machen.
Gilles 'SO - hör auf böse zu sein'
2
Für die interaktive Nutzung, das einfach ist , mit Hintergrund - Befehl (dh command &) in einer Subshell (dh Verpackung mit Pars) und mit einem waitbeliebigen Anzahl von Befehlen in einen künstlichen Befehl, zum Beispiel zu kombinieren: (for f in google.com yahoo.com microsoft.com; do ping $f & done; wait). Ihre Ausgaben werden verschachtelt, und wenn Sie nach diesem Befehl Strg + C drücken, werden alle drei untergeordneten Prozesse beendet. Die Shell verfügt über eine Vielzahl leistungsfähiger Job-Control-Konstrukte, und dies ist eines davon.
Lie Ryan
2
Vielen Dank an alle. Ja, ich habe gezögert, es zu veröffentlichen, aber ich denke, die hier aufgeführten Fragen / Antworten sind nicht nur für OP, sondern für alle, die ein ähnliches Problem haben, und ich denke, es wird Leute geben, die über diese Frage stolpern und keine zusätzliche Software installieren möchten um die aufgabe zu erfüllen.
Jesse_b
@JoL Diese Tools sind jedoch nicht standardmäßig auf allen Hosts installiert. Das stimmt natürlich nicht, aber ...
Pryftan,
2

Ich nehme an, das kann für Sie tun?

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

Es nutzt printfdie Möglichkeit, die Argumente automatisch zu iterieren, während die Formatzeichenfolge für jedes Argument erneut verwendet wird. Das Obige printferzeugt daher eine Folge von ping <hostname> &Zeichenfolgen für jeden als Argument bereitgestellten Host und leitet diese Folge von Befehlen durch evalBefehlsersetzung an den Befehl weiter, damit sie sofort ausgeführt werden.

printfund evalBefehle entsprechen dem POSIX-Standard sowie der Befehlssubstitution.

Füge den gesamten Befehl in eine Subshell ein, die ein und-ed waitwie folgt enthält :

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

bietet die Möglichkeit, alles mit einem einfachen nach Belieben zu unterbrechen Ctrl+C.

Ansonsten können Sie jeden pingBefehl einzeln über die normale Jobsteuerung der Shell steuern.

Wenn Ihre Shell auch Process Substitutions unterstützt, können Sie auch Folgendes verwenden:

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

für ein paar Zeichen weniger tippen.

Der Inhalt ist derselbe wie bei der eval, aber er gibt die Sequenz von pings über die Prozessersetzung an den .(aka source) -Befehl weiter.

LL3
quelle
2

Nmap unterstützt Ping-Scans (ICMP) und mehrere Hosts:

nmap -sn -n 127.0.0.1 8.8.8.8

Sie können auch eine Datei erstellen, die alle Ihre Ziel-IPs enthält (durch Leerzeichen oder Zeilenumbrüche getrennt) targets.txt. Dann renne:

nmap -sn -n -iL targets.txt

Optionen erklärt:

  • -sn Ping-Scan.
  • -n Deaktivieren Sie die DNS-Auflösung.
  • -iL Dateiname eingeben.

Weitere interessante Optionen für den Fall, dass Sie eine sehr große Anzahl von Zielen anpingen möchten:

  • -T4 Erhöhen Sie das Timing, um die Scan-Dauer zu verkürzen.
  • --min-parallelism 100 Erhöhen Sie die Anzahl der parallelen Sonden.
  • -oG <file> Schreiben Sie die Scanergebnisse in eine Datei im Grepable-Format.

Ohne eine Datei zu erstellen

Denken Sie daran, dass Sie auch auf die Erstellung einer Datei verzichten und a verwenden können -, um Eingaben entweder über eine Pipe |oder über herkömmliche Methoden zum Umleiten von Ausgaben über STDIN zu erhalten.

Beispiele:

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

-oder-

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

-oder-

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

Verweise

scai
quelle
2

Verwenden Sie den allgemeinen xargsBefehl, um mehrere pingAnforderungen auszuführen :

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

Dabei host1 host2 host3kann es sich um eine variable Anzahl von Hosts handeln (eine beliebige Kombination aus IP-Adresse oder Hostname).

Dies ändert die xargsStandardeinstellungen, um 1 Eingabeargument pro Ping-Ausführung zu erzwingen und eine unbegrenzte Anzahl von parallelen untergeordneten Prozessen zuzulassen (1 pro Ping-Host). Es ist wahrscheinlich ratsam, -P(auch bekannt als --max-procs) einen vernünftigen Wert festzulegen, wenn Sie eine große Anzahl von Hosts anpingen möchten (alle werden verarbeitet, nur weniger gleichzeitig).

Es ist kurz genug, um es direkt zu verwenden, kann als Funktion zu Ihrem Shell-Profil oder Ihrer RC-Datei hinzugefügt oder in Ihrem Skript in ein winziges Skript verwandelt werden $PATH. In den folgenden Beispielen -Pwurde auf 10 gesetzt, um einen übermäßigen Ressourcenverbrauch zu vermeiden.

Beispielskript: /usr/bin/mping

#!/bin/sh

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

Beispielfunktion innerhalb ~/.bashrc

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

Und verwenden Sie als:

mping host1 host2 host3 ...
Jason Musgrove
quelle
1
Sie können -w 2 verwenden, um Ping nicht länger als 2 Sekunden warten zu lassen. Der Standardwert beträgt 10 Sekunden, was einem Ping-Aufruf entspricht. Daher kann dieser Vorgang mehr als 30 Sekunden dauern.
Criggie
1
Ja, das ist eine gute Idee, wenn Sie mehr Hosts anpingen, als Sie für --max-procs/ festgelegt haben -P. Bei einer Host-Anzahl von weniger als -Pwerden jedoch alle Pings parallel ausgeführt. Dies bedeutet, dass nicht die Summe aller Pings, sondern die Dauer der längsten einzelnen Ping-Ausführung beträgt.
Jason Musgrove
1

Ich weiß nicht genau, was Sie wollen, aber Sie können die letzten 8 Bit in die Dezimalzahl 255 ändern, damit Ihre Hosts eine Übertragung empfangen. Tatsächlich werden Ping-Pakete an alle Geräte in einem Netzwerk gesendet.

ping -c 1 xx.xx.xx.255
CriticalSYS
quelle
1
Das ist nicht was ich suche.
slm
8
Willkommen auf der Website - Dies ist ein guter Gedanke und zeigt ein Verständnis der Broadcast-IP und ihres Zwecks in einem IP-Netzwerk und ist völlig korrekt. Es entspricht jedoch nicht den spezifischen Anforderungen von OP in diesem eng definierten Fall. Machen Sie bitte weiter und haben Sie ein Händchen für die Beantwortung anderer Fragen.
Criggie
0
ping google.com && ping localhost

Ausgabe

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
quelle
Ein Nachteil davon ist, dass 1) der &&Operator die Ausführung des zweiten Befehls nur zulässt, wenn der erste Befehl erfolgreich ausgeführt wurde (z. B. der Beendigungscode 0). Erwägen Sie, einen -c- und einen -w-Parameter hinzuzufügen. Willkommen auf der Seite!
Criggie
-1

Nur zum Spaß und Profit ...

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

Dies könnte leicht verbessert werden. Das macht es ziemlich nützlich. :)

Weitere Optionen finden Sie in den Manpages für bsd ping und Linux ping

HTH

BEARBEITEN: Leicht aktualisiert, um die Ping-Abfragen mit jeweils 6 Pings zu beenden und Manpage-Optionen hinzuzufügen.

jemandem
quelle
Der erste pingAufruf wird nur zurückgegeben, wenn ein schwerwiegender Fehler auftritt.
Gilles 'SO - hör auf böse zu sein'
"Ja wirklich?" Ich habe das getestet, bevor ich es hier gepostet habe, und es hat wie beschrieben funktioniert. Sie wissen, dass nicht jeder Host auf einen Ping reagiert. Möglicherweise haben die von Ihnen abgefragten Hosts nicht geantwortet. Auf jeden Fall. In dem Bestreben, schnelleres Feedback zu geben, habe ich die Abfragen auf 6 Anfragen pro Host beschränkt.
Jemand
2
Jetzt hat das Skript zumindest die Chance, in der Praxis zu enden. Aber ohne Parallelität ist es immer noch ziemlich nutzlos. Wenn der erste Host antwortet, erhält der Benutzer in den ersten 5 Sekunden keine Informationen zu den anderen Hosts.
Gilles 'SO - hör auf böse zu sein'
Nun, dies sollte eher ein Beispiel sein, auf das man aufbauen kann, wie man es braucht. Ich könnte leicht eine andere erschaffen, die deine Pfeife voll ausfüllt. Aber suchen Sie das wirklich? :)
jemand
1
Was ich hätte tun sollen , ist einen Link zur Ping-Manpage zu erstellen. Ehrlich. Ich habe es nur als einfache Vorlage erstellt, die sich leicht für eigene Zwecke ändern lässt. ping funktioniert auf verschiedenen Betriebssystemen und unter den unzähligen Netzwerkbedingungen, unter denen die einzelnen Benutzer möglicherweise arbeiten, drastisch anders. Es gibt also keinen "perfekten" Standard für alle. Jeder hat seinen eigenen "Sweet Spot". :) Habe ich schon erwähnt, dass es bei mir perfekt funktioniert? ;)
jemand
-2

Verwenden Sie den folgenden einfachen Befehl:

$ 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
Kevin Li
quelle