94 votes

Vérifier la disponibilité d'un hôte en utilisant ping dans bash scripts.

Je veux écrire un script, qui vérifierait en permanence si l'un des appareils du réseau, qui devrait être en ligne toute la journée, l'est réellement. J'ai essayé d'utiliser ping, mais

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

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 appareil de la liste des adresses IP) a été mise hors ligne ?

89voto

StianE Points 2805

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 joignable

2 signifie inaccessible

86voto

user000001 Points 12050

Vous n'avez pas besoin des antisèches dans l'instruction if. Vous pouvez utiliser cette vérification

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

La commande if vérifie le code de sortie de la commande suivante (le 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é.

35voto

Je peux penser à une phrase comme celle-ci à lancer

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

Remplacez 127.0.0.1 par l'IP ou le nom d'hôte, remplacez les commandes echo par ce qui doit être fait dans l'un ou l'autre cas.

Le code ci-dessus réussira, essayez peut-être avec une IP ou un nom d'hôte que vous connaissez et qui n'est pas accessible.

Comme ceci :

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

et ceci

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

25voto

Fedir Points 3235

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 "Host found"
else
  echo "Host not found"
fi

10voto

Mr Frog Points 71

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

Profitez-en !

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X