¿Cómo puedo hacer ping a varias direcciones IP al mismo tiempo?

22

Soy consciente de los métodos en los que puede ejecutar un forbucle Bash y pingvarios servidores, ¿existe una herramienta CLI de Linux que pueda usar que me permita hacer esto sin tener que recurrir a escribir un script Bash en pinguna lista de servidores? ¿uno a la vez?

Algo como esto:

$ ping host1 host2 host3

NOTA: Estoy buscando específicamente CentOS / Fedora, pero si funciona en otras distribuciones, también está bien.

slm
fuente
8
¿Por qué estás en contra de que un pequeño guión de una línea haga eso, la belleza y la filosofía de Linux ;-)? (Tenga programas pequeños y simples y escriba el pegamento para necesidades especiales usted mismo.)
Peter - Reinstale a Monica el
1
Es mucho más fácil instalar un paquete desde un repositorio frente a copiar un script en más de 2000 máquinas virtuales 8-). Podría escribir fácilmente una solución de script para mí. Además, desde que respondí esto, estoy creando contenido en Internet, ya que tengo usuarios que solicitan un solo cmd frente a un script de shell y no tuvieron éxito en encontrar un A'er simple para lo que perciben como una Q básica.
slm
3
Si su intención es hacer un ping múltiple desde más de 2000 máquinas virtuales, ... solo puedo rascarme la cabeza
Hagen von Eitzen
@HagenvonEitzen: no, estoy instalando herramientas en más de 2000 máquinas virtuales para que los usuarios tengan herramientas disponibles para hacerlo.
slm
1
Por qué necesitarías esto?
Tvde1

Respuestas:

32

Si observa el proyecto NMAP , encontrará que incluye herramientas adicionales además de justo nmap. Una de estas herramientas es nping, que incluye la siguiente habilidad:

Nping tiene una interfaz de línea de comandos muy flexible y potente que otorga a los usuarios control total sobre los paquetes generados. Las características de Nping incluyen:

  • Generación de paquetes personalizados TCP, UDP, ICMP y ARP.
  • Soporte para múltiples especificaciones de host objetivo.
  • Soporte para múltiples especificaciones de puertos de destino.
  • ...

nping está en los repositorios EPEL estándar para arrancar.

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

Uso

Para hacer ping a varios servidores, solo tiene que indicar npinglos nombres / IP y el protocolo que desea utilizar. Aquí, dado que queremos imitar lo que hace la pingCLI tradicional , usaremos 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

El único inconveniente que he encontrado con esta herramienta es el uso del modo ICMP que requiere privilegios de root.

$ nping -c 2 --icmp scanme.nmap.org google.com
Mode ICMP requires root privileges.
slm
fuente
3
¿Qué pasa con esa salida? Las estadísticas dicen que envió 2 a cada host, pero el resultado anterior muestra que envió 3 a scanme.nmap.org (45.33.32.156) y 1 a google.com (64.233.177.100). A mí también me sucede cuando lo ejecuto.
JoL
44
Miente ... (por supuesto, ya que es inconsistente consigo mismo). Al ejecutarlo con strace, puedo verlo enviando un ping a google.com, pero generando una línea que dice que lo envió a scanme.nmap.org. Interesante error. Sin embargo, no siempre sucede.
JoL
nmaptambién es compatible con ICMP directamente al especificar la opción -sn. Vea mi respuesta para más detalles.
Scai
@scai: gracias por tu A'er. Encontré eso también mientras investigaba esto. Encontré que mi enfoque es el más limpio.
slm
1
"El único inconveniente que he encontrado con esta herramienta es el uso del modo ICMP que requiere privilegios de root". Sí, eso es algo interesante, pero tiene que ver con las capacidades (al menos en Linux; también podría hacer setuid exec para root). No es que recomiendo usar setcap o darle setuid ...
Pryftan
18

fping está en un paquete de Fedora con el mismo nombre y permite muchos hosts o un conjunto de direcciones 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 enviará un paquete de ping y pasará al siguiente objetivo de forma redonda ... si un objetivo responde, se anota y se elimina de la lista

meuh
fuente
9
oping host1 host2 host3

Descripción:

oping utiliza paquetes ICMP (mejor conocidos como "paquetes ping") para probar la accesibilidad de los hosts de red. Admite hacer ping a varios hosts en paralelo usando IPv4 y / o IPv6 de forma transparente.

Este paquete contiene dos aplicaciones de línea de comandos: "oping" es un reemplazo de herramientas como ping (1), ping6 (1) y fping (1). "noping" es una herramienta basada en ncurses que muestra estadísticas al hacer ping y resalta los tiempos aberrantes de ida y vuelta.

GAD3R
fuente
Solo para ser pedante: técnicamente, ICMP es para informar de errores en general y tiene muchas capacidades diferentes. De hecho, ping utiliza los tipos de ICMP ECHO_REQUEST / ECHO_REPLY (8 para el iirc anterior pero ha pasado mucho tiempo, y soy demasiado vago para comprobarlo). Tal vez la descripción que cita es en realidad para la elección en sí, pero de cualquier manera no es estrictamente correcta (o está mucho más simplificada de lo que debería ser ... O tal vez no, supongo que para muchos probablemente sea mejor de esa manera, pero no para mí de todos modos )
Pryftan
7

Sugeriría usar GNU Parallel

parallel -u ping ::: host1 host2 host3

la salida será intercalada

Diaa Sami
fuente
6

Sé que específicamente no es lo que estás pidiendo, sino un script bash para lograr esto:

#!/bin/bash

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

wait

Esto tomará sus puntos finales como argumentos de línea de comando y enviará un ping de 5 recuentos a cada uno como un proceso en segundo plano y luego esperará a que todos terminen antes de salir. Imprimirá las últimas tres líneas de la salida de ping que contiene estadísticas útiles sobre la tasa de éxito y la latencia.

Jesse_b
fuente
3
No necesitas recordar los pids. Un simple waitesperará todos los procesos secundarios activos, por lo que puede evitar el segundo ciclo. Creo que parte de la razón por la que se le pidió que no requiriera escribir un script bash es tener una solución que funcione en cualquier máquina sin tener que cargar o escribir un script. Hacerlo corto parece más favorable, por lo que creo que sería mejor evitar esa asignación de argumento y simplemente hacerlo for host; doen su primer ciclo. Si esto fuera zsh, podría evitar la doy done, y acaba de hacer, interatively:for host in google.com; ping -c5 "$host" |& tail -3 & wait
JoL
44
Una trampa SIGINT haría este guión mucho más práctico.
Gilles 'SO- deja de ser malvado'
2
Para uso interactivo, este es simplemente usando comandos de fondo (es decir command &) en un subnivel (es decir, con envoltura parens) y con la waitde combinar cualquier número de comandos en un mismo comando artificial, por ejemplo: (for f in google.com yahoo.com microsoft.com; do ping $f & done; wait). Sus salidas se intercalarán, y cuando ctrl + c esto después de este comando, los tres procesos secundarios se eliminarán. El shell tiene muchas construcciones de control de trabajo potentes y este es uno de ellos.
Mentir Ryan
2
Gracias a todos. Sí, dudaba en publicarlo, pero creo que las preguntas y respuestas aquí no son solo para OP, sino para todos los que experimentan un problema similar y creo que habrá personas que tropezarán con esta pregunta y no quieren instalar software adicional para cumplir la tarea
Jesse_b
@JoL Pero ciertamente esas herramientas no están instaladas por defecto en todos los hosts. Eso no hace que lo que dices sea falso, por supuesto, pero ...
Pryftan
2

Supongo que esto puede hacer por ti?

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

Aprovecha printfla capacidad de "iterar automáticamente" sus argumentos mientras reutiliza su cadena de formato sobre cada argumento. Por lo printftanto, lo anterior produce una secuencia de ping <hostname> &cadenas para cada host proporcionado como argumento, y alimenta dicha secuencia de comandos a través del comando Substitución al evalcomando para que se ejecuten de inmediato.

printfy los evalcomandos son estándar POSIX, así como la sustitución de comandos.

Incluyendo todo dicho comando en una subshell que comprende un and-ed waitcomo este:

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

proporciona la capacidad de interrumpir todo a voluntad con un simple Ctrl+C.

De lo contrario, puede controlar cada pingcomando individualmente a través del control de trabajo habitual del shell.

Si su shell también es compatible con las sustituciones de proceso, también puede usar lo siguiente:

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

por unos pocos caracteres menos para escribir.

La esencia es la misma que para el eval, pero alimenta la secuencia de pings al comando .(aka source) a través de la sustitución del proceso.

LL3
fuente
2

Nmap admite escaneos de ping (ICMP) y múltiples hosts:

nmap -sn -n 127.0.0.1 8.8.8.8

También puede crear un archivo que contenga todas sus IP de destino (separadas por espacios o nuevas líneas) llamadas targets.txt. Entonces corre:

nmap -sn -n -iL targets.txt

Opciones explicadas:

  • -sn Escaneo de ping.
  • -n Deshabilitar la resolución de DNS.
  • -iL Ingrese el nombre del archivo.

Otras opciones interesantes en caso de que desee hacer ping a una gran cantidad de objetivos:

  • -T4 Aumente el tiempo para reducir la duración del escaneo.
  • --min-parallelism 100 Aumentar el número de sondas paralelas.
  • -oG <file> Escriba los resultados del escaneo en un archivo en formato Grepable.

Sin crear un archivo

Tenga en cuenta que también puede renunciar a la creación de un archivo y usar a -para tomar la entrada de una tubería |o mediante métodos tradicionales para redirigir la salida a través de STDIN.

Ejemplos:

$ ( 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'

Referencias

scai
fuente
2

Al usar el xargscomando común para construir y ejecutar múltiples pingsolicitudes:

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

Donde host1 host2 host3puede haber un número variable de hosts (cualquier combinación de IP o nombre de host).

Esto altera los xargsvalores predeterminados para forzar 1 argumento de entrada por ejecución de ping y permite un número ilimitado de procesos secundarios paralelos (1 por host pinchado). Probablemente sea aconsejable establecer -P(también conocido como --max-procs) en un valor razonable si tiene la intención de hacer ping a un gran número de hosts (todos serán procesados; solo menos simultáneamente).

Es lo suficientemente corto como para usarlo directamente, podría agregarse como una función a su perfil de shell o archivo rc, o convertirse en un pequeño script en su $PATH. En los ejemplos a continuación, -Pse ha establecido en 10 para evitar el consumo excesivo de recursos.

Script de ejemplo: /usr/bin/mping

#!/bin/sh

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

Función de ejemplo dentro de ~/.bashrc

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

Y usar como:

mping host1 host2 host3 ...
Jason Musgrove
fuente
1
Puede considerar usar -w 2 para hacer que el ping no espere más de 2 segundos. El valor predeterminado es 10 segundos, que es por invocación de ping, por lo que esto podría tardar más de 30 segundos en completarse.
Criggie
1
Sí, es una buena idea hacer ping a más hosts de los que configuró para --max-procs/ -P. Sin embargo, para cuentas de host menores que -P, todos los pings se ejecutan en paralelo, lo que significa que tomará tanto tiempo como la ejecución de ping más larga, en lugar de la suma de todos ellos.
Jason Musgrove
1

No sé qué quiere exactamente, pero podría cambiar el último conjunto de 8 bits al decimal 255, por lo que sus hosts recibirán una transmisión, en realidad, transmitirá paquetes de ping a todos los dispositivos que existen en una red.

ping -c 1 xx.xx.xx.255
CriticalSYS
fuente
1
Eso no es lo que estoy buscando.
slm
8
Bienvenido al sitio: este es un buen pensamiento y muestra una comprensión de la difusión de IP y su propósito en una red IP, y es completamente correcto. Sin embargo, no coincide con el requisito específico de OP en este caso de definición limitada. Por favor continúe y tenga una oportunidad para responder otras preguntas.
Criggie
0
ping google.com && ping localhost

Salida

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
fuente
Las desventajas de esto son 1) que el &&operador solo permite que el segundo comando se ejecute si el primer comando se completa con éxito (es decir, un código de salida de 0) y 2) el primer ping nunca terminará sin un ^ C para interrumpirlo. Considere agregar un parámetro -c y -w. Bienvenido al sitio!
Criggie
-1

Solo por diversión y ganancias ...

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

Esto podría mejorarse fácilmente . Lo que lo hace bastante útil. :)

Para opciones adicionales, consulte las páginas de manual para bsd ping y Linux ping

HTH

EDITAR: ligeramente actualizado para finalizar las consultas de ping @ 6 pings cada una, y agregar opciones de página de manual.

alguien
fuente
La primera pingllamada nunca regresa a menos que encuentre un error fatal.
Gilles 'SO- deja de ser malvado'
De Verdad? Probé esto antes de publicarlo aquí, y funcionó como se describe. Usted sabe que no todos los hosts responderán a los contactos. Quizás los anfitriones que consultó no respondían. En todo caso. En un esfuerzo por proporcionar comentarios más rápidos, limité las consultas a 6 solicitudes por host.
alguien
2
Ahora al menos el script tiene una posibilidad de terminar en la práctica. Pero sin paralelismo, sigue siendo bastante inútil. Si el primer host responde, el usuario no obtiene ninguna información sobre los otros hosts durante los primeros 5 segundos.
Gilles 'SO- deja de ser malvado'
Bueno, esto pretendía ser más un ejemplo sobre el cual construir, según se necesite. Podría crear fácilmente otro que sature completamente tu tubería. ¿Pero es eso lo que realmente buscas? :)
alguien
1
Lo que debería haber hecho es crear un enlace a la página del comando man. Honestamente. Solo lo creé como una plantilla fácil para que uno pueda modificar fácilmente por sus propios medios. ping funciona drásticamente diferente en diferentes sistemas operativos, y bajo la miríada de diferentes condiciones de red en las que cada individuo puede estar trabajando. Por lo tanto, no existe un valor predeterminado "perfecto" para todos. Cada uno tiene su propio "punto dulce". :) ¿Mencioné que funciona perfectamente para mí? ;)
alguien
-2

Utilice el siguiente comando simple:

$ 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
fuente