Comment puis-je vérifier la connectivité Internet dans une console?


31

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 semble être 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 un moyen facile sans avoir besoin de vérifier un site qui ne plante jamais;)wget --spider http://www.google.co.in/

Edit: On dirait qu'il peut y avoir beaucoup de facteurs qui peuvent être examinés individuellement, c'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'avertit (je pense que ce sera mieux que de simplement le cingler, car le site peut être sous forte charge et peut être en cours de temporisation ou répondre très tard). Hier, il y a eu un problème avec mon Internet. Le LAN était bien connecté mais je ne pouvais accéder à aucun site. Je continue donc à recevoir des notifications car le script n'a pas pu 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 exagéré pour moi car je n'ai pas vraiment besoin de comprendre de quel problème il s'agit. Alors, que proposez-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 façon, je dois vérifier la connectivité Internet uniquement en cas de problème avec le code de réponse de mon blog. C'est un peu lourd (car je n'utilise pas de ping) mais ne devrait pas donner de faux positifs. Droite? De plus, comment puis-je randomiser le ping sur un site différent à chaque fois, comme Facebook, Google, Yahoo etc. puis ignorez les vérifications supplémentaires 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?


La «connectivité Internet» n'a pas de définition claire, vous pouvez uniquement tester la connectivité à un service ou un ensemble de services spécifique. Si vous entendez la connectivité «LAN», une bonne option consiste à envoyer une requête ping à votre passerelle réseau.
João Pinto

En termes simples, je définirais la connectivité Internet si vous pouvez accéder à Internet. Le problème peut par n'importe quoi entre les deux. J'ai juste besoin de faire la différence entre si cela fonctionne bien ou s'il y a un problème parmi l'ensemble des problèmes qui peuvent être responsables. J'espère que je me suis bien fait comprendre. :)
Ashfame

Réponses:


29

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 pour surveiller une cible. (Avertissement: je ne suis en aucun cas affilié à Pingdom).

Deuxièmement, utiliser wget --spiderpour votre propre script est une bonne idée. Vous obtiendrez des faux positifs lorsque votre ordinateur est en panne ou lorsque votre serveur DNS ne fonctionne pas. La vérification du code retour est un moyen simple de mettre en œuvre ceci:

wget --spider --quiet http://example.com
if [ "$?" != 0 ]; then
  echo "Website failed!" | mail -s "Website down" your_email@provider.tld
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, d'autres ne peuvent pas accéder à votre site même si la surveillance indique que tout va bien. Vous pouvez écrire une solution de contournement courte 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 -c1sur plusieurs sites bien connus (par exemple www.google.com, facebook.com et ping.funet.fi) et vérifier les codes retour pour déterminer si une destination est accessible. Vous pouvez vérifier automatiquement le code retour en utilisant une variable $?. Le paramètre -c1limite le nombre de paquets ping à un.

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

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

sudo ethtool eth0

De la sortie (extrait):

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

Cependant, cela ne dit pas si vous avez vraiment une connectivité ou non, juste si le câble est connecté et que quelque chose se trouve à l'autre extrémité.


Ceci est totalement pour ma configuration, travaillant sur Ethernet Always-ON. Mais heureux que vous ayez souligné comment cela ne fonctionnera pas correctement dans certains cas. Je pense également que le ping serait plus rapide que wget. Qu'est-ce que tu penses? et si je vérifie un code d'état 200 n'importe où, je préfère simplement le cingler. Droite? ou il y a quelque chose que je devrais savoir?
Ashfame

2
le ping est plus rapide et meilleur, car l'autre extrémité ne sera pas en colère pour vous. ping est assez sûr, mais même cela ne garantit pas que vous pouvez ouvrir des pages Web. En outre, il est possible que le pare-feu bloque le ping mais autorise les requêtes HTTP.
Olli

1
Pinging un serveur DNS bien connu comme 4.2.2.2 est également utile dans le cas où vous avez une connectivité nette mais des DNS cassés.
djeikyb

Pour la vérification DNS, vous pouvez bien sûr utiliser host(requête DNS). C'est aussi très rapide.
Olli

Merci pour votre réponse @Olli & @djeikyb J'ai mis à jour la question, veuillez jeter un œil
Ashfame

7

J'utilise cette méthode ...

if [["$ (ping -c 1 8.8.8.8 | grep '100% packet loss')"! = ""]]; puis
    écho "Internet n'est pas présent"
    sortie 1
autre
    écho "Internet est présent"
    wget www.site.com
Fi

J'ai obtenu des résultats différents pour ping -c 1 8.8.8.8et ping -c 1 www.google.com. Comment c'est?
MERose

2
Notez que cela échouera en Chine et dans d'autres pays qui bloquent Google
Tom J Nowell

7

Je viens d'utiliser

nm-online

qui s'arrête 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

Vérifier pour voir si un site est en place se fait généralement avec un outil de surveillance comme nagios. Cela surveillera en permanence le site et pourra vous informer des pannes.

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

  • Vérifiez que l'Internet est en place ping google.com(vérifie le DNS et le site accessible connu).
  • Vérifiez que le site Web est en cours d'utilisation wgetou w3mpour récupérer la page.

Si Internet n'est pas en place, diagnostiquez vers l'extérieur.

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

Si Internet est en place mais que le site est en panne, vérifiez le w3m http://isup.me/example.comremplacement example.compar le site qui apparaît en panne. Utilisez wget, lynx ou le navigateur de ligne de commande dont vous disposez si vous n'avez pas installé le navigateur w3m.


Merci pour votre suggestion! Mon script couvre-t-il l'exigence de base de vérifier et de m'alerter lorsque mon site est en panne? Et ce sera calme en cas de problème de connectivité Internet
Ashfame

Il semble que votre script fera ce que vous voulez. Vous pouvez inclure la commande wget dans l'instruction if en tant que if ! wget --spider http:///example.com; then.
BillThor

vous voulez dire que wget renvoie toujours 1 pour 200 codes de réponse HTTP?
Ashfame

Je veux dire que le test [ $? != 0 ]est le même que le test ! command. wget est documenté pour retourner 0 en cas de succès et non 0 en cas d'échec. Le if se comporte de la même manière que vous le codiez. Si wget renvoie un échec sur une réponse 200, le test échouera dans les deux cas. De même s'il renvoie 0 pour un code de réponse autre que 200.
BillThor

Merci! Cela rendrait le script plus petit et facile à comprendre.
Ashfame

4

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é alarm.mp3 dans le même dossier si vous voulez une fonctionnalité d'alarme sonore. Enfin, configurez l'URL du site Web et egrep selon vos besoins.


Cela fonctionne parfaitement même lorsque l'utilisateur est derrière un portail captif et qu'il n'est pas connecté.
Ashhar Hasan

Vous pouvez utiliser à la egrep -qplace deegrep ... > /dev/null
wjandrea

Pourquoi le script s'appelle-t-il au lieu d'utiliser simplement une whileboucle?
wjandrea

Oh attends, ça ne s'appelle pas. Il appelle un script appelé alarm.shdans le wd, donc si vous appelez ce script à partir d'un répertoire différent, ce sera une erreur, ou s'il y a un script appelé alarm.shdans le wd, il l'appellera à la place. C'est donc une mauvaise pratique. Vous pouvez utiliser à la "$0"place, mais une whileboucle serait préférable.
wjandrea

"Pourquoi le script s'appelle-t-il au lieu d'utiliser simplement une boucle while?": Parce que j'étais un noobs quand j'ai fait ce post et oui ce script s'appelait lui-même.
01BTC10

2

Vérifier si Internet fonctionne

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

De la sortie (extrait):

1 #System is connected to internet

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


2
nm-toola été supprimé dans Ubuntu 15.04+, mais vous pouvez l'utiliser à la nmcliplace. Par exemple[[ $(nmcli -f STATE -t g) = connected ]]
Six

@Six nmcli -f STATE -t nmla bonne chose est d'être indépendant des sites Web!
Aquarius Power

1
Notez que nm-toolet nmcline vous dira que si vous êtes connecté ou non au réseau local réseau , c'est-à-dire si vous êtes connecté ou non à votre wifi / Ethernet domestique. Il ne vous dira pas si vous pouvez atteindre quoi que ce soit au-delà de votre réseau local, c'est-à-dire Internet.
Sergiy Kolodyazhnyy

1

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 y a Internet.


0

J'avais besoin d'aide pour la même question, et j'ai obtenu ma réponse de cette façon:

echo $(nm-online) $? connection problems

Comment cela marche-t-il?
wjandrea

Il s'agit simplement de vérifier l'état (un caractère) de la nm-onlinecommande ... Il retournera 0 si tout va bien. Habituellement dans toutes les UNIXcoquilles.
Antonio

0

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

Étant donné que ma connexion Internet est instable, j'ai créé ce script ( basé sur celui-ci ) qui émet un doux accord pour m'appeler, et utilise également Ubuntu pour avertir lorsque la connexion Internet revient:

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

Je cherchais un script qui testerait continuellement ma connexion Internet, qui serait démarré chaque fois que mon serveur était en marche et j'ai fait ceci:

  1. Tout d'abord, installez fping

    apt-get install fping
    
  2. Créez un script init 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" your_email@gmail.com
    
    #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" your_email@gmail.com
        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

J'ai été confronté à des abandons aléatoires de connexions Wi-Fi par mon Broadcom BCM94331CD puce. J'ai conçu le script bash suivant (boucle infinie) vérifiant chaque seconde si la connexion Internet Wi-Fi est opérationnelle. L'autre ligne de commande proposée ici attendra au moins 5 à 10 secondes avant de se fermer avec un état ie ping. En attendant, je recherche également une solution définitive.

À partir des résultats sur askubuntu, je devrai purger le bcmwl-kernel-sourcepackage au fur firmware-b43-installeret à mesure que j'utilise etb43-fwcutter .

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

Ce script doit être ajouté dans les programmes de démarrage et n'a pas besoin de super userprivilèges 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.