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


22

Je connais les méthodes où vous pouvez exécuter une forboucle Bash et pingplusieurs 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 sur pingune liste de serveurs un à la fois?

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.


8
Pourquoi êtes-vous contre un petit script à une ligne qui fait ça - la beauté et la philosophie de Linux ;-)? (Ayez de petits programmes simples et écrivez vous-même la colle pour les besoins spéciaux.)
Peter - Rétablir Monica

1
Il est beaucoup plus facile d'installer un package à partir d'un dépôt que de copier un script sur plus de 2000 VM 8-). Je pourrais facilement écrire une solution de script pour moi-même. De plus, depuis que j'ai répondu moi-même, je crée du contenu sur Internet car j'ai des utilisateurs qui demandent un seul cmd contre un script shell et n'ont pas réussi à trouver un simple A'er à ce qu'ils perçoivent comme un Q. basique
slm

3
Si votre intention est de faire un multi-ping à partir de 2000+ machines virtuelles, ... je ne peux que me gratter la tête
Hagen von Eitzen

@HagenvonEitzen - non, j'installe des outils sur plus de 2000 machines virtuelles afin que les utilisateurs disposent d'outils pour le faire.
slm

1
Pourquoi auriez-vous besoin de cela?
Tvde1

Réponses:


32

Si vous regardez le projet NMAP, vous constaterez qu'il comprend des outils supplémentaires en plus de juste nmap. L'un de ces outils est nping, qui comprend 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 se trouve 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 envoyer un ping à plusieurs serveurs, vous n'avez qu'à indiquer npingles noms / IP et le protocole que vous souhaitez utiliser. Ici, puisque nous voulons imiter ce que fait la pingCLI 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.

3
Quelle est cette sortie? Les statistiques indiquent qu'il en a envoyé 2 à chaque hôte, mais la sortie précédente montre qu'il en a envoyé 3 à scanme.nmap.org (45.33.32.156) et 1 à google.com (64.233.177.100). Cela m'arrive aussi lorsque je l'exécute.
JoL

4
Il ment ... (bien sûr, car il n'est pas cohérent avec lui-même). En l'exécutant avec strace, je peux le voir envoyer un ping à google.com, mais produire une ligne disant qu'il l'a envoyé à scanme.nmap.org. Bug intéressant. Cela n'arrive pas toujours, cependant.
JoL

nmapprend également en charge ICMP directement en spécifiant l'option -sn. Voir ma réponse pour plus de détails.
scai

@scai - merci pour votre A'er. J'ai trouvé celui-là aussi pendant mes recherches. J'ai trouvé que mon approche était la plus propre.
slm

1
"Le seul inconvénient que j'ai trouvé avec cet outil est l'utilisation du mode ICMP nécessitant des privilèges root." Oui, c'est une chose intéressante mais cela a à voir avec les capacités (au moins sous Linux; vous pouvez également faire un setuid exec pour root). Non pas que je recommande d'utiliser setcap ou de lui donner setuid ....
Pryftan

18

fping est dans un paquet Fedora du même nom, et permet 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 alternée ... si une cible répond, elle est notée et supprimée de la liste


9
oping host1 host2 host3

La 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.


Juste pour être pédant: techniquement, ICMP est destiné au rapport d'erreurs en général et il a de nombreuses capacités différentes. En fait, ping utilise les types ICMP ECHO_REQUEST / ECHO_REPLY (8 pour l'ancien iirc mais cela fait longtemps - et je suis trop paresseux pour vérifier). Peut-être que la description que vous citez est en fait pour l'oping elle-même mais de toute façon ce n'est pas strictement correct (ou c'est beaucoup plus simplifié qu'il ne devrait l'être ... Ou peut-être pas, je suppose que pour beaucoup, c'est probablement mieux comme ça mais pas pour moi de toute façon ).
Pryftan


6

Je sais que ce n'est pas spécifiquement 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.


3
Vous n'avez pas besoin de vous souvenir des pids. Un simple waitattendra tous les processus enfants actifs, vous pouvez donc éviter la deuxième boucle. Je pense qu'une partie de la raison pour laquelle il a été demandé de ne pas exiger l'écriture d'un script bash est d'avoir une solution qui fonctionne sur n'importe quelle machine sans avoir à transporter ou à écrire un script. Faire court semble plus favorable, donc je pense qu'il vaut mieux éviter cette affectation d'argument et le faire for host; dodans votre première boucle. Si c'était zsh, vous pourriez éviter le doet doneet juste le faire, de manière interactive:for host in google.com; ping -c5 "$host" |& tail -3 & wait
JoL

4
Un piège SIGINT rendrait ce script beaucoup plus pratique.
Gilles 'SO- arrête d'être méchant'

2
Pour une utilisation interactive, cela est d' utiliser simplement la commande d'arrière - plan ( par exemple command &) dans un sous - shell ( à savoir l' emballage avec des parenthèses) et waità combiner un certain nombre de commandes en une commande artificielle, par exemple: (for f in google.com yahoo.com microsoft.com; do ping $f & done; wait). Leurs sorties seront entrelacées, et lorsque vous ctrl + c ceci après cette commande, les trois processus enfants seront tués. Le shell a beaucoup de puissantes constructions de contrôle des tâches et c'est l'une d'entre elles.
Lie Ryan

2
Merci a tous. Oui, j'hésitais à le poster mais je pense que les questions / réponses ici ne sont pas seulement pour OP mais pour tous ceux qui rencontrent un problème similaire et je pense qu'il y aura des gens qui tomberont sur cette question et ne voudront pas installer de logiciel supplémentaire pour accomplir la tâche.
Jesse_b

@JoL Mais ces outils ne sont certainement pas installés par défaut sur tous les hôtes. Cela ne rend pas ce que vous dites faux, bien sûr, mais ...
Pryftan

2

Je suppose que cela peut vous aider?

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

Il tire parti de printfla capacité de "auto-itérer" ses arguments tout en réutilisant sa chaîne de formatage sur chaque argument. Par printfconséquent, ce qui précède produit une séquence de ping <hostname> &chaînes pour chaque hôte fourni en argument, et transmet cette séquence de commandes via la substitution de commande à la evalcommande pour les exécuter immédiatement.

printfet les evalcommandes sont standard POSIX, ainsi que la substitution de commande.

Enfermant une telle commande dans un sous-shell comprenant un and-ed waitcomme 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 pingcommande individuellement 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.

L'essentiel est le même que pour le eval, mais alimente la séquence de pings à la commande .(aka source) via la substitution de processus.


2

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 nouvelles lignes) appelées 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 timing pour réduire la durée du scan.
  • --min-parallelism 100 Augmentez le nombre de sondes parallèles.
  • -oG <file> Écrivez 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 une entrée depuis un tube,| , ou via des méthodes traditionnelles pour rediriger la 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'

Les références


2

En utilisant la xargscommande commune pour créer et exécuter plusieurs pingrequêtes:

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

host1 host2 host3peut être un nombre variable d'hôtes (toute combinaison d'IP ou de nom d'hôte).

Cela modifie les xargsvaleurs par défaut 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(aka --max-procs) sur 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).

Son assez court pour être utilisé directement, pourrait être ajouté en tant que fonction à votre profil shell ou fichier rc, ou transformé en un petit script dans votre $PATH. Dans les exemples ci-dessous, -Pa é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 ...

1
Vous pourriez envisager d'utiliser -w 2 pour que le ping n'attende pas plus de 2 secondes. La valeur par défaut est de 10 secondes, ce qui correspond à une invocation de ping, ce qui peut prendre plus de 30 secondes.
Criggie

1
Oui, c'est une bonne idée si vous cinglez plus d'hôtes que vous n'en avez définis pour --max-procs/ -P. Cependant, pour les nombres d'hôtes inférieurs à -P, tous les pings sont exécutés en parallèle - ce qui signifie que cela prendra aussi longtemps que la seule exécution de ping la plus longue, plutôt que la somme de tous.
Jason Musgrove

1

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
Ce n'est pas ce que je recherche.
slm

8
Bienvenue sur le site - Ceci est une bonne pensée et montre une compréhension de la diffusion IP et de son objectif dans un réseau IP, et est tout à fait correct. Cependant, il ne correspond pas aux exigences spécifiques d'OP dans ce cas étroitement défini. Veuillez continuer et avoir une fissure pour répondre à d'autres questions.
Criggie

0
ping google.com && ping localhost

Sortie

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

Les inconvénients sont 1) que l' &&opérateur ne permet à la deuxième commande de s'exécuter que si la première commande s'est terminée avec succès, (c'est-à-dire un code de sortie de 0) Et 2) le premier ping ne se terminera jamais sans un ^ C pour l'interrompre. Pensez à ajouter un paramètre -c et un paramètre -w. Bienvenue sur le site!
Criggie

-1

Juste pour le plaisir et le 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

Cela pourrait être facilement amélioré. Ce qui le rend assez utile. :)

Pour des options supplémentaires, veuillez consulter les pages de manuel pour le ping bsd et le ping Linux

HTH

EDIT: légèrement mis à jour pour terminer les requêtes ping @ 6 pings chacune, et ajouter des options de page de manuel.


Le premier pingappel ne revient jamais sauf s'il rencontre une erreur fatale.
Gilles 'SO- arrête d'être méchant'

Vraiment? J'ai testé cela avant de le poster ici, et cela a fonctionné comme décrit. Vous savez que tous les hôtes ne répondront pas au ping. Peut-être que les hôtes que vous avez interrogés ne répondaient pas. Dans tout les cas. Afin de fournir des commentaires plus rapides, j'ai limité les requêtes à 6 demandes par hôte.
quelqu'un le

2
Maintenant, au moins, le script a une chance de se terminer dans la pratique. Mais sans parallélisme, c'est quand même assez inutile. Si le premier hôte répond, l'utilisateur n'obtient aucune information sur les autres hôtes pendant les 5 premières secondes.
Gilles 'SO- arrête d'être méchant'

Eh bien, cela devait être davantage un exemple sur lequel s'appuyer, selon les besoins. Je pourrais facilement en créer un autre qui sature complètement votre pipe. Mais est-ce vraiment ce que vous recherchez? :)
quelqu'un le

1
Ce que j'aurais dû faire est de créer un lien vers la page de manuel ping. Honnêtement. Je ne l'ai créé que comme un modèle facile à modifier facilement pour leurs propres moyens. ping fonctionne de façon radicalement différente sur différents systèmes d'exploitation et dans la myriade de conditions de réseau différentes sous lesquelles chaque individu peut travailler. Il n'y a donc pas de défaut "parfait" pour tout le monde. Chacun a son propre "sweet spot". :) Ai-je mentionné que cela fonctionne parfaitement pour moi? ;)
quelqu'un le

-2

Utilisez la commande simple ci-dessous:

$ 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.