Jak można przetestować połączenie internetowe bez pingowania jakiejś strony internetowej? Mam na myśli, co jeśli jest połączenie, ale strona nie działa? Czy istnieje sprawdzenie połączenia ze światem?
Jak można przetestować połączenie internetowe bez pingowania jakiejś strony internetowej? Mam na myśli, co jeśli jest połączenie, ale strona nie działa? Czy istnieje sprawdzenie połączenia ze światem?
Odpowiedzi:
Bez pingów
#!/bin/bash
wget -q --spider http://google.com
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
-q : tryb ciszy
--spider : nie odbieraj, po prostu sprawdź dostępność strony
$? : kod powrotu powłoki
0 : kod powłoki „Wszystko OK”
Bez 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
aby upewnić się, że upłynie limit czasu . coś w stylunc google.com 80 -w 10
Pinguj domyślną bramę:
#!/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 }
a następnie użyć w następujący sposób:ping_gw || (echo "no network, bye" && exit 1)
ifconfig down wlan0
i nadal mam domyślną bramę i można ją pingować, mimo że w rzeczywistości nie mogę dotrzeć do świata zewnętrznego.
Super Podziękowania dla użytkownika somedrew za ich post tutaj: https://bbs.archlinux.org/viewtopic.php?id=55485 dnia 2008-09-20 02:09:48
Szukanie w / sys / class / net powinno być jednokierunkowe
Oto mój skrypt do testowania połączenia sieciowego innego niż pętla zwrotna. Używam poniższego w innym skrypcie, który mam do okresowego testowania, czy moja witryna jest dostępna. Jeśli NIE jest dostępne, wyskakujące okienko ostrzega mnie o problemie.
Poniższy skrypt uniemożliwia mi otrzymywanie wyskakujących wiadomości co pięć minut, gdy mój laptop nie jest podłączony do sieci.
#!/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
Uwaga dla nowych użytkowników basha: ostatnia instrukcja „if” sprawdza, czy NIE [!] Jest w trybie online i kończy działanie, jeśli tak jest. Aby uzyskać więcej informacji, zobacz man bash i wyszukaj wyrażenie „Wyrażenia można łączyć”.
PS Wydaje mi się, że ping nie jest tutaj najlepszym rozwiązaniem, ponieważ ma na celu przetestowanie połączenia z określonym hostem, a NIE sprawdzenie, czy istnieje połączenie z jakąkolwiek siecią .
PPS Powyższe działa na Ubuntu 12.04. / Sys może nie istnieć w niektórych innych dystrybucjach. Zobacz poniżej:
Nowoczesne dystrybucje Linuksa zawierają katalog / sys jako wirtualny system plików (sysfs, porównywalny z / proc, który jest procfs), który przechowuje i umożliwia modyfikację urządzeń podłączonych do systemu, podczas gdy wiele tradycyjnych systemów operacyjnych UNIX i Unix / sys jako symboliczne łącze do drzewa źródeł jądra. [potrzebne źródło]
Z Wikipedii https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
cat /sys/class/net/wwan0/carrier
Nie działa na ubuntu 14.04 LTS.
2>/dev/null
po, cat /sys/class/net/$interface/carrier
aby nie wyświetlać błędów w przypadku wyłączenia sieci.
Działa to zarówno w systemie MacOSX, jak i Linux:
#!/bin/bash
ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
ping: invalid option -- w
)
fping google.com
lub po prostu fping 8.8.8.8
robi magię z bonusem, otrzymujesz kod statusu bez potrzeby testowania (" google.com is alive
") ...
W Bash, używając jego opakowania sieciowego przez / dev / { udp , tcp } / host / port :
if : >/dev/tcp/8.8.8.8/53; then
echo 'Internet available.'
else
echo 'Offline.'
fi
( :
to Bash no-op, ponieważ chcesz tylko przetestować połączenie, ale nie przetwarzać).
Napisałem wcześniej skrypty, które po prostu używają telnetu do łączenia się z portem 80, a następnie przesyłają tekst:
HTTP/1.0 GET /index.html
a następnie dwie sekwencje CR / LF.
Pod warunkiem, że otrzymasz odpowiedź HTTP, możesz ogólnie założyć, że witryna działa.
Najlepsza odpowiedź pomija fakt, że możesz mieć idealnie stabilne połączenie z domyślną bramą, ale nie oznacza to automatycznie, że możesz rzeczywiście dotrzeć do czegoś w Internecie. OP pyta, jak może przetestować połączenie ze światem. Dlatego proponuję zmienić pierwszą odpowiedź, zmieniając adres IP bramy na znany adres IP (xyzw), który znajduje się poza siecią LAN.
Tak więc odpowiedź brzmiałaby:
ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error
Usunięcie również niekorzystnych znaków odwrotnych do podstawiania poleceń [1] .
Jeśli chcesz tylko upewnić się, że jesteś połączony ze światem przed wykonaniem kodu, możesz również użyć:
if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
# more code
fi
upewnij się, że Twoja sieć zezwala na ruch TCP przychodzący i wychodzący, możesz odzyskać publiczny adres IP za pomocą następującego polecenia
curl ifconfig.co
Wykonaj następujące polecenie, aby sprawdzić, czy witryna internetowa działa i jaki komunikat o stanie wyświetla serwer sieciowy:
$ curl -Is http://www.google.com |
head -1 HTTP/1.1 200 OK
Kod stanu „200 OK” oznacza, że żądanie powiodło się i witryna internetowa jest osiągalna.
curl -Is http://www.google.com | head -1 | grep 200; if [[ $? -eq 0 ]]; then; echo "Online"; else; echo "Offline"; fi;
Jeśli twój lokalny serwer nazw jest wyłączony,
ping 4.2.2.1
to łatwy do zapamiętania adres IP, który jest zawsze aktywny (w rzeczywistości jest to nawet serwer nazw).
Top głosowało odpowiedź nie działa dla MacOS więc dla tych na mac, ja z powodzeniem przetestowane w ten sposób:
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
testowano na MacOS High Sierra 10.12.6
route
polecenie na, route -n get default 2> /dev/null | grep gateway
aby uniknąć zapisywania błędu w stderr w trybie offline.
Ten skrypt bash stale sprawdza dostęp do Internetu i wydaje dźwięk, gdy Internet jest dostępny.
#!/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
najkrótsza droga: fping 4.2.2.1
=> „4.2.2.1 żyje”
Wolę to, ponieważ jest to szybsze i mniej szczegółowe wyjście niż ping
, wadą jest to, że będziesz musiał go zainstalować.
możesz użyć dowolnego publicznego DNS zamiast określonej witryny internetowej.
fping -q google.com && echo "do something because you're connected!"
-q
zwraca kod zakończenia, więc pokazuję tylko przykład uruchomienia czegoś, co jest online.
do zainstalowania na komputerze Mac: brew install fping
; na ubuntu:sudo apt-get install fping
Podobnie jak odpowiedź @ Jesse , ta opcja może być znacznie szybsza niż jakiekolwiek rozwiązanie używające ping
i być może nieco bardziej wydajna niż odpowiedź @ Jesse .
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'
To polecenie używa find
with -exec
do uruchamiania polecenia na wszystkich plikach, które nie są wymienione *lo*
w /sys/class/net/
. Powinny to być łącza do katalogów zawierających informacje o dostępnych interfejsach sieciowych na komputerze.
Uruchomione polecenie jest sh
poleceniem, które sprawdza zawartość pliku carrier
w tych katalogach. Wartość $interface/carrier
ma 3 znaczenia - Cytując :
Wygląda na to, że istnieją trzy stany:
- ./carrier nieczytelne (na przykład, gdy interfejs jest wyłączony w Menedżerze sieci).
- ./carrier zawiera "1" (gdy interfejs jest aktywny i jest podłączony do sieci WiFi)
- ./carrier zawierają „0” (gdy interfejs jest aktywny i nie jest połączony z siecią WiFi)
Pierwsza opcja nie została uwzględniona w odpowiedzi @ Jesse . sh
Komenda jest rozłożony na zewnątrz:
# Note: $0 == $interface
cat "$0"/carrier 2>&1
cat
jest używany do sprawdzania zawartości carrier
i przekierowywania wszystkich danych wyjściowych na standardowe wyjście, nawet jeśli nie powiedzie się, ponieważ plik nie jest czytelny. Jeśli grep -q
znajdzie "1"
wśród tych plików, oznacza to, że jest podłączony co najmniej 1 interfejs. Kod wyjścia grep -q
będzie ostatecznym kodem wyjścia.
Na przykład, używając statusu wyjścia tego polecenia, możesz go użyć do uruchomienia gnubiff w swoim ~/.xprofile
tylko wtedy, gdy masz połączenie z Internetem.
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 &
Jeśli Twoim celem jest sprawdzenie dostępu do Internetu , wiele z istniejących odpowiedzi na to pytanie jest błędnych. Kilka rzeczy, o których powinieneś wiedzieć:
Mając to na uwadze, uważam, że najlepszą strategią jest skontaktowanie się z kilkoma witrynami za pośrednictwem połączenia HTTPS i zwrócenie wartości true, jeśli którakolwiek z tych witryn odpowie.
Na przykład:
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
}
Stosowanie:
if connected_to_internet; then
echo "Connected to internet"
else
echo "No internet connection"
fi
Kilka uwag na temat tego podejścia:
if wait $pid;
. Nie mam pojęcia, dlaczego to nie działa w twoim systemie. Czy na pewno używasz basha?
wait
i rozumiem, że kod powrotu jest rzeczywiście testowany. Ponownie skopiowałem Twój kod i dziś działa - ups! Musiałem coś schrzanić ostatnim razem, chociaż nie rozumiem, co i jak. Niemniej jednak mea culpa. Przeprosiny.
Jest to znacznie szybsze niż jakiekolwiek zamieszczone tutaj rozwiązanie i może być również używane do testowania określonego hosta .
Sztuczka polega na rozwiązaniu adresu IP przy użyciu mniej obciążonego solwera DNS niż ten używany przez 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
}