Comprobación de la disponibilidad del host mediante el uso de ping en scripts bash

Quiero escribir un script, que seguiría comprobando si alguno de los dispositivos de la red, que debería estar en línea todo el día, está realmente en línea. Traté de usar ping, pero

if [ "`ping -c 1 some_ip_here`" ] then echo 1 else echo 0 fi 

da 1 no importa si ingreso una dirección IP válida o no válida. ¿Cómo puedo verificar si una dirección específica (o mejor cualquiera de los dispositivos de la lista de direcciones IP) se desconectó?

Ping devuelve diferentes códigos de salida dependiendo del tipo de error.

 ping 256.256.256.256 ; echo $? # 68 ping -c 1 127.0.0.1 ; echo $? # 0 ping -c 1 192.168.1.5 ; echo $? # 2 

0 significa host accesible

2 significa inalcanzable

No necesita los backticks en la statement if. Puedes usar este cheque

 if ping -c 1 some_ip_here &> /dev/null then echo 1 else echo 0 fi 

El comando if verifica el código de salida del siguiente comando (el ping). Si el código de salida es cero (lo que significa que el comando salió exitosamente) se ejecutará el bloque siguiente. Si devuelve un código de salida distinto de cero, entonces se ejecutará el bloque else.

Hay una versión avanzada de ping – “fping”, que da la posibilidad de definir el tiempo de espera en milisegundos.

 #!/bin/bash IP='192.168.1.1' fping -c1 -t300 $IP 2>/dev/null 1>/dev/null if [ "$?" = 0 ] then echo "Host found" else echo "Host not found" fi 

Puedo pensar en un trazador de líneas como este para ejecutar

 ping -c 1 127.0.0.1 &> /dev/null && echo success || echo fail 

Reemplace 127.0.0.1 con IP o nombre de host, reemplace los comandos de eco con lo que se debe hacer en ambos casos.

El código anterior tendrá éxito, tal vez intente con una IP o nombre de host que sepa que no es accesible.

Me gusta esto:

 ping -c 1 google.com &> /dev/null && echo success || echo fail 

y esto

 ping -c 1 lolcatz.ninja &> /dev/null && echo success || echo fail 

FYI, acabo de hacer una prueba utilizando el método anterior y si utilizamos multi ping (10 solicitudes)

ping -c10 8.8.8.8 &> / dev / null; echo $?

el resultado del comando multi ping será “0” si al menos uno de los resultados de ping es alcanzable, y “1” en caso de que no se pueda acceder a todas las solicitudes de ping.

 up=`fping -r 1 $1 ` if [ -z "${up}" ]; then printf "Host $1 not responding to ping \n" else printf "Host $1 responding to ping \n" fi