Script bash pour vérifier la disponibilité d'un hôte avec ping

Je veux écrire un script qui vérifierait en permanence si l’un des périphériques du réseau, qui devrait être en ligne toute la journée, est réellement en ligne. J’ai essayé d’utiliser ping, mais donne 1 peu importe que j’entre une adresse IP valide ou invalide. Comment puis-je vérifier si une adresse spécifique (ou mieux n’importe quel liste des adresses IP) a été mise hors ligne ?

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

Ping renvoie différents codes de sortie en fonction du type d’erreur.

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 signifie que l’hôte est accessible

2 signifie inaccessible

Vous n’avez pas besoin des crochets dans l’instruction if. Vous pouvez utiliser cette commande

if ping -c 1 adresses_ip &> /dev/null
then
  echo "success"
else
  echo "error"
fi

La commande if vérifie le code de sortie de la commande (ping). Si le code de sortie est égal à zéro (ce qui signifie que la commande s’est terminée avec succès), le bloc then est exécuté. S’il renvoie un code de sortie non nul, le bloc else est exécuté.

Il existe une version avancée de ping - « fping », qui permet de définir le délai d’attente en millisecondes.

#!/bin/bash
IP='192.168.1.1'
fping -c1 -t300 $IP 2>/dev/null 1>/dev/null
if [ "$?" = 0 ]
then
  echo "L’hôte est accessible"
else
  echo "L’hôte est inaccessible"
fi

Il s’agit d’un script bash complet qui interroge la destination toutes les 5 secondes et enregistre les erreurs dans un fichier.

#!/bin/bash
        
FILE=errors.txt
TARGET=192.168.0.1

touch $FILE
while true;
do
	DATE=$(date '+%d/%m/%Y %H:%M:%S')
	ping -c 1 $TARGET &> /dev/null
	if [[ $? -ne 0 ]]; then
		echo "ERROR "$DATE
		echo $DATE >> $FILE
	else
		echo "OK "$DATE
	fi
		sleep 5
done