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.
Das heißt, wenn ich ping -q -w1 -c1 8.8.8.8
verwende, um zu überprüfen, ob das Internet auf/ab ist, wird es ohne Ausgabe da sein und wird nicht beendet, genau wie ich eine einzelne cat
verwende.
Kannst du meine Frage verstehen? Ich weiß nicht, warum es so ist, aber ich denke, das Problem hängt mit dem school-internet-service zusammen. Irgendein Vorschlag? (Ich denke, wget
kann eine gute Alternative sein, aber wie soll ich damit umgehen?)
Wget verwenden:
#!/bin/bash
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
echo "Online"
else
echo "Offline"
fi
Wenn die Schule ihren Router tatsächlich abschaltet, anstatt den gesamten Datenverkehr auf eine Seite "Warum sind Sie nicht im Bett" umzuleiten, müssen Sie nicht die gesamte Webseite herunterladen oder HTTP-Header senden. Sie müssen lediglich eine Verbindung herstellen und prüfen, ob jemand zuhört.
nc -z 8.8.8.8 53
Dies gibt "Verbindung zu 8.8.8.8 Port 53 [TCP/Domäne] war erfolgreich!" und den Wert 0 zurückgeben, wenn jemand zuhört.
Wenn Sie es in einem Shell-Skript verwenden wollen:
nc -z 8.8.8.8 53 >/dev/null 2>&1
online=$?
if [ $online -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
#!/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 erzeugt Folgendes:
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 die Dauer des vorherigen Zustands an, d. h. 19 nach oben, 7 Sekunden nach unten
Verwenden Sie die Timeout-Option -t
:
ping -q -t 5 -w1 -c1 8.8.8.8 t
Installieren Sie fping:> weniger problem als ping.
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
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 ;)
Mit dem obigen Beispiel habe ich dieses Skript geschrieben, um den Status 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
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
Schreiben Sie dies in ein separates Skript. Es behandelt verschiedene Netzwerksituationen als (1) nicht mit einem Netzwerk verbunden, (2) mit dem Netzwerk verbunden, kann aber nicht auf das Internet (oder zumindest Google) und (3) mit dem Internet zugreifen.
Sie können später den exit code
des Skripts verwenden, um die Konnektivität zu überprüfen, z.
~$ script-name && echo online || echo offline