Wie kann ich die Internetverbindung in einer Konsole überprüfen?


31

Gibt es eine einfache Möglichkeit, die Internetverbindung von der Konsole aus zu überprüfen? Ich versuche, in einem Shell-Skript herumzuspielen. Ich scheine die Idee zu haben , den HTTP-Antwortcode zu überprüfen, um zu interpretieren, ob die Internetverbindung einwandfrei funktioniert. Aber ich denke, es muss ein einfacher Weg sein, ohne eine Seite zu überprüfen, die niemals abstürzt;)wget --spider http://www.google.co.in/

Edit: Scheint so, als ob es viele Faktoren geben kann, die individuell untersucht werden können, eine gute Sache. Im Moment ist es meine Absicht zu überprüfen, ob mein Blog ausgefallen ist. Ich habe Cron eingerichtet, um es jede Minute zu überprüfen. Dazu überprüfe ich den HTTP-Antwortcode von wget -spider in meinem Blog. Wenn es nicht 200 ist, benachrichtigt es mich (ich glaube, dies ist besser, als nur zu pingen, da die Site unter starker Last sein kann und eine Zeitüberschreitung aufweist oder sehr spät reagiert). Gestern gab es ein Problem mit meinem Internet. LAN war gut verbunden, aber ich konnte auf keine Seite zugreifen. Daher erhalte ich immer wieder Benachrichtigungen, da das Skript in der wget-Antwort keine 200 gefunden hat. Jetzt möchte ich sicherstellen, dass eine Benachrichtigung angezeigt wird, wenn eine Internetverbindung besteht.

Die Überprüfung auf DNS- und LAN-Konnektivität ist für mich ein bisschen übertrieben, da ich nicht so genau herausfinden muss, um welches Problem es sich handelt. Also, was schlagen Sie vor, wie ich es mache?

Hier ist mein Skript, mit dem ich die Ausfallzeiten meines Blogs überprüfen kann:

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

Auf diese Weise muss ich nur dann auf Internetverbindung prüfen, wenn ein Problem mit meinem Blog-Antwortcode vorliegt. Es ist ein bisschen schwer (da ich kein Ping verwende), sollte aber keine falsch positiven Ergebnisse liefern. Recht? Wie kann ich auch das Pingen zu einer anderen Site, wie Facebook, Google, Yahoo usw., zufällig einstellen? Auch (ich habe versucht, jegliche E / A zu vermeiden) kann ich in eine Protokolldatei schreiben, mit der ich die Anzahl der Ausfallzeitprüfungen und -prüfungen überprüfen kann Überspringen Sie dann weitere Überprüfungen, bis die Site nicht mehr verfügbar ist, oder führen Sie längere Überprüfungen durch (10 Minuten statt jeder Minute). Was denkst du?


"Internetkonnektivität" ist nicht eindeutig definiert. Sie können die Konnektivität nur für einen bestimmten Dienst oder eine Reihe von Diensten testen. Wenn Sie "LAN" -Konnektivität meinen, ist es eine gute Option, Ihr Netzwerk-Gateway zu pingen.
João Pinto

In Laienbegriffen würde ich Internet-Konnektivität definieren, wenn Sie auf das Internet zugreifen können. Problem kann durch nichts dazwischen kommen. Ich muss nur unterscheiden, ob es gut funktioniert oder ob es ein Problem gibt, das verantwortlich sein kann. Ich hoffe, ich habe mich klar ausgedrückt. :)
Ashfame

Antworten:


29

Überprüfen, ob eine bestimmte Website aktiv ist

Erstens sind mehrere gute Online-Überwachungsdienste verfügbar. Pingdom enthält ein kostenloses Konto für die Überwachung eines Ziels. (Disclaimer: Ich bin nicht mit Pingdom in irgendeiner Weise verbunden).

Zweitens ist die Verwendung eines wget --spidereigenen Skripts eine gute Idee. Sie erhalten einige Fehlalarme, wenn Ihr Computer heruntergefahren ist oder wenn Ihr DNS-Server nicht funktioniert. Das Überprüfen des Rückkehrcodes ist eine einfache Möglichkeit, dies zu implementieren:

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

Wiederum weist dieser Ansatz Mängel auf. Wenn Ihr Provider Ihren DNS-Eintrag zwischengespeichert hat, der DNS-Server jedoch nicht verfügbar ist, können andere Benutzer nicht auf Ihre Site zugreifen, obwohl die Überwachung anzeigt, dass alles in Ordnung ist. Sie können kurze Abhilfe mit schreiben host, zum Beispiel host example.com <your dns server IP>. Dies gibt einen Fehler zurück, wenn der DNS-Server nicht antwortet, auch wenn OpenDNS oder der DNS-Server Ihres eigenen Anbieters einwandfrei funktionieren.

Überprüfen Sie, ob das Internet funktioniert

Es ist nicht in jedem Fall einfach, damit umzugehen.

Sie können beispielsweise ping -c1auf mehreren bekannten Websites (z. B. www.google.com, facebook.com und ping.funet.fi) ausgeführt und die Rückkehrcodes überprüfen, um festzustellen, ob ein Ziel erreichbar ist. Sie können den Rückgabecode mithilfe der Variablen automatisch überprüfen $?. Der Parameter -c1begrenzt die Anzahl der Ping-Pakete auf eins.

Bei einigen öffentlichen WLANs können Probleme auftreten, wenn ein Anmeldegateway vorhanden ist, das alle Pings und HTTP-Anforderungen umleitet. In diesem Fall erhalten Sie möglicherweise Ping-Antworten und fehlerfreie HTTP-Statuscodes, auch wenn Sie nicht auf andere Websites zugreifen können.

Wenn Sie den Kabelstatus überprüfen möchten, können Sie verwenden

sudo ethtool eth0

Aus der Ausgabe (Auszug):

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

Dies sagt jedoch nichts darüber aus, ob Sie wirklich über eine Verbindung verfügen oder nicht, sondern nur, ob ein Kabel angeschlossen ist und sich etwas auf der anderen Seite befindet.


Dies ist völlig für meine Einrichtung, die an Always-ON-Ethernet arbeitet. Aber froh, dass Sie darauf hingewiesen haben, dass es in einigen Fällen nicht richtig funktioniert. Außerdem glaube ich, dass Ping schneller ist als Wget. Was denkst du? und wenn ich irgendwo nach einem 200-Statuscode suche, würde ich ihn lieber nur anpingen. Recht? oder gibt es etwas, das ich wissen sollte?
Ashfame

2
Ping ist schneller und besser, weil das andere Ende dir nicht böse sein wird. ping ist ziemlich sicher, aber selbst das garantiert nicht, dass Sie Webseiten öffnen können. Es ist auch möglich, dass die Firewall Ping blockiert, aber HTTP-Anforderungen zulässt.
Olli

1
Pingen Sie einen bekannten DNS-Server wie 4.2.2.2.
djeikyb

Für die DNS-Prüfung können Sie natürlich host(DNS-Abfrage) verwenden. Es ist auch sehr schnell.
Olli

Vielen Dank für Ihre Antwort @Olli & @djeikyb Ich habe die Frage aktualisiert, bitte schauen Sie
Ashfame

7

Ich benutze diese Methode ...

if [["$ (ping -c 1 8.8.8.8 | grep '100% Paketverlust')"! = ""]]; dann
    Echo "Internet ist nicht vorhanden"
    Ausfahrt 1
sonst
    Echo "Internet ist vorhanden"
    wget www.site.com
fi

Ich habe unterschiedliche Ergebnisse für ping -c 1 8.8.8.8und ping -c 1 www.google.com. Wie ist das?
MERose

2
Beachten Sie, dass dies in China und anderen Ländern, in denen Google blockiert ist, nicht funktioniert
Tom J Nowell

7

Ich habe gerade benutzt

nm-online

Dies hält an, bis der Netzwerkmanager eine Netzwerkverbindung hergestellt hat. Gut gearbeitet. Sie können auch andere Sachen damit machen.


6

Die Überprüfung, ob eine Site aktiv ist, erfolgt normalerweise mit einem Überwachungstool wie nagios. Dadurch wird die Site kontinuierlich überwacht und Sie können über Ausfälle informiert werden.

Wenn ich über die Befehlszeile überprüfe, ob das Internet verfügbar ist, führe ich eine Reihe von Schritten aus:

  • Überprüfen Sie, ob das Internet verfügbar ist ping google.com(überprüft DNS und die bekannte erreichbare Site).
  • Überprüfen Sie, ob die Website verwendet wird wgetoder w3mum die Seite abzurufen.

Wenn das Internet nicht verfügbar ist, diagnostizieren Sie es nach außen.

  • Überprüfen Sie, ob das Gateway pingfähig ist. (Überprüfen Sie ifconfig für die Gateway-Adresse.)
  • Überprüfen Sie, ob die DNS-Server pingfähig sind. (Adressen finden Sie in /etc/resolv.conf.)
  • Überprüfen Sie, ob die Firewall blockiert ist. (Überprüfen Sie / var / log / syslog, während ich Blöcke protokolliere.)

Wenn das Internet funktioniert, die Site jedoch nicht funktioniert, w3m http://isup.me/example.comersetzen Sie sie example.comdurch die Site, die nicht funktioniert. Verwenden Sie wget, lynx oder einen beliebigen verfügbaren Befehlszeilenbrowser, wenn der w3m-Browser nicht installiert ist.


Danke für Ihren Vorschlag! Deckt mein Skript die grundlegende Anforderung ab, mich zu überprüfen und zu benachrichtigen, wenn meine Website inaktiv ist? Und es wird ruhig sein, falls es ein Problem mit der Internetverbindung gibt
Ashfame

Es sieht so aus, als würde Ihr Skript tun, was Sie wollen. Sie können den Befehl wget in die if-Anweisung als einfügen if ! wget --spider http:///example.com; then.
BillThor

du meinst wget immer 1 für 200 HTTP-Antwortcode zurück?
Ashfame

Ich meine, der Test [ $? != 0 ]ist der gleiche wie der Test ! command. Es ist dokumentiert, dass wget bei Erfolg 0 und nicht 0 für Fehler zurückgibt. Das if verhält sich auf jede Art und Weise, wie Sie es codieren, identisch. Wenn wget bei einer Antwort von 200 einen Fehler zurückgibt, schlägt der Test in beiden Fällen fehl. Dasselbe gilt, wenn für einen anderen
Antwortcode

Vielen Dank! Das würde das Skript kleiner und verständlicher machen.
Ashfame

4

Dies ist das Shell-Skript, mit dem ich die Internetverbindung teste:

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

Du musst curl und mpg321 installieren

sudo apt-get install curl mpg321

Sie benötigen eine MP3-Audiodatei, die im selben Ordner in alarm.mp3 umbenannt wurde, wenn Sie akustische Alarmfunktionen wünschen. Schließlich konfigurieren Sie die URL der Website und passen egrep an Ihre Bedürfnisse an.


Dies funktioniert auch dann einwandfrei, wenn der Benutzer sich hinter einem unverlierbaren Portal befindet und sich nicht angemeldet hat.
Ashhar Hasan

Sie können verwenden egrep -qstattegrep ... > /dev/null
wjandrea

Warum ruft das Skript sich selbst auf, anstatt nur eine whileSchleife zu verwenden?
wjandrea

Oh warte, es nennt sich nicht. Es ruft ein Skript auf, das alarm.shim wd aufgerufen wird. Wenn Sie dieses Skript also aus einem anderen Verzeichnis aufrufen, tritt entweder ein Fehler auf, oder wenn alarm.shim wd ein Skript aufgerufen wird, wird dies stattdessen aufgerufen. Das ist also schlechte Praxis. Sie könnten "$0"stattdessen verwenden, aber eine whileSchleife wäre besser.
wjandrea

"Warum ruft das Skript sich selbst auf, anstatt nur eine while-Schleife zu verwenden?": Weil ich ein Noobs war, als ich diesen Beitrag verfasst habe, und ja, das Skript hat sich selbst aufgerufen.
01BTC10

2

Überprüfen Sie, ob das Internet funktioniert

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

Aus der Ausgabe (Auszug):

1 #System is connected to internet

Wie von anderen erwähnt, sagt dies jedoch nichts darüber aus, ob Sie wirklich eine Verbindung haben oder nicht. Z.B. Sie könnten mit dem Router verbunden sein und der Router muss nicht unbedingt mit dem Internet verbunden sein.


2
nm-toolwurde in Ubuntu 15.04+ entfernt, kann aber nmclistattdessen verwendet werden. ZB[[ $(nmcli -f STATE -t g) = connected ]]
Sechs

@Six nmcli -f STATE -t nmdas Gute ist, unabhängig von Websites zu sein!
Aquarius Power

1
Beachten Sie, dass nm-toolund nmcliIhnen sagen nur , ob oder nicht Sie verbunden sind lokale Netzwerke, das heißt , ob Sie mit Ihrem Heim WiFi verbunden sind / Ethernet. Es sagt Ihnen nicht, ob Sie etwas außerhalb Ihres lokalen Netzwerks erreichen können, z. B. das Internet.
Sergiy Kolodyazhnyy

1

Ich benutze diese Methode:

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

Es wird versucht, eine Verbindung zu einer bekannten Website herzustellen. Wenn eine Verbindung hergestellt werden kann, wird davon ausgegangen, dass das Internet vorhanden ist.


0

Ich brauchte Hilfe bei der gleichen Frage und bekam meine Antwort auf diese Weise:

echo $(nm-online) $? connection problems

wie funktioniert das?
wjandrea

Es wird nur der Status (ein Zeichen) des nm-onlineBefehls überprüft ... Es wird 0 zurückgegeben, wenn alles in Ordnung ist. Üblich in allen UNIXSchalen.
Antonio

0

Es ist nicht so einfach zu überprüfen, ob das Internet funktioniert. Ping ist ICMP, daher funktioniert es möglicherweise auch, wenn der Webproxy nicht verfügbar ist. Ähnliches tritt bei DNS auf, wenn Sie mit einer IP testen.

Da meine Internetverbindung instabil ist, habe ich dieses Skript ( basierend auf diesem Skript ) erstellt, das einen sanften Akkordton ausgibt, um mich anzurufen, und Ubuntu-Benachrichtigung verwendet, wenn die Internetverbindung wieder hergestellt wird:

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

Ich suchte nach einem Skript, das meine Internetverbindung kontinuierlich testet und das gestartet wird, sobald mein Server hochgefahren ist.

  1. Installieren Sie zuerst fping

    apt-get install fping
    
  2. Erstelle ein Init-Skript im Ordner /etc/init.d mit folgendem Inhalt (ich habe es testcon genannt)

    #!/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. Erstelle ein Skript im Ordner /etc/init.d mit folgendem Inhalt (ich habe es testcond genannt)

    #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. Dann führe ich die folgenden Befehle aus, um sie dem Start hinzuzufügen:

    sudo update-rc.d testcon defaults
    sudo update-rc.d testcon enable
    
  5. Starten Sie neu


0

Ich war mit zufälligen Ausfällen von WLAN-Verbindungen durch meinen Broadcom BCM94331CDChip konfrontiert . Ich habe das folgende Bash-Skript (Endlosschleife) entwickelt, das jede Sekunde überprüft, ob die Internet-Wi-Fi-Verbindung funktioniert. Andere hier vorgeschlagene Befehlszeilen warten mindestens 5 bis 10 Sekunden, bevor sie mit einem Status geschlossen werden, d ping. H. In der Zwischenzeit suche ich auch nach einer endgültigen Lösung.

Aus den Ergebnissen von askubuntu muss ich das bcmwl-kernel-sourcePaket löschen, während ich firmware-b43-installerund verwende b43-fwcutter.

Vielen Dank an alle für ihre Vorschläge (oben).

Dieses Skript muss in den Startprogrammen hinzugefügt werden und benötigt keine super userBerechtigung, um ausgeführt zu werden.

#!/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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.