web-dev-qa-db-fra.com

Comment envoyer une requête ping à plusieurs adresses IP en même temps?

Je connais les méthodes où vous pouvez exécuter une boucle Bash for et ping plusieurs serveurs, existe-t-il un outil CLI Linux que je peux utiliser qui me permettra de le faire sans avoir recourir à l'écriture d'un script Bash pour ping une liste de serveurs un par un?

Quelque chose comme ça:

$ ping Host1 Host2 Host3

REMARQUE: Je recherche spécifiquement CentOS/Fedora, mais si cela fonctionne sur d'autres distributions, c'est bien aussi.

23
slm

Si vous regardez dans le projet NMAP , vous constaterez qu'il inclut des outils supplémentaires en plus de nmap . L'un de ces outils est nping , qui inclut la capacité suivante:

Nping a une interface de ligne de commande très flexible et puissante qui accorde aux utilisateurs un contrôle total sur les paquets générés. Les fonctionnalités de Nping incluent:

  • Génération de paquets TCP, UDP, ICMP et ARP personnalisés.
  • Prise en charge de plusieurs spécifications d'hôte cible.
  • Prise en charge de plusieurs spécifications de port cible.
  • ...

nping est dans les dépôts EPEL standard pour démarrer.

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

Usage

Pour exécuter un ping sur plusieurs serveurs, il vous suffit de dire à nping les noms/IP et le protocole que vous souhaitez utiliser. Ici, puisque nous voulons imiter ce que fait la CLI ping traditionnelle, nous utiliserons 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

Le seul inconvénient que j'ai trouvé avec cet outil est l'utilisation du mode ICMP nécessitant des privilèges root.

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

fping est dans un paquet Fedora du même nom, et autorise de nombreux hôtes, ou un ensemble d'adresses 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 enverra un paquet ping et passera à la cible suivante de manière circulaire ... si une cible répond, elle est notée et supprimée de la liste

18
meuh
oping Host1 Host2 Host3

Description:

oping utilise des packages ICMP (mieux connus sous le nom de "paquets ping") pour tester l'accessibilité des hôtes du réseau. Il prend en charge le ping de plusieurs hôtes en parallèle en utilisant IPv4 et/ou IPv6 de manière transparente.

Ce paquet contient deux applications en ligne de commande: "oping" est un remplacement pour des outils comme ping (1), ping6 (1) et fping (1). "noping" est un outil basé sur ncurses qui affiche des statistiques pendant le ping et met en évidence les temps d'aller-retour aberrants.

9
GAD3R

Je suggère d'utiliser GNU Parallel

parallel -u ping ::: Host1 Host2 Host3

la sortie sera entrelacée

8
Diaa Sami

Je sais que c'est spécifiquement pas ce que vous demandez, mais un script bash pour accomplir cela:

#!/bin/bash

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

wait

Cela prendra vos points de terminaison comme arguments de ligne de commande et enverra un ping de 5 points à chacun en tant que processus d'arrière-plan, puis attendra que tout se termine avant de quitter. Il affichera les trois dernières lignes de la sortie ping qui contient des statistiques utiles sur le taux de réussite et la latence.

6
jesse_b

Nmap prend en charge les analyses ping (ICMP) et plusieurs hôtes:

nmap -sn -n 127.0.0.1 8.8.8.8

Vous pouvez également créer un fichier contenant toutes vos adresses IP cibles (séparées par des espaces ou des retours à la ligne) appelé targets.txt. Exécutez ensuite:

nmap -sn -n -iL targets.txt

Options expliquées:

  • -sn Ping Scan.
  • -n Désactivez la résolution DNS.
  • -iL Entrez le nom du fichier.

Autres options intéressantes au cas où vous voudriez envoyer un ping à un très grand nombre de cibles:

  • -T4 Augmentez le temps pour réduire la durée de l'analyse.
  • --min-parallelism 100 Augmentez le nombre de sondes parallèles.
  • -oG <file> Écrire les résultats de l'analyse dans un fichier au format Grepable.

Sans créer de fichier

Gardez à l'esprit que vous pouvez également renoncer à la création d'un fichier et utiliser un - pour prendre les entrées d'un tube, |, ou via des méthodes traditionnelles de redirection de sortie via STDIN.

Exemples:

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

-ou-

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

-ou-

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

Références

2
scai

Je suppose que cela peut vous aider?

eval $(printf 'ping "%s" & ' Host1 Host2 Host3)

Il tire parti de la capacité de printf à "auto-itérer" ses arguments tout en réutilisant sa chaîne de formatage sur chaque argument. Le printf ci-dessus produit donc une séquence de ping <hostname> & chaînes pour chaque hôte fourni comme argument et alimente cette séquence de commandes via la substitution de commande à la commande eval pour les exécuter immédiatement.

Les commandes printf et eval sont standard POSIX, ainsi que la substitution de commande.

Enfermant une telle commande entière dans un sous-shell comprenant un wait and-ed comme ceci:

(eval $(printf 'ping "%s" & ' Host1 Host2 Host3) && wait)

offre la possibilité d'interrompre tout à volonté avec un simple Ctrl+C.

Sinon, vous pouvez contrôler chaque commande ping singulièrement via le contrôle de tâche habituel du shell.

Si votre shell prend également en charge les substitutions de processus, vous pouvez également utiliser les éléments suivants:

. <(printf 'ping "%s" & ' Host1 Host2 Host3)

pour quelques caractères de moins à taper.

Le Gist est le même que pour le eval, mais alimente la séquence de ping au . (aka source) via la substitution de processus.

2
LL3

En utilisant la commande commune xargs pour créer une exécution de plusieurs requêtes ping:

echo Host1 Host2 Host3 | xargs -n1 -P0 ping -c 4

Host1 Host2 Host3 peut être un nombre variable d'hôtes (toute combinaison d'IP ou de nom d'hôte).

Cela modifie les valeurs par défaut de xargs pour forcer 1 argument d'entrée par exécution de ping, et autoriser un nombre illimité de processus enfants parallèles (1 par hôte ping). Il est probablement judicieux de définir -P (alias --max-procs) à une valeur saine si vous avez l'intention d'envoyer une requête ping à un grand nombre d'hôtes (ils seront tous traités; un peu moins simultanément).

Il est assez court pour être utilisé directement, pourrait être ajouté en tant que fonction à votre profil Shell ou à votre fichier rc, ou transformé en petit script dans votre $PATH. Dans les exemples ci-dessous, -P a été défini sur 10 pour éviter une consommation excessive de ressources.

Exemple de script: /usr/bin/mping

#!/bin/sh

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

Exemple de fonction dans ~/.bashrc

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

Et utiliser comme:

mping Host1 Host2 Host3 ...
2
Jason Musgrove

Je ne sais pas exactement ce que vous voulez mais vous pouvez changer le dernier 8 bits en 255 décimal, donc vos hôtes recevront une diffusion, en fait, ils transmettront des paquets ping à tous les appareils qui existent dans un réseau.

ping -c 1 xx.xx.xx.255
1
CriticalSYS
ping google.com && ping localhost

Production

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
0
Manish