web-dev-qa-db-fra.com

Vérification de la disponibilité de l'hôte à l'aide de ping dans des scripts bash

Je veux écrire un script qui vérifie si l'un des périphériques du réseau, qui devrait être en ligne toute la journée, est vraiment en ligne. J'ai essayé d'utiliser le ping, mais

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

donne 1 peu importe si j'entre une adresse IP valide ou invalide. Comment puis-je vérifier si une adresse spécifique (ou, au mieux, l'un des périphériques de la liste des adresses IP) s'est déconnectée?

61
burtek

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 hôte accessible

2 signifie inaccessible

60
StianE

Vous n'avez pas besoin des backticks dans la déclaration if. Vous pouvez utiliser ce chèque

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 zéro (ce qui signifie que la commande a été sortie avec succès), le bloc then sera exécuté. S'il renvoie un code de sortie non nul, le bloc else sera exécuté.

49
user000001

Il existe une version avancée de ping - "fping", qui permet de définir le délai d’expiration 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
21
Fedir RYKHTIK

Je peux penser à un one-liner comme celui-là pour courir

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

Remplacez 127.0.0.1 par IP ou nomhôte, remplacez les commandes echo par ce qui doit être fait dans les deux cas.

Le code ci-dessus va réussir, essayez peut-être avec une adresse IP ou un nom d’hôte que vous savez qui n’est pas accessible.

Comme ça:

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

et ça

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

Pour votre information, je viens de faire quelques tests en utilisant la méthode ci-dessus et si nous utilisons multi-ping (10 requêtes)

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

le résultat de la commande multi ping sera "0" si au moins un des résultats de ping est accessible, et "1" si toutes les demandes de ping sont inaccessibles.

3
emirjonb
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
2
miltos