web-dev-qa-db-fra.com

Comment vérifier l'accès à Internet en utilisant le script bash sous Linux?

Dans mon école, Internet n'est pas disponible (tous les soirs après 23h, l'école va tuer Internet, pour nous mettre au lit> .. <), le ping ne s'arrêtera jamais, bien que j'ai utilisé le paramètre ping -w1 ...

C'est-à-dire que lorsque j'utilise: ping -q -w1 -c1 8.8.8.8 pour vérifier si Internet est haut/bas, il sera là sans aucune sortie et ne se ferme pas, tout comme j'utilise une seule cat

Pouvez-vous comprendre ma question ??? Je ne sais pas pourquoi c'est comme ça, mais je pense que le problème est lié au school-internet-service . Toute suggestion? (Je pense que wget peut être une bonne alternative, mais comment l'utiliser?)

16
Libin Wen

Utiliser wget:

#!/bin/bash

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
        echo "Online"
else
        echo "Offline"
fi
37
Atropo

Si l'école éteint son routeur au lieu de rediriger tout le trafic sur une page "Pourquoi n'es-tu pas au lit", il n'est pas nécessaire de télécharger une page Web entière ni d'envoyer des en-têtes HTTP. Tout ce que vous avez à faire est simplement d'établir une connexion et de vérifier si quelqu'un écoute.

nc -z 8.8.8.8 53

La sortie "La connexion au port 53.8.8.8.8 [tcp/domain] a réussi!" et retourne une valeur de 0 si quelqu'un écoute. 

Si vous souhaitez l'utiliser dans un script Shell:

nc -z 8.8.8.8 53  >/dev/null 2>&1
online=$?
if [ $online -eq 0 ]; then
    echo "Online"
else
    echo "Offline"
fi
14
Andrew
#!/bin/bash

INTERNET_STATUS="UNKNOWN"
TIMESTAMP=`date +%s`
while [ 1 ]
 do
    ping -c 1 -W 0.7 8.8.4.4 > /dev/null 2>&1
    if [ $? -eq 0 ] ; then
        if [ "$INTERNET_STATUS" != "UP" ]; then
            echo "UP   `date +%Y-%m-%dT%H:%M:%S%Z` $((`date +%s`-$TIMESTAMP))";
            INTERNET_STATUS="UP"
        fi
    else
        if [ "$INTERNET_STATUS" = "UP" ]; then
            echo "DOWN `date +%Y-%m-%dT%H:%M:%S%Z` $((`date +%s`-$TIMESTAMP))";
            INTERNET_STATUS="DOWN"
        fi
    fi
    sleep 1
 done;

la sortie produira smth comme:

bash-3.2$ ./internet_check.sh
UP   2016-05-10T23:23:06BST 4
DOWN 2016-05-10T23:23:25BST 19
UP   2016-05-10T23:23:32BST 7

le nombre à la fin d’une ligne indique la durée de l’état précédent, c’est-à-dire 19 ans et plus, 7 secondes

2
Cyril R

Utilisez l'option de délai d'attente -t:

ping -q -t 5 -w1 -c1 8.8.8.8 t
2
suspectus

Installez fping:> moins de problème, puis ping.

fping google.com | grep alive

utiliser par exemple comme:

#!/bin/bash

itest=$(fping google.com | grep alive)

while [ "$itest" == "" ] 
        do
        sleep 5
        itest=$(fping google.com | grep alive)
done
echo now online
2
Lizen Kohlhaas

Sans wget

#!/bin/bash

echo -e "GET http://google.com HTTP/1.0\n\n" | nc google.com 80 > /dev/null 2>&1

if [ $? -eq 0 ]; then
    echo "Online"
else
    echo "Offline"
fi

Prendre plaisir ;)

1
user3439968

En utilisant l'exemple ci-dessus, j'ai écrit ce script pour consigner l'état de votre connexion: https://Gist.github.com/cganterh/ffc2fffa8263857cbece

Enregistrez le code suivant dans un fichier name.sh.

#!/bin/bash

while true
do
    wget -q --tries=10 --timeout=20 -O - http://google.com > /dev/null
    if [[ $? -eq 0 ]]; then
        echo $(date) "1" | tee -a log.csv
    else
        echo $(date) "0" | tee -a log.csv
    fi
    sleep 5
done
1
Cristóbal Ganter

Vieux ping fiable dans un script bash séparé:

#!/bin/bash
ipaddr='8.8.8.8' # Google's public DNS server
[[ -z `ping -c1 $ipaddr |& grep -o 'Network is unreachable'` ]] || exit 1
[[ -z `ping -c3 $ipaddr |& grep -o '100% packet loss'` ]] && exit 0 || exit 1

Mettez ceci sur un script séparé. Il gérera différentes situations réseau comme (1) ne pas être connecté à un réseau, (2) connecté au réseau mais ne peut pas accéder à Internet (ou au moins à Google), et (3) connecté à Internet.


Vous pouvez utiliser ultérieurement le exit code du script pour vérifier la connectivité, par exemple.

~$ script-name && echo online || echo offline
0
Majal