Come posso eseguire il ping di più indirizzi IP contemporaneamente?


22

Sono a conoscenza dei metodi in cui è possibile eseguire un forloop Bash e pingpiù server, esiste uno strumento della CLI Linux che posso usare che mi permetterà di farlo senza dover ricorrere a scrivere uno script Bash in pingun elenco di server uno alla volta?

Qualcosa come questo:

$ ping host1 host2 host3

NOTA: sto cercando specificamente CentOS / Fedora, ma se funziona anche su altre distro va bene.


8
Perché sei contrario a un piccolo copione da un solo punto: la bellezza e la filosofia di Linux ;-)? (Avere programmi piccoli e semplici e scrivere tu stesso la colla per esigenze speciali.)
Peter - Reinstalla Monica il

1
È molto più semplice installare un pacchetto da un repository rispetto alla copia di uno script su 2000+ VM 8-). Potrei facilmente scrivere una soluzione di script per me stesso. Anche da quando ho risposto autonomamente, sto creando contenuti su Internet poiché ho utenti che chiedono un singolo cmd rispetto a uno script di shell e non sono riusciti a trovare un semplice A'er a ciò che percepiscono come un Q di base.
slm

3
Se il tuo intento è fare un multi-ping da 2000+ VM, ... Posso ancora solo grattarmi la testa
Hagen von Eitzen,

@HagenvonEitzen - No, sto installando strumenti su VM 2000+ in modo che gli utenti abbiano a loro disposizione strumenti per farlo.
slm

1
Perché dovresti averne bisogno?
Tvde1

Risposte:


32

Se guardi al progetto NMAP scoprirai che include strumenti aggiuntivi oltre a Just nmap. Uno di questi strumenti è nping, che include la seguente abilità:

Nping ha un'interfaccia a riga di comando molto flessibile e potente che garantisce agli utenti il ​​pieno controllo sui pacchetti generati. Le caratteristiche di Nping includono:

  • Generazione di pacchetti TCP, UDP, ICMP e ARP personalizzati.
  • Supporto per specifiche host multiple target.
  • Supporto per specifiche di porte multiple target.
  • ...

nping è nei repository EPEL standard per l'avvio.

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

uso

Per eseguire npingil ping su più server devi semplicemente dire i nomi / IP e quale protocollo vuoi usare. Qui dal momento che vogliamo imitare ciò che fa la pingCLI tradizionale useremo 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

L'unico inconveniente che ho riscontrato con questo strumento è l'uso della modalità ICMP che richiede i privilegi di root.

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

3
Cosa c'è con quell'output? Le statistiche dicono che ha inviato 2 a ciascun host, ma l'output precedente mostra che ha inviato 3 a scanme.nmap.org (45.33.32.156) e 1 a google.com (64.233.177.100). Succede anche a me quando lo eseguo.
JoL

4
Si trova ... (ovviamente, poiché non è coerente con se stesso). Eseguendolo con strace, posso vederlo inviare un ping a google.com, ma emettere una riga dicendo che lo ha inviato a scanme.nmap.org. Bug interessante. Non succede sempre, comunque.
JoL

nmapsupporta anche ICMP direttamente specificando l'opzione -sn. Vedi la mia risposta per i dettagli.
scai,

@scai - grazie per il tuo A'er. L'ho trovato anche durante la ricerca di questo. Ho trovato il mio approccio il più pulito.
slm

1
"L'unico inconveniente che ho riscontrato con questo strumento è l'uso della modalità ICMP che richiede i privilegi di root." Sì, è una cosa interessante ma ha a che fare con le capacità (almeno in Linux; potresti anche fare setuid exec per root). Non che consiglio di usare setcap o di dargli setuid ....
Pryftan,

18

fping si trova in un pacchetto Fedora con lo stesso nome e consente a molti host o un set di indirizzi 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 invierà un pacchetto ping e passerà al prossimo obiettivo in modo round robin ... se un bersaglio risponde, viene annotato e rimosso dall'elenco


9
oping host1 host2 host3

Descrizione:

oping utilizza pacchetti ICMP (meglio noti come "pacchetti ping") per testare la raggiungibilità degli host di rete. Supporta il ping di più host in parallelo utilizzando IPv4 e / o IPv6 in modo trasparente.

Questo pacchetto contiene due applicazioni da riga di comando: "oping" sostituisce strumenti come ping (1), ping6 (1) e fping (1). "noping" è uno strumento basato su ncurses che visualizza le statistiche durante il ping e mette in evidenza tempi di andata e ritorno aberranti.


Solo per essere pedanti: tecnicamente ICMP è per la segnalazione di errori in generale e ci sono molte diverse funzionalità che ha. In effetti il ​​ping utilizza i tipi ECHO_REQUEST / ECHO_REPLY di ICMP (8 per l'ex iirc ma è passato molto tempo - e sono troppo pigro per controllare). Forse la descrizione che citi è in realtà per l'operazione stessa, ma in entrambi i casi non è strettamente corretta (o è molto più semplificata di quanto dovrebbe essere ... O forse no, immagino per molti probabilmente è meglio così, ma non per me comunque ).
Pryftan,


6

So che è specificatamente non quello che si sta chiedendo, ma uno script bash per ottenere questo risultato:

#!/bin/bash

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

wait

Questo prenderà i tuoi endpoint come argomenti della riga di comando e invierà un ping di 5 conteggi a ciascuno come processo in background e quindi attenderà il completamento di tutti prima di uscire. Stampa le ultime tre righe dell'output ping che contiene statistiche utili sulla percentuale di successo e sulla latenza.


3
Non è necessario ricordare le offerte. Un semplice waitattenderà tutti i processi figlio attivi, quindi puoi evitare il secondo ciclo. Penso che parte del motivo per cui è stato chiesto di non richiedere la scrittura di uno script bash sia di avere una soluzione che funzioni su qualsiasi macchina senza dover portare in giro o scrivere uno script. Renderlo breve sembra più favorevole, quindi penso che sarebbe meglio evitare quell'assegnazione di argomenti e fare solo for host; donel tuo primo ciclo. Se questo fosse zsh, potresti evitare doe, donee solo fare, for host in google.com; ping -c5 "$host" |& tail -3 & wait
interattivamente

4
Una trappola SIGINT renderebbe questo script molto più pratico.
Gilles 'SO- smetti di essere malvagio' il

2
Per uso interattivo, questo è semplicemente utilizzando il comando di fondo (cioè command &) in una subshell (cioè avvolgimento con parentesi) e waitcombinare qualsiasi numero di comandi in un unico comando artificiale, per esempio: (for f in google.com yahoo.com microsoft.com; do ping $f & done; wait). Le loro uscite saranno interlacciate e quando si preme Ctrl + C dopo questo comando, tutti e tre i processi figlio verranno uccisi. La shell ha molti potenti costrutti di controllo del lavoro e questo è uno di questi.
Sdraiati Ryan il

2
Ringrazia tutti. Sì, ho esitato a pubblicarlo, ma immagino che le domande / risposte qui non siano solo per OP ma per tutti coloro che hanno un problema simile e immagino che ci saranno persone che si imbatteranno in questa domanda e non vorranno installare software aggiuntivo per svolgere il compito.
Jesse_b,

@JoL Ma certamente quegli strumenti non sono installati di default su tutti gli host. Questo non rende ciò che dici falso, ma ...
Pryftan,

2

Suppongo che questo possa fare per te?

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

Sfrutta printfla capacità di "iterare automaticamente" i suoi argomenti riutilizzando la stringa di formato su ogni argomento. Quanto sopra printfproduce quindi una sequenza di ping <hostname> &stringhe per ciascun host fornito come argomento e alimenta tale sequenza di comandi tramite Command Substitution al evalcomando per farli eseguire immediatamente.

printfe i evalcomandi sono standard POSIX, così come la sostituzione dei comandi.

Racchiudendo l'intero comando in una subshell comprendente un and-ed waitcome questo:

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

offre la possibilità di interrompere tutto a piacimento con un semplice Ctrl+C.

Altrimenti puoi controllare ogni pingcomando singolarmente attraverso il normale controllo del lavoro della shell.

Se la shell supporta anche le sostituzioni di processo, è possibile utilizzare anche quanto segue:

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

per pochi caratteri in meno da digitare.

L'essenza è la stessa di eval, ma alimenta la sequenza di pings al comando .(aka source) attraverso la sostituzione del processo.


2

Nmap supporta le scansioni ping (ICMP) e più host:

nmap -sn -n 127.0.0.1 8.8.8.8

Puoi anche creare un file contenente tutti i tuoi IP target (separati da spazi o newline) chiamati targets.txt. Quindi eseguire:

nmap -sn -n -iL targets.txt

Opzioni spiegate:

  • -sn Ping Scan.
  • -n Disabilita la risoluzione DNS.
  • -iL Nome del file di input.

Altre opzioni interessanti nel caso in cui desideri eseguire il ping di un numero davvero elevato di target:

  • -T4 Aumentare i tempi per ridurre la durata della scansione.
  • --min-parallelism 100 Aumenta il numero di sonde parallele.
  • -oG <file> Scrivi i risultati della scansione su file in formato Grepable.

Senza creare un file

Tieni presente che puoi anche rinunciare alla creazione di un file e utilizzare a -per ricevere input da una pipe |o tramite metodi tradizionali per reindirizzare l'output tramite STDIN.

Esempi:

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

-o-

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

-o-

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

Riferimenti


2

Utilizzando il xargscomando comune per creare un'esecuzione di più pingrichieste:

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

Dove host1 host2 host3può essere un numero variabile di host (qualsiasi combinazione di IP o nome host).

Ciò modifica le xargsimpostazioni predefinite per forzare 1 argomento di input per l'esecuzione del ping e consentire un numero illimitato di processi figlio paralleli (1 per host con ping). Probabilmente è saggio impostare -P(aka --max-procs) su un valore sano se si intende eseguire il ping di un numero elevato di host (saranno tutti elaborati; solo meno contemporaneamente).

È abbastanza breve da poter essere utilizzato direttamente, potrebbe essere aggiunto come funzione al profilo della shell o al file rc o trasformato in un piccolo script nel tuo $PATH. Negli esempi seguenti, -Pè stato impostato su 10 per evitare un consumo eccessivo di risorse.

Script di esempio: /usr/bin/mping

#!/bin/sh

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

Esempio di funzione all'interno ~/.bashrc

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

E usa come:

mping host1 host2 host3 ...

1
Potresti considerare di usare -w 2 per far attendere il ping per non più di 2 secondi. Il valore predefinito è 10 secondi, che è per invocazione del ping, quindi potrebbero essere necessari più di 30 secondi per il completamento.
Criggie il

1
Sì, è una buona idea se esegui il ping di più host di quelli impostati per --max-procs/ -P. Tuttavia, per un numero di host inferiore a -P, tutti i ping vengono eseguiti in parallelo, il che significa che impiegherà tanto tempo quanto l'esecuzione del ping più lunga, anziché la somma di tutti.
Jason Musgrove il

1

Non so esattamente cosa vuoi, ma potresti cambiare l'ultimo set di 8 bit nel decimale 255, quindi i tuoi host riceveranno una trasmissione, in realtà, trasmetterà i pacchetti di ping a tutti i dispositivi esistenti in una rete.

ping -c 1 xx.xx.xx.255

1
Non è quello che sto cercando.
slm

8
Benvenuti nel sito - Questa è una buona idea e mostra una comprensione dell'IP Broadcast e del suo scopo in una rete IP ed è completamente corretta. Tuttavia, non corrisponde ai requisiti specifici di OP in questo caso ben definito. Per favore, vai avanti e fai una pausa nel rispondere ad altre domande.
Criggie il

0
ping google.com && ping localhost

Produzione

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

Gli aspetti negativi di questo sono 1) che l' &&operatore consente l'esecuzione del secondo comando solo se il primo comando è stato completato correttamente (ovvero un codice di uscita 0) E 2) il primo ping non finirà mai senza un ^ C per interromperlo. Valuta di aggiungere un parametro -c e -w. Benvenuti nel sito!
Criggie il

-1

Solo per divertimento e profitto ...

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

Questo potrebbe essere facilmente migliorato. Il che lo rende abbastanza utile. :)

Per ulteriori opzioni, consultare le pagine man per bsd ping e Linux ping

HTH

EDIT: leggermente aggiornato per terminare le query ping a 6 ping ciascuna e aggiungere le opzioni della pagina man.


La prima pingchiamata non ritorna mai a meno che non si verifichi un errore irreversibile.
Gilles 'SO- smetti di essere malvagio' il

Veramente? L'ho provato prima di pubblicarlo qui e ha funzionato come descritto. Sai che non tutti gli host risponderanno al ping. Forse i padroni di casa che hai richiesto non rispondevano. In ogni caso. Nel tentativo di fornire un feedback più rapido, ho limitato le query a 6 richieste per host.
Qualcuno il

2
Ora almeno la sceneggiatura ha la possibilità di terminare in pratica. Ma senza parallelismo, è ancora piuttosto inutile. Se il primo host risponde, l'utente non ottiene alcuna informazione sugli altri host per i primi 5 secondi.
Gilles 'SO- smetti di essere malvagio' il

Bene, questo doveva essere più un esempio su cui basarsi, di cui si ha bisogno. Potrei facilmente crearne un altro che satura completamente la tua pipa. Ma è quello che stai veramente cercando? :)
qualcuno il

1
Quello che avrei dovuto fare è creare un collegamento alla pagina man del ping. Onestamente. L'ho creato solo come modello facile da modificare facilmente per i propri mezzi. il ping funziona in modo drasticamente diverso su diversi sistemi operativi e sotto la miriade di diverse condizioni di rete in cui ciascun individuo potrebbe lavorare. Quindi non esiste un default "perfetto" per tutti. Ognuno ha il suo "punto debole". :) Ho già detto che funziona perfettamente per me? ;)
qualcuno il

-2

Usa sotto il semplice comando:

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.