Shell Scripting: une bonne façon de vérifier la connectivité Internet?

J'ai trouvé des scripts qui disent qu'ils vérifient la connectivité Internet. Certains vérifient l'adresse IP si l'interface est connectée MAIS il ne vérifie pas la connectivité internet. J'ai trouvé certains qui utilise ping comme ceci: if [ 'ping google.com -c 4 | grep time' != "" ]; then if [ 'ping google.com -c 4 | grep time' != "" ]; then if [ 'ping google.com -c 4 | grep time' != "" ]; then parfois, cela peut ne pas être fiable.

Des suggestions sur la bonne façon de vérifier la connectivité Internet en utilisant des scripts? Dois-je utiliser des packages?

Il doit être capable de vérifier périodiquement (je devine cron), puis, faire quelque chose quand la connection descend (peut-être appeler ifup --force [interface] )

Encore une chose: Est-ce que j'utilise le mot "invoquer" correctement?

    Test de la connectivité IPv4

    Si votre réseau le permet, essayez d'interroger 8.8.8.8 (un server géré par Google).

     if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then echo "IPv4 is up" else echo "IPv4 is down" fi 

    Test de la connectivité IP et du DNS

    Si vous souhaitez uniquement que le test réussisse lorsque DNS fonctionne également, utilisez un nom d'hôte.

     if ping -q -c 1 -W 1 google.com >/dev/null; then echo "The network is up" else echo "The network is down" fi 

    Test de la connectivité Web

    Certains pare-feu bloquent les pings. Certains endroits ont un pare-feu qui bloque tout le trafic, sauf via un proxy Web. Si vous souhaitez tester la connectivité Web, vous pouvez effectuer une requête HTTP.

     case "$(curl -s --max-time 2 -I http://google.com | sed 's/^[^ ]* *\([0-9]\).*/\1/; 1q')" in [23]) echo "HTTP connectivity is up";; 5) echo "The web proxy won't let us through";; *) echo "The network is down or very slow";; esac 

    Je recommand fortement d'utiliser ping pour déterminer la connectivité. Il y a trop d'administrateurs réseau qui désactivent ICMP (le protocole qu'il utilise) en raison des soucis liés aux attaques de ping provenant de leurs réseaux.

    Au lieu de cela, j'utilise un test rapide d'un server fiable sur un port que vous pouvez espérer ouvrir:

     if nc -zw1 google.com 443; then echo "we have connectivity" fi 

    Cela utilise netcat ( nc ) en mode port scan , un quick poke ( -z est zéro-I / O mode [utilisé pour la numérisation] ) avec un timeout rapide ( -w 1 attend au plus une seconde). Il vérifie Google sur le port 443 (HTTPS).

    J'ai utilisé HTTPS plutôt que HTTP comme un effort de protection contre les portails captifs et les proxies transparents qui peuvent répondre sur le port 80 (HTTP) pour n'importe quel hôte. Cela est less probable lors de l'utilisation du port 443 car il y aurait une incompatibilité de certificate, mais cela se produit quand même.

    Si vous voulez vous prouver contre cela, vous devrez valider la security sur la connection:

     test=google.com if nc -zw1 $test 443 && echo |openssl s_client -connect $test:443 2>&1 |awk ' handshake && $1 == "Verification" { if ($2=="OK") exit; exit 1 } $1 $2 == "SSLhandshake" { handshake = 1 }' then echo "we have connectivity" fi 

    Cela vérifie une connection (au lieu d'attendre que openssl expire), puis effectue le handshake SSL, en tapant sur la phase de vérification. Il se ferme silencieusement ("true") si la vérification était "OK" ou bien se termine par une erreur ("false"), puis nous rapportons la constatation.

    J'ai fait un script qui utilise plusieurs façons de vérifier la connection internet (ping, nc et curl, grâce à Adam Katz, Gilles et Archemar). J'espère que quelqu'un trouve cela utile. N'hésitez pas à le modifier à votre convenance / l'optimiser.

    Vérifie la connection, le DNS et la connection Internet (en utilisant curl, nc et ping). Mettez ceci dans un file puis rendez-le exécutable (généralement sudo chmod +x filename )

     #!/bin/bash GW=`/sbin/ip route | awk '/default/ { print $3 }'` checkdns=`cat /etc/resolv.conf | awk '/nameserver/ {print $2}' | awk 'NR == 1 {print; exit}'` checkdomain=google.com #some functions function portscan { tput setaf 6; echo "Starting port scan of $checkdomain port 80"; tput sgr0; if nc -zw1 $checkdomain 80; then tput setaf 2; echo "Port scan good, $checkdomain port 80 available"; tput sgr0; else echo "Port scan of $checkdomain port 80 failed." fi } function pingnet { #Google has the most reliable host name. Feel free to change it. tput setaf 6; echo "Pinging $checkdomain to check for internet connection." && echo; tput sgr0; ping $checkdomain -c 4 if [ $? -eq 0 ] then tput setaf 2; echo && echo "$checkdomain pingable. Internet connection is most probably available."&& echo ; tput sgr0; #Insert any command you like here else echo && echo "Could not establish internet connection. Something may be wrong here." >&2 #Insert any command you like here # exit 1 fi } function pingdns { #Grab first DNS server from /etc/resolv.conf tput setaf 6; echo "Pinging first DNS server in resolv.conf ($checkdns) to check name resolution" && echo; tput sgr0; ping $checkdns -c 4 if [ $? -eq 0 ] then tput setaf 6; echo && echo "$checkdns pingable. Proceeding with domain check."; tput sgr0; #Insert any command you like here else echo && echo "Could not establish internet connection to DNS. Something may be wrong here." >&2 #Insert any command you like here # exit 1 fi } function httpreq { tput setaf 6; echo && echo "Checking for HTTP Connectivity"; tput sgr0; case "$(curl -s --max-time 2 -I $checkdomain | sed 's/^[^ ]* *\([0-9]\).*/\1/; 1q')" in [23]) tput setaf 2; echo "HTTP connectivity is up"; tput sgr0;; 5) echo "The web proxy won't let us through";exit 1;; *)echo "Something is wrong with HTTP connections. Go check it."; exit 1;; esac # exit 0 } #Ping gateway first to verify connectivity with LAN tput setaf 6; echo "Pinging gateway ($GW) to check for LAN connectivity" && echo; tput sgr0; if [ "$GW" = "" ]; then tput setaf 1;echo "There is no gateway. Probably disconnected..."; tput sgr0; # exit 1 fi ping $GW -c 4 if [ $? -eq 0 ] then tput setaf 6; echo && echo "LAN Gateway pingable. Proceeding with internet connectivity check."; tput sgr0; pingdns pingnet portscan httpreq exit 0 else echo && echo "Something is wrong with LAN (Gateway unreachable)" pingdns pingnet portscan httpreq #Insert any command you like here # exit 1 fi 

    il existe de nombreuses adresses IP sur Internet, une approche légère consiste à envoyer un ping à certains d'entre eux

      if ping -c 4 google.com ; then OK ; else KO ; fi if ping -c 4 facebook.com ; then OK ; else KO ; fi if ping -c 4 nsa.gov ; then OK ; else KO ; fi # <- this one might not reply 

    une réponse plus complète pourrait être d'get des pages en utilisant wget

      wget google.com -o google.txt if parse google.txt ; then OK ; else KO ; fi 

    • Parse est un programme que vous écrivez pour vous assurer que google.txt n'est pas une (trop vieille) version en cache de google.com