web-dev-qa-db-fra.com

Comment vérifier la connectivité Internet dans une console?

Existe-t-il un moyen simple de vérifier la connectivité Internet à partir de la console? J'essaie de jouer dans un script Shell. Une idée me semble être de wget --spider http://www.google.co.in/ et de vérifier le code de réponse HTTP pour interpréter si la connexion Internet fonctionne correctement. Mais je pense qu'il doit y avoir moyen facile sans la nécessité de vérifier un site qui ne plante jamais;)

Edit: On dirait qu'il peut y avoir beaucoup de facteurs qui peuvent être examinés individuellement, ce qui est une bonne chose. Mon intention pour le moment est de vérifier si mon blog est en panne. J'ai configuré cron pour le vérifier toutes les minutes. Pour cela, je vérifie le code de réponse HTTP de wget --spider sur mon blog. Si ce n'est pas 200, il m'en avertit (je pense que ce sera mieux que de simplement l'envoyer, car le site peut être très chargé et le délai d'attente ou une réponse très tardive). Or hier, il y avait un problème avec mon Internet. Le réseau local était bien connecté, mais je ne pouvais accéder à aucun site. Je continue donc à recevoir des notifications car le script ne pouvait pas trouver 200 dans la réponse wget. Maintenant, je veux m'assurer qu'il affiche une notification lorsque j'ai une connexion Internet.

Donc, vérifier la connectivité DNS et LAN est un peu excessif pour moi car je n’ai pas vraiment besoin de comprendre le problème. Alors, que suggérez-vous comment je le fais?

Voici mon script pour continuer à vérifier les temps d'arrêt de mon blog:

#!/bin/bash

# Sending the output of the wget in a variable and not what wget fetches
RESULT=`wget --spider http://blog.ashfame.com 2>&1`
FLAG=0

# Traverse the string considering it as an array of words
for x in $RESULT; do
    if [ "$x" = '200' ]; then
        FLAG=1 # This means all good
    fi
done

if [ $FLAG -eq '0' ]; then
    # A good point is to check if the internet is working or not
        # Check if we have internet connectivity by some other site
        RESULT=`wget --spider http://www.facebook.com 2>&1`
        for x in $RESULT; do
            if [ "$x" = '200' ]; then
                FLAG=1 # This means we do have internet connectivity and the blog is actually down
            fi
        done

    if [ $FLAG -eq '1' ]; then
        DISPLAY=:0 notify-send -t 2000 -i /home/ashfame/Dropbox/Ubuntu/icons/network-idle.png "Downtime Alert!" "http://blog.ashfame.com/ is down."         
    fi  
fi

exit

De cette manière, je n'ai besoin de vérifier la connectivité Internet que s'il existe un problème avec le code de réponse de mon blog. C'est un peu lourd (comme je n'utilise pas de ping) mais ne devrait pas donner de faux positifs. Droite? Aussi, comment puis-je envoyer des requêtes ping sur un site différent à chaque fois, comme Facebook, Google, Yahoo, etc.? De plus, je peux écrire dans un fichier journal afin de contrôler le nombre de contrôles d'indisponibilité et passez ensuite à d'autres vérifications jusqu'à ce que le site soit en panne ou provoquez des vérifications plus longues (10 minutes au lieu de toutes les minutes). Qu'est-ce que tu penses?

29
Ashfame

Vérifier si un site Web spécifique est en place

Premièrement, plusieurs bons services de surveillance en ligne sont disponibles. Pour en choisir un, Pingdom inclut un compte gratuit permettant de surveiller une cible. (Avertissement: je suis pas affilié à Pingdom en aucune façon).

Deuxièmement, utiliser wget --spider pour votre propre script est une bonne idée. Vous obtenez des faux positifs lorsque votre ordinateur est en panne ou que votre serveur DNS ne fonctionne pas. Vérifier le code de retour est un moyen simple de le faire:

wget --spider --quiet http://example.com
if [ "$?" != 0 ]; then
  echo "Website failed!" | mail -s "Website down" [email protected]
fi

Encore une fois, cette approche présente des lacunes. Si votre fournisseur a mis en cache votre enregistrement DNS, mais que le serveur DNS est en panne, les autres utilisateurs ne peuvent pas accéder à votre site même si l'analyse indique que tout va bien. Vous pouvez écrire une solution de contournement rapide avec Host, par exemple Host example.com <your dns server IP>. Cela renverra une erreur si le serveur DNS ne répond pas, même si OpenDNS ou le serveur DNS de votre propre fournisseur fonctionne correctement.

Vérifier si Internet fonctionne

Il n'y a pas vraiment de moyen facile de gérer cela dans tous les cas.

Vous pouvez par exemple exécuter ping -c1 sur plusieurs sites connus (par exemple, www.google.com, facebook.com et ping.funet.fi) et vérifier les codes de retour pour déterminer si une destination est accessible. Vous pouvez vérifier automatiquement le code de retour à l'aide de la variable $?. Le paramètre -c1 limite le nombre de paquets ping à un.

Vous pouvez rencontrer des problèmes avec certains réseaux publics lorsqu'il existe une passerelle de connexion qui redirige toutes les requêtes ping et HTTP. Si tel est le cas, vous pouvez obtenir des réponses au ping et des codes d’état HTTP sans erreur, même lorsque vous ne pouvez accéder à aucun autre site.

Si vous voulez vérifier l'état du câble, vous pouvez utiliser

Sudo ethtool eth0

De sortie (extrait):

Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
Link detected: yes

Cependant, cela ne dit pas si vous avez réellement une connectivité ou pas, mais juste si le câble est connecté et quelque chose est à l'autre bout.

27
Olli

J'utilise cette méthode ...

 if [["$ (ping -c 1 8.8.8.8 | grep '100% perte de paquet')"! = ""]]; alors 
 echo "Internet n'est pas présent" 
 sortie 1 
 sinon 
 echo "Internet est présent" 
 wget www.site.com 
Fi
7
bais bais

Je viens d'utiliser

nm-online

qui s'interrompt jusqu'à ce qu'une connexion réseau soit présente par le gestionnaire de réseau. A bien fonctionné. Vous pouvez aussi faire d'autres choses avec.

6
ntsecrets

La vérification de la disponibilité d’un site est généralement effectuée à l’aide d’un outil de surveillance tel que nagiosname__. Cela surveillera en permanence le site et pourra vous avertir des pannes.

Lorsque je vérifie si Internet est activé depuis la ligne de commande, je passe par un certain nombre d’étapes:

  • Check Internet is up ping google.com (vérifie DNS et le site accessible connu).
  • Vérifiez que le site Web est actif, utilisez wgetou w3m pour récupérer la page.

Si Internet n'est pas actif, diagnostiquez-le vers l'extérieur.

  • Vérifiez la passerelle est pingable. (Vérifiez si ifconfig est l’adresse de la passerelle.)
  • Vérifiez que les serveurs DNS sont pingables. (Vérifiez /etc/resolv.conf pour les adresses.)
  • Vérifiez si le pare-feu bloque. (Vérifiez/var/log/syslog lorsque je journalise des blocs.)

Si Internet est en service mais que le site est en panne, vérifiez avec w3m http://isup.me/example.com en remplaçant example.com par le site qui apparaît en bas. Utilisez wget, lynx ou tout autre navigateur en ligne de commande disponible si le navigateur w3m n’est pas installé.

5
BillThor

Voici le script Shell que j'utilise pour tester la connectivité Internet:

alarm.sh

#! /bin/bash

if curl --silent --head http://www.google.com/ |
    egrep "20[0-9] Found|30[0-9] Found" >/dev/null
then
    echo Internet status: OK
else
    echo Internet status: ERROR
    mpg321 alarm.mp3 &> /dev/null
fi
sleep 60
clear

./alarm.sh

Vous devrez installer curl et mpg321

Sudo apt-get install curl mpg321

Vous aurez besoin d’un fichier son .mp3 renommé en alarm.mp3 dans le même dossier si vous souhaitez une fonctionnalité d’alarme sonore. Enfin, configurez l’URL du site Web et egrep à vos besoins.

3
01BTC10

Vérifier si Internet fonctionne

Sudo nm-tool | grep "State: connected" | wc -l

De sortie (extrait):

1 #System is connected to internet

Cependant, comme d'autres l'ont mentionné, cela ne dit pas si vous avez réellement une connectivité ou non. Par exemple. Vous pourriez être connecté au routeur et le routeur n’est pas nécessairement connecté à Internet.

2
Venkat Kotra

J'utilise cette méthode:

if curl -s --head  --request GET www.google.com | grep "200 OK" > /dev/null ; then
    echo "Internet is present"
else
    echo "Internet isn't present"
fi

Il essaiera de se connecter à un site Web bien connu et s’il peut s'y connecter, nous supposerons qu’il ya Internet.

1
Carlos Abraham

Je recherchais un script permettant de tester en permanence ma connexion Internet, qui serait démarré chaque fois que mon serveur était installé et que je réalisais ceci:

  1. Tout d'abord, installez fping

    apt-get install fping
    
  2. Créez un script d'initialisation dans le dossier /etc/init.d avec le contenu suivant (je l'ai appelé testcon)

    #!/bin/bash
    
    PIDFILE=/var/run/testcon.pid
    
    . /lib/lsb/init-functions
    
    case "$1" in
      start)
            log_daemon_msg "Starting internet connection tester"
            /etc/init.d/testcond &
            echo $! > $PIDFILE
            log_end_msg $?
        ;;
      stop)
            log_daemon_msg "Stopping internet connection tester"
            PID=$(cat $PIDFILE)
            kill -9 "$PID"
            log_end_msg $?
        ;;
      *)
        echo "Usage: /etc/init.d/testcon {start|stop}"
        exit 1
        ;;
    esac
    
    exit 0
    
  3. Créez un script dans le dossier /etc/init.d avec le contenu suivant (je l'ai appelé testcond)

    #echo Computer starting or testing daemon init
    while [ "$itest" == "" ] 
    do
        #wait 5 seconds 
        sleep 5
        itest=$(fping 8.8.8.8 | grep alive)
    done
    date | mail -s "Server is up and Internet is online" [email protected]
    
    #loop forever
    while [ "1" == "1" ] 
    do
        itest=$(fping 8.8.8.8 | grep alive)
        #if internet is down
        if [ "$itest" == "" ] 
        then
            #echo Internet is down
            #log time it was found down
            current_time=$(date)
            echo "Internet was found down @ $current_time" >> /mnt/data/Server/internet_log.txt
            #loop until it is back
            while [ "$itest" == "" ] 
            do
                #wait 60 seconds 
                sleep 60
                itest=$(fping 8.8.8.8 | grep alive) # test the internet
            done
            #when it is back
            current_time=$(date)
            echo "Internet is back        @ $current_time" >> /mnt/data/Server/internet_log.txt
            body=$(tail -2 /mnt/data/Server/internet_log.txt)
            echo "$body" | mail -s "Internet is back online" [email protected]
        fi
        #echo Internet is online
        #wait 60 seconds
        sleep 60
            done
    
  4. Ensuite, j'exécute les commandes ci-dessous pour ajouter au démarrage:

    Sudo update-rc.d testcon defaults
    Sudo update-rc.d testcon enable
    
  5. Redémarrer

0
Rafael

J'avais besoin d'aide pour la même question et j'ai obtenu ma réponse de la manière suivante:

echo $(nm-online) $? connection problems
0
octius4u

Vérifier si Internet fonctionne n'est pas si trivial. ping est ICMP, donc cela pourrait fonctionner même si le proxy web est en panne. Quelque chose de similaire se produit avec DNS si vous testez avec une adresse IP.

Comme ma connexion Internet est instable, j'ai créé ce script ( basé sur celui-ci ) qui émet un son doux pour m'appeler, et utilise également Ubuntu notify lorsque la connexion Internet est rétablie:

#!/bin/bash

hash play 2>&- || { echo >&2 "I require «play» but it's not installed. Try apt-get install sox. Aborting."; exit 1; }

WGET="`which wget`"
URL="http://www.google.com"
delay=3;
noConnectionMessage="No connection, trying again in $delay seconds...";
connectionMessage="WE HAVE INTERNET! :) Trying again in $delay seconds...";

echo "INTERNET TESTER: Type Ctrl+C to quit";
rm --force /tmp/index.site

function playSound {
    time=1;    # Time played
    if [ `sox --version| grep -oP "v[0-9.]+" | sed "s/[v.]//g"` -lt 1431 ]; then    #analize sox version, if greater than v14.3.1 can use pluck
        play -q -n synth $time sine;
    else
        play -q -n synth $time pluck $1;
        #for i in G4 G4 G4 E4;do play -n synth 0.1 pluck $i repeat 2;done    # You can play with something like this also :) (first three notes from Beethoven 5th symphony)
    fi
}

while [ 1 -eq 1 ]; do
    $WGET -q --tries=10 --timeout=2 $URL -O /tmp/index.site &> /dev/null
    if [ ! -s /tmp/index.site ];then
        echo $noConnectionMessage;
        #playSound E2
        sleep 1;
    else
        #~ zenity --warning --text "ADDRESS is back"
        notify-send -i "notification-network-wireless-full" "Connection state:" "$connectionMessage";
        echo $connectionMessage;
        playSound E3
    fi
    sleep $delay;
done

exit 0;
0
pabloab

J'ai été confronté à des déjections aléatoires de connexions Wi-Fi avec ma puce Broadcom BCM94331CD. J'ai conçu le script bash suivant (boucle infinie) vérifiant chaque seconde si la connexion Internet Wi-Fi est opérationnelle. Une autre ligne de commande proposée ici attendra au moins 5 à 10 secondes avant de se fermer avec un statut, à savoir pingname__. En attendant, je cherche aussi une solution définitive.

D'après les résultats de askubuntu, je devrai purger le paquet bcmwl-kernel-source car j'utilise firmware-b43-installer et b43-fwcutter.

Merci à tous pour leurs suggestions (ci-dessus).

Ce script doit être ajouté aux programmes de démarrage et n'a pas besoin du privilège super user pour s'exécuter également.

#!/bin/bash
#

# Check if Wi-Fi is disabled e.g. 'out of range'
# If so quickly re-enable Wi-Fi
# Due to a problem with Broadcom proprietary driver in package firmware-b43-installer

# Script is part of Start-Up programs
# Stored in /usr/local/bin/
# Infinite loop checking every second if Wi-Fi is up and running

while true; do
  # https://askubuntu.com/questions/27954/how-can-i-check-internet-connectivity-in-a-console
  if [[ $(nmcli -f STATE -t g) != 'connected' ]]; then
    # Disable and Re-Enable Wi-Fi as the Wi-Fi is now 'out of range' (disconnected)
    nmcli radio wifi off
    nmcli radio wifi on
  fi
  sleep 1
done
0
Antonio