hacer ping a múltiples IP usando bash?


17

Tengo 10 números de IP que tengo que hacer ping diariamente para verificar, cómo puedo hacer eso usando el script BASH. Para poder automatizar esa tarea usando cron. Solo quiero script BASH.

Gracias.


A continuación, he mencionado las IP de Google, Yahoo, MSN, etc. Lo he intentado yo mismo. Insertar {} y, no funciona aquí entre las IP para separarlas. Espero que pueda ayudar a alguien en el futuro. Gracias por leer.
rɑːdʒɑ

Respuestas:


18

Como su rango de ip no tiene simetría y solo hay 10 nodos, sugeriría que los enumere en un archivo de texto. Estoy considerando que el archivo que contiene la lista es el list.txtque contiene la lista de ip uno en cada línea como se muestra a continuación,

10.12.13.14
172.15.48.3
192.168.45.54
...
48.114.78.227

Puedes usar este script,

#!/bin/bash
# Program name: pingall.sh
date
cat /path/to/list.txt |  while read output
do
    ping -c 1 "$output" > /dev/null
    if [ $? -eq 0 ]; then
    echo "node $output is up" 
    else
    echo "node $output is down"
    fi
done

Para actualizar el estado de ejecución de sus nodos en un intervalo de 30 minutos, use en crontab,

*/30 * * * * /path/to/pingall.sh > /path/to/log.txt

Salida de log.txt

$ cat /path/to/log.txt
Fri Jan 31 15:06:01 IST 2014
node 10.12.13.14 is up
node 172.15.48.3 is up
node 192.168.45.54 is up
...
node 48.114.78.227 is down

¿No es lo que estabas esperando?
souravc

esto parece exactamente lo que OP debería estar buscando ... y dado que los sitios web como google.com, yahoo.com, etc. utilizan múltiples servidores para manejar solicitudes, sería mejor hacer ping con sus nombres de dominio (para que posiblemente no lo haga) tiene que cambiar la IP en su lista de ping la próxima semana) ..
precisa

Funciona muy bien, publiqué una respuesta ligeramente modificada que uso dentro de un entorno Travis CI.
MitchellK


1

Revisa este script.

   #!/bin/bash
    for i in `seq ${2} ${3}`
    do
        ping -c 1 ${1}.${i} > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            echo "${1}.${i} responded."
        else
            echo "${1}.${i} did not respond."
        fi
    done

Para ejecutar ./script 192.168.1 0 10, por ejemplo, esto comprueba los ips 192.168.1.0 a 192.168.1.10 y echo respondió si ping está bien y no respondió si no.

NB: puede reemplazar $ 1 $ 2 $ 3 por variables estáticas si el rango y las IP son siempre iguales.


IP no son del mismo rango. Ese es el criterio detrás. de todos modos, gracias por la respuesta. + 1
rɑːdʒɑ

ok, por favor dilo en tu pregunta. Gracias por +
Maythux

Un script simple y ordenado que podría ser muy útil (es decir, en dispositivos integrados), incluso cuando no aborda el 100% de las condiciones de la pregunta. Gracias. +1 merecido.
Sopalajo de Arrierez

1

Suponga que tiene 5 IP (para reducir solo la respuesta), luego puede hacer ping con

#!/usr/bin/bash    
for i in xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx xxx.xxx.xxx.xxxx 
do
ping -c 5 $i
done

Nota: No se incluyen corchetes, sin comas (,) entre las IP.

Espero que ayude.

Ex:

[raja @ scripts]$ cat ping.sh
for i in 74.125.236.70  98.139.183.24  65.55.206.228  91.189.94.156 198.252.206.24
do
ping -c 5 $i 
done 
[raja @ scripts]$ ./ping.sh
PING 74.125.236.70 (74.125.236.70) 56(84) bytes of data.
64 bytes from 74.125.236.70: icmp_seq=1 ttl=128 time=11.5 ms
64 bytes from 74.125.236.70: icmp_seq=2 ttl=128 time=11.0 ms
64 bytes from 74.125.236.70: icmp_seq=3 ttl=128 time=10.9 ms
64 bytes from 74.125.236.70: icmp_seq=4 ttl=128 time=16.5 ms
64 bytes from 74.125.236.70: icmp_seq=5 ttl=128 time=18.2 ms

--- 74.125.236.70 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4025ms
rtt min/avg/max/mdev = 10.966/13.682/18.291/3.120 ms
PING 98.139.183.24 (98.139.183.24) 56(84) bytes of data.
64 bytes from 98.139.183.24: icmp_seq=1 ttl=128 time=244 ms
64 bytes from 98.139.183.24: icmp_seq=2 ttl=128 time=253 ms
64 bytes from 98.139.183.24: icmp_seq=3 ttl=128 time=255 ms
64 bytes from 98.139.183.24: icmp_seq=4 ttl=128 time=251 ms
64 bytes from 98.139.183.24: icmp_seq=5 ttl=128 time=243 ms

--- 98.139.183.24 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4251ms
rtt min/avg/max/mdev = 243.511/249.623/255.275/4.674 ms
PING 65.55.206.228 (65.55.206.228) 56(84) bytes of data.
From 10.22.96.94 icmp_seq=5 Packet filtered

--- 65.55.206.228 ping statistics ---
5 packets transmitted, 0 received, +1 errors, 100% packet loss, time 14002ms

PING 91.189.94.156 (91.189.94.156) 56(84) bytes of data.
64 bytes from 91.189.94.156: icmp_seq=1 ttl=128 time=240 ms
64 bytes from 91.189.94.156: icmp_seq=2 ttl=128 time=240 ms
64 bytes from 91.189.94.156: icmp_seq=3 ttl=128 time=240 ms
64 bytes from 91.189.94.156: icmp_seq=4 ttl=128 time=240 ms
64 bytes from 91.189.94.156: icmp_seq=5 ttl=128 time=240 ms

--- 91.189.94.156 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4242ms
rtt min/avg/max/mdev = 240.060/240.222/240.309/0.626 ms
PING 198.252.206.24 (198.252.206.24) 56(84) bytes of data.
64 bytes from 198.252.206.24: icmp_seq=1 ttl=128 time=237 ms
64 bytes from 198.252.206.24: icmp_seq=2 ttl=128 time=237 ms
64 bytes from 198.252.206.24: icmp_seq=3 ttl=128 time=237 ms
64 bytes from 198.252.206.24: icmp_seq=4 ttl=128 time=237 ms
64 bytes from 198.252.206.24: icmp_seq=5 ttl=128 time=242 ms

--- 198.252.206.24 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4251ms
rtt min/avg/max/mdev = 237.600/238.575/242.291/1.933 ms

no mostró la implementación con cron como se menciona en su Q .. también cómo notificaría ese script el resultado de las solicitudes de ping ...
preciso

Mencioné que solo quiero guión. Cron no es parte de la pregunta. Cron mencionó por qué necesito este script y mencionar el propósito de este script como un trabajo cron.
rɑːdʒɑ

@hash Pruébalo antes de preguntarle a mi querido amigo. Gracias por mirar.
rɑːdʒɑ

Nunca dije que el script no funcionaría ... pero como su Q menciona el crontrabajo, sería necesario un medio para notificar al usuario el resultado del trabajo, o sugiere algo más?
precisa

mi propósito es cron job, quiero decir por qué necesito este script BASH. pero mi requisito es bash @hash
rɑːdʒɑ

1
echo 192.168.1.1 192.168.1.2 192.168.1.3 | xargs -n1 ping -w 1

o con grep, ver solo nodos que no son ping

echo 192.168.1.1 192.168.1.2 192.168.1.3 | xargs -n1 ping -w 1 | grep -b1 100

1

Bien

Tan simple como eso: use el parallel --gnucomando y luego su comando.

Obtenga las IP de ejemplo:

$ dig +trace google.com |ipx

127.0.0.1
127.0.0.1
199.7.91.13
199.7.91.13
192.48.79.30
192.48.79.30
173.194.33.161
173.194.33.165
173.194.33.163
173.194.33.164
173.194.33.174
173.194.33.160
173.194.33.167
173.194.33.166
173.194.33.162
173.194.33.169
173.194.33.168
216.239.32.10
216.239.32.10

$ parallel --gnu ping -c1 ::: `dig +trace google.com |ipx`
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_req=1 ttl=64 time=0.018 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.018/0.018/0.018/0.000 ms
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_req=1 ttl=64 time=0.017 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.017/0.017/0.017/0.000 ms
PING 173.194.33.132 (173.194.33.132) 56(84) bytes of data.
64 bytes from 173.194.33.132: icmp_req=1 ttl=54 time=20.5 ms

--- 173.194.33.132 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 20.526/20.526/20.526/0.000 ms
PING 173.194.33.131 (173.194.33.131) 56(84) bytes of data.
64 bytes from 173.194.33.131: icmp_req=1 ttl=54 time=20.7 ms
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.