Wie kann eine Internetverbindung getestet werden, ohne eine Website anzupingen? Ich meine, was ist, wenn eine Verbindung besteht, die Site jedoch nicht verfügbar ist? Gibt es einen Scheck für eine Verbindung mit der Welt?
Wie kann eine Internetverbindung getestet werden, ohne eine Website anzupingen? Ich meine, was ist, wenn eine Verbindung besteht, die Site jedoch nicht verfügbar ist? Gibt es einen Scheck für eine Verbindung mit der Welt?
Antworten:
Ohne Ping
#!/bin/bash
wget -q --spider http://google.com
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
-q : Stummschaltungsmodus
--spider : nicht bekommen, nur Seitenverfügbarkeit prüfen
$? : Shell-Rückkehrcode
0 : Shell-Code "Alles in Ordnung"
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
nc
, um sicherzustellen, dass die Zeitüberschreitung abläuft . so etwas wienc google.com 80 -w 10
Pingen Sie Ihr Standard-Gateway an:
#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
function ping_gw() { ... && return 0 || return 1 }
und dann wie ping_gw || (echo "no network, bye" && exit 1)
ifconfig down wlan0
und habe immer noch ein Standard-Gateway und es ist pingbar, obwohl ich die Außenwelt tatsächlich nicht erreichen kann.
Super Vielen Dank an den Benutzer somedrew für seinen Beitrag hier: https://bbs.archlinux.org/viewtopic.php?id=55485 am 2008-09-20 02:09:48
Ein Blick in / sys / class / net sollte eine Möglichkeit sein
Hier ist mein Skript zum Testen auf eine andere Netzwerkverbindung als die Rückschleife. Ich verwende das Folgende in einem anderen Skript, das ich habe, um regelmäßig zu testen, ob meine Website zugänglich ist. Wenn es NICHT zugänglich ist, weist mich ein Popup-Fenster auf ein Problem hin.
Das folgende Skript verhindert, dass ich alle fünf Minuten Popup-Nachrichten erhalte, wenn mein Laptop nicht mit dem Netzwerk verbunden ist.
#!/usr/bin/bash
# Test for network conection
for interface in $(ls /sys/class/net/ | grep -v lo);
do
if [[ $(cat /sys/class/net/$interface/carrier) = 1 ]]; then OnLine=1; fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr; exit; fi
Hinweis für Neueinsteiger: Die letzte 'if'-Anweisung testet, ob NICHT [!] Online ist, und wird beendet, wenn dies der Fall ist. Weitere Informationen finden Sie unter man bash und suchen Sie nach "Ausdrücke können kombiniert werden".
PS Ich bin der Meinung, dass Ping hier nicht das Beste ist, da es darauf abzielt, eine Verbindung zu einem bestimmten Host zu testen. NICHT zu testen, ob eine Verbindung zu einem Netzwerk jeglicher Art besteht.
PPS The Above funktioniert unter Ubuntu 12.04. Das / sys ist in einigen anderen Distributionen möglicherweise nicht vorhanden. Siehe unten:
Moderne Linux-Distributionen enthalten ein / sys-Verzeichnis als virtuelles Dateisystem (sysfs, vergleichbar mit / proc, einem procfs), in dem die mit dem System verbundenen Geräte gespeichert und geändert werden können, während viele herkömmliche UNIX- und Unix-ähnliche Betriebssysteme verwendet werden / sys als symbolische Verknüpfung zum Kernel-Quellbaum. [Zitieren erforderlich]
Aus Wikipedia https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
cat /sys/class/net/wwan0/carrier
nicht auf Ubuntu 14.04 LTS.
2>/dev/null
nach cat /sys/class/net/$interface/carrier
nicht Fehlerausgang haben , falls Vernetzung deaktiviert ist.
Dies funktioniert sowohl unter MacOSX als auch unter Linux:
#!/bin/bash
ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
ping: invalid option -- w
)
fping google.com
oder macht einfach fping 8.8.8.8
die Magie mit einem Bonus Sie erhalten Statuscode, ohne ihn testen zu müssen (" google.com is alive
") ...
In Bash wird der Netzwerk-Wrapper über / dev / { udp , tcp } / host / port verwendet :
if : >/dev/tcp/8.8.8.8/53; then
echo 'Internet available.'
else
echo 'Offline.'
fi
( :
ist das Bash-No-Op, weil Sie nur die Verbindung testen, aber nicht verarbeiten möchten.)
Ich habe zuvor Skripte geschrieben, die einfach Telnet verwenden, um eine Verbindung zu Port 80 herzustellen, und dann den Text übertragen:
HTTP/1.0 GET /index.html
gefolgt von zwei CR / LF-Sequenzen.
Vorausgesetzt, Sie erhalten eine HTTP-Antwort zurück, können Sie im Allgemeinen davon ausgehen, dass die Site funktioniert.
Bei der Top-Antwort fehlt die Tatsache, dass Sie eine perfekt stabile Verbindung zu Ihrem Standard-Gateway haben können. Dies bedeutet jedoch nicht automatisch, dass Sie tatsächlich etwas im Internet erreichen können. Das OP fragt, wie er / sie eine Verbindung mit der Welt testen kann. Daher schlage ich vor, die Top-Antwort zu ändern, indem Sie die Gateway-IP in eine bekannte IP (xyzw) ändern, die sich außerhalb Ihres LAN befindet.
Die Antwort würde also lauten:
ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error
Entfernen Sie auch die ungünstigen Backticks für die Befehlsersetzung [1] .
Wenn Sie nur sicherstellen möchten, dass Sie mit der Welt verbunden sind, bevor Sie Code ausführen, können Sie auch Folgendes verwenden:
if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
# more code
fi
Stellen Sie sicher, dass in Ihrem Netzwerk TCP-Datenverkehr ein- und ausgeht. Anschließend können Sie mit dem folgenden Befehl Ihre öffentlich zugängliche IP-Adresse wiederherstellen
curl ifconfig.co
Führen Sie den folgenden Befehl aus, um zu überprüfen, ob eine Website aktiv ist und welche Statusmeldung der Webserver anzeigt:
$ curl -Is http://www.google.com |
head -1 HTTP/1.1 200 OK
Der Statuscode '200 OK' bedeutet, dass die Anfrage erfolgreich war und eine Website erreichbar ist.
curl -Is http://www.google.com | head -1 | grep 200; if [[ $? -eq 0 ]]; then; echo "Online"; else; echo "Offline"; fi;
Wenn Ihr lokaler Nameserver nicht verfügbar ist,
ping 4.2.2.1
ist eine leicht zu merkende Always-Up-IP (eigentlich sogar ein Nameserver).
Die Antwort mit der höchsten Bewertung funktioniert nicht für MacOS. Für Benutzer eines Mac habe ich dies erfolgreich getestet:
GATEWAY=`route -n get default | grep gateway`
if [ -z "$GATEWAY" ]
then
echo error
else
ping -q -t 1 -c 1 `echo $GATEWAY | cut -d ':' -f 2` > /dev/null && echo ok || echo error
fi
getestet unter MacOS High Sierra 10.12.6
route
Befehl so route -n get default 2> /dev/null | grep gateway
, dass im Offline-Modus kein Fehler in stderr geschrieben wird.
Dieses Bash-Skript sucht kontinuierlich nach dem Internet und gibt einen Piepton aus, wenn das Internet verfügbar ist.
#!/bin/bash
play -n synth 0.3 sine 800 vol 0.75
while :
do
pingtime=$(ping -w 1 8.8.8.8 | grep ttl)
if [ "$pingtime" = "" ]
then
pingtimetwo=$(ping -w 1 www.google.com | grep ttl)
if [ "$pingtimetwo" = "" ]
then
clear ; echo 'Offline'
else
clear ; echo 'Online' ; play -n synth 0.3 sine 800 vol 0.75
fi
else
clear ; echo 'Online' ; play -n synth 0.3 sine 800 vol 0.75
fi
sleep 1
done
kürzester Weg: fping 4.2.2.1
=> "4.2.2.1 lebt"
Ich bevorzuge dies, da es schneller und weniger ausführlich ausgegeben wird als der ping
Nachteil, dass Sie es installieren müssen.
Sie können eine beliebige öffentliche DNS anstelle einer bestimmten Website verwenden.
fping -q google.com && echo "do something because you're connected!"
-q
Gibt einen Exit-Code zurück, daher zeige ich nur ein Beispiel für die Ausführung von etwas, das Sie online sind.
auf dem Mac installieren : brew install fping
; auf Ubuntu:sudo apt-get install fping
Ähnlich wie bei der Antwort von @ Jesse ist diese Option möglicherweise viel schneller als jede Lösung ping
und möglicherweise etwas effizienter als die Antwort von @ Jesse .
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'
Dieser Befehl verwendet find
mit -exec
Befehl für alle Dateien ausgeführt werden nicht genannt *lo*
in /sys/class/net/
. Dies sollten Links zu Verzeichnissen sein, die Informationen zu den verfügbaren Netzwerkschnittstellen auf Ihrem Computer enthalten.
Der ausgeführte Befehl ist ein sh
Befehl, der den Inhalt der Datei carrier
in diesen Verzeichnissen überprüft . Der Wert von $interface/carrier
hat 3 Bedeutungen - Zitat :
Es scheint drei Staaten zu geben:
- ./carrier nicht lesbar (z. B. wenn die Schnittstelle in Network Manager deaktiviert ist).
- ./Träger enthalten "1" (wenn die Schnittstelle aktiviert und mit einem WiFi-Netzwerk verbunden ist)
- ./Träger enthalten "0" (wenn die Schnittstelle aktiviert ist und keine Verbindung zu einem WiFi-Netzwerk besteht)
Die erste Option wird in der Antwort von @ Jesse nicht berücksichtigt . Der sh
gestreifte Befehl lautet:
# Note: $0 == $interface
cat "$0"/carrier 2>&1
cat
wird verwendet, um den Inhalt der carrier
gesamten Ausgabe zu überprüfen und sie auf die Standardausgabe umzuleiten, auch wenn dies fehlschlägt, da die Datei nicht lesbar ist. Wenn grep -q
Funde "1"
unter diesen Dateien bedeutet dies , gibt es mindestens 1 - Schnittstelle verbunden. Der Exit-Code von grep -q
ist der endgültige Exit-Code.
Wenn Sie beispielsweise den Exit-Status dieses Befehls verwenden, können Sie damit nur dann einen Gnubiff in Ihrem Befehl starten, ~/.xprofile
wenn Sie über eine Internetverbindung verfügen.
online() {
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1 > /dev/null | grep -q "1" && exit 0' {} \;
}
online && gnubiff --systemtray --noconfigure &
Wenn Sie tatsächlich nach einem Internetzugang suchen möchten, sind viele der vorhandenen Antworten auf diese Frage fehlerhaft. Einige Dinge, die Sie beachten sollten:
Vor diesem Hintergrund glaube ich, dass die beste Strategie darin besteht, mehrere Sites über eine HTTPS-Verbindung zu kontaktieren und true zurückzugeben, wenn eine dieser Sites antwortet.
Beispielsweise:
connected_to_internet() {
test_urls="\
https://www.google.com/ \
https://www.microsoft.com/ \
https://www.cloudflare.com/ \
"
processes="0"
pids=""
for test_url in $test_urls; do
curl --silent --head "$test_url" > /dev/null &
pids="$pids $!"
processes=$(($processes + 1))
done
while [ $processes -gt 0 ]; do
for pid in $pids; do
if ! ps | grep "^[[:blank:]]*$pid[[:blank:]]" > /dev/null; then
# Process no longer running
processes=$(($processes - 1))
pids=$(echo "$pids" | sed --regexp-extended "s/(^| )$pid($| )/ /g")
if wait $pid; then
# Success! We have a connection to at least one public site, so the
# internet is up. Ignore other exit statuses.
kill -TERM $pids > /dev/null 2>&1 || true
wait $pids
return 0
fi
fi
done
# wait -n $pids # Better than sleep, but not supported on all systems
sleep 0.1
done
return 1
}
Verwendung:
if connected_to_internet; then
echo "Connected to internet"
else
echo "No internet connection"
fi
Einige Anmerkungen zu diesem Ansatz:
if wait $pid;
. Keine Ahnung, warum das auf Ihrem System nicht funktioniert. Bist du sicher, dass du Bash verwendest?
wait
und verstehe jetzt, dass der Rückkehrcode tatsächlich getestet wird. Ich habe Ihren Code erneut kopiert und heute funktioniert es - whoops! Ich muss beim letzten Mal etwas durcheinander gebracht haben, obwohl ich nicht verstehen kann, was oder wie. Trotzdem mea culpa. Entschuldigung.
Dies ist deutlich schneller als jede hier veröffentlichte Lösung und kann auch zum Testen eines bestimmten Hosts verwendet werden.
Der Trick besteht darin, die IP mit einem weniger ausgelasteten DNS-Solver zu lösen als dem von ping
:
validateConnection () {
host="${1}"
ip=$(getent ahostsv4 "${host}" | awk '{ print $1 }' | head -n1)
ping -c1 "${ip}" 2>&1 >"/dev/null"
if [ "${?}" -ne 0 ]; then
echo "No connection to: ${host}" >&2
exit 1
fi
}