2013-06-25 8 views
15

In meiner Schule ist das Internet nicht verfügbar (jede Nacht nach 23: 0 wird die Schule das Internet töten, um uns ins Bett zu legen> .. <), dann wird der Ping nie aufhören, obwohl ich den Parameter ping -w1 ... verwendet habe .Wie überprüfe ich den Internetzugriff mit Bash-Skript in Linux?

Das ist, wenn ich verwende: ping -q -w1 -c1 8.8.8.8, um zu überprüfen, ob das Internet auf/ab ist, wird es dort ohne irgendeine Ausgabe sein und geht nicht, gerade wie ich eine einzelne cat benutze.

Können Sie meine Frage verstehen ??? Ich weiß nicht, warum es so ist, aber ich denke, das Problem ist mit der Schule-Internet-Service verbunden. Irgendein Vorschlag? (Ich denke, wget eine gute Alternative sein kann, aber wie zu nutzen?)

+0

dies kann http://stackoverflow.com/questions/929368/how-to-test-a-internet-connection-in-bash?rq=1 –

Antwort

33

mit wget:

#!/bin/bash 

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

Es funktioniert gut. Vielen Dank! Meine alte Version hat keine "--tries", also funktioniert es nicht. – wenlibin02

+9

Persönlich verbessere ich dieses Muster, indem ich dieses "wget ​​-q -tries = 10 --timeout = 20 -O - http://google.com>/dev/null" mache. Das wirft die Ausgabe weg, was bedeutet, dass Dateien nicht herumliegen, und es gibt keine Probleme mit Schreibberechtigungen. –

+4

Sie sollten wirklich die Option '--spider' verwenden, da diese eine http' HEAD' Anfrage im Gegensatz zu einer HTTP 'GET' Anfrage sendet. Jetzt überprüfen Sie in diesem Fall gegen google.com, die eine ziemlich leichte Seite ist, so dass es in Ordnung sein kann, wie es ist. Aber als allgemeine Regel sollten Sie eine HEAD-Anfrage verwenden, wenn Sie nur prüfen möchten, ob etwas verfügbar ist, ohne es tatsächlich * herunterzuladen *. Ich habe die Antwort entsprechend hinzugefügt. – peterh

2

die Option Timeout verwenden -t:

ping -q -t 5 -w1 -c1 8.8.8.8 t 
+0

ein Problem bei dieser Lösung ist, dass einige helfen Netzwerke blockieren möglicherweise ausgehende Pings (meine Uni hatte dafür einen berühmten Rekord). Es scheint jedoch nicht der Fall mit dem OP zu sein. –

+0

@umlaeute, in diesem Fall können Sie 'wget http: // google.com' oder sogar (besser & einfacher)' curl' verwenden –

2

fping installieren:> weniger Problem dann Klingeln.

fping google.com | grep alive 

zum Beispiel verwenden wie:

#!/bin/bash 

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

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

das Beispiel unter Verwendung der oben ich dieses Skript schrieb den Zustand Ihrer Verbindung zu protokollieren: https://gist.github.com/cganterh/ffc2fffa8263857cbece

Speichern Sie den folgenden Code in einer name.sh Datei .

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

Ohne 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 

Genießen;)

+0

Ja, es hat funktioniert! Vielen Dank. – wenlibin02

13

Wenn die Schule ihre Router tatsächlich schaltet sich aus, anstatt den gesamten Datenverkehr zu einem "warum bist du nicht im Bett" Umleiten Seite Dann müssen Sie keine gesamte Webseite herunterladen oder HTTP-Header senden. Alles, was Sie tun müssen, ist nur eine Verbindung herzustellen und zu überprüfen, ob jemand zuhört.

nc -z 8.8.8.8 53 

Dies wird Ausgang "Anschluss an 8.8.8.8 Port 53 [TCP/domain] gelungen!" und einen Wert von 0 zurückgeben, wenn jemand zuhört.

Wenn Sie es in einem Shell-Skript verwenden möchten:

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

Dies ist der schnellste Ansatz, es pingt den DNS-Server, anstatt Google Website-Daten zu erhalten. Daumen hoch. – Yoni

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

die Ausgabe smth produzieren wie:

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 

die Zahl am Ende einer Zeile zeigt Dauer früherer Zustand, d19 bis 7 Sekunden nach unten

+0

Willkommen bei Stack Overflow! Während dieser Code die Frage beantworten könnte, wäre es besser, etwas _context_ einzufügen, _how_ es funktioniert zu erklären und _when_, um es zu benutzen. Nur-Code-Antworten sind auf lange Sicht nicht nützlich. –

0

Reliable alt ping in einem separaten Bash-Skript:

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

Setzen Sie diese auf einem separaten Skript. Es behandelt verschiedene Netzwerk-Situationen als (1) nicht mit einem Netzwerk verbunden ist, (2) mit dem Netzwerk verbunden ist, aber nicht auf das Internet (oder zumindest Google) zugreifen kann, und (3) mit dem Internet verbunden.


Sie können später die exit code des Skripts verwenden Konnektivität zu überprüfen, zum Beispiel

~$ script-name && echo online || echo offline 
Verwandte Themen