Jak mogę sprawdzić łączność z Internetem w konsoli?

31

Czy istnieje prosty sposób na sprawdzenie połączenia internetowego z konsoli? Próbuję się bawić w skrypcie powłoki. Wydaje mi się, że jednym z pomysłów jest sprawdzenie kodu odpowiedzi HTTP, aby zinterpretować, czy połączenie internetowe działa poprawnie. Myślę jednak, że musi istnieć prosty sposób bez konieczności sprawdzania witryny, która nigdy się nie zawiesza;)wget --spider http://www.google.co.in/

Edycja: Wydaje się, że może być wiele czynników, które można indywidualnie zbadać, dobrze. W tej chwili zamierzam sprawdzić, czy mój blog nie działa. Mam konfigurację crona, aby sprawdzał to co minutę. W tym celu sprawdzam kod odpowiedzi HTTP wget --spider na moim blogu. Jeśli nie jest to 200, powiadamia mnie (uważam, że to będzie lepsze niż pingowanie, ponieważ strona może być obciążona i może upłynąć limit czasu lub odpowiedzieć bardzo późno). Wczoraj był problem z moim Internetem. Sieć LAN była podłączona dobrze, ale po prostu nie mogłem uzyskać dostępu do żadnej strony. Wciąż otrzymuję powiadomienia, ponieważ skrypt nie może znaleźć 200 w odpowiedzi wget. Teraz chcę się upewnić, że wyświetla mi powiadomienie, gdy mam połączenie z Internetem.

Dlatego sprawdzanie łączności z DNS i LAN jest dla mnie trochę przesadne, ponieważ nie mam tak konkretnej potrzeby, aby dowiedzieć się, na czym polega problem. Więc co sugerujesz, jak to robię?

Oto mój skrypt do sprawdzania przestojów mojego bloga:

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

W ten sposób muszę sprawdzić łączność z Internetem tylko tam, gdzie występuje problem z kodem odpowiedzi mojego bloga. Jest trochę ciężki (ponieważ nie używam pinga), ale nie powinien dawać żadnych fałszywych alarmów. Dobrze? Również w jaki sposób mogę za każdym razem losować pingowanie do innej witryny, np. Facebook, Google, Yahoo itp. Ponadto (starałem się unikać jakichkolwiek operacji we / wy) mogę zapisać plik dziennika, dzięki któremu mogę sprawdzić liczbę kontroli przestojów i następnie pomiń kolejne kontrole, dopóki witryna nie będzie działała lub spowoduj dłuższe kontrole (10 minut zamiast co minutę). Co myślisz?

Popiół
źródło
„Łączność z Internetem” nie ma jasnej definicji, można jedynie przetestować łączność z określoną usługą lub zestawem usług. Jeśli masz na myśli łączność „LAN”, dobrą opcją jest pingowanie bramy sieciowej.
João Pinto
Mówiąc najprościej, określiłbym, że łączność z Internetem polega na tym, czy masz dostęp do Internetu. Problem może być czymkolwiek pośrednim. Muszę tylko rozróżnić, czy działa dobrze, czy istnieje problem z zestawu problemów, które mogą być odpowiedzialne. Mam nadzieję, że wyraziłem się jasno. :)
Ashfame

Odpowiedzi:

29

Sprawdzanie, czy konkretna strona internetowa działa

Po pierwsze, dostępnych jest wiele dobrych usług monitorowania online. Aby wybrać jeden, Pingdom zawiera darmowe konto do monitorowania jednego celu. (Oświadczenie: W żaden sposób nie jestem powiązany z Pingdom).

Po drugie, wget --spiderdobrym pomysłem jest użycie własnego skryptu. Pojawią się fałszywe alarmy, gdy komputer będzie wyłączony lub gdy serwer DNS nie będzie działał. Sprawdzanie kodu powrotu jest prostym sposobem na wykonanie tego:

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

Po raz kolejny w tym podejściu występują niedociągnięcia. Jeśli Twój dostawca buforował Twój rekord DNS, ale serwer DNS nie działa, inni nie mogą uzyskać dostępu do Twojej witryny, mimo że monitorowanie mówi, że wszystko jest w porządku. Możesz hostna przykład napisać krótkie obejście tego problemu host example.com <your dns server IP>. To zwróci błąd, jeśli serwer DNS nie odpowiada, nawet jeśli OpenDNS lub serwer DNS twojego dostawcy działa dobrze.

Sprawdzanie, czy działa internet

W każdym przypadku nie jest to naprawdę łatwy sposób.

Możesz na przykład uruchamiać ping -c1w wielu dobrze znanych witrynach (na przykład www.google.com, facebook.com i ping.funet.fi) i sprawdzać kody powrotu, aby ustalić, czy można dotrzeć do dowolnego miejsca docelowego. Możesz automatycznie sprawdzić kod powrotu za pomocą zmiennej $?. Parametr -c1ogranicza liczbę pakietów ping do jednego.

Możesz napotkać problemy z niektórymi publicznymi wifis, gdy istnieje brama logowania, która przekierowuje wszystkie pingi i żądania HTTP. Jeśli tak, możesz otrzymać odpowiedzi ping i bezbłędne kody stanu HTTP, nawet jeśli nie możesz uzyskać dostępu do innych witryn.

Jeśli chcesz sprawdzić stan kabla, możesz użyć

sudo ethtool eth0

Z wyników (fragment):

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

Jednak nie mówi to, czy naprawdę masz łączność, czy nie, tylko to, czy kabel jest podłączony i coś jest na drugim końcu.

Olli
źródło
To całkowicie zależy od mojej konfiguracji, pracując na Always-ON Ethernet. Ale cieszę się, że wskazałeś, jak to nie działa poprawnie w niektórych przypadkach. Wierzę też, że pingowanie byłoby szybsze niż wget. Co myślisz? a jeśli sprawdzam gdziekolwiek kod statusu 200, wolę po prostu pingować. Dobrze? czy jest coś, co powinienem wiedzieć?
Ashfame
2
ping jest szybszy i lepszy, ponieważ drugi koniec nie będzie na ciebie zły. ping jest całkiem bezpieczny, ale nawet to nie gwarantuje, że możesz otwierać strony internetowe. Ponadto, jest to możliwe , że firewall blokuje ping ale pozwalając żądań HTTP.
Olli
1
Pingowanie dobrze znanego serwera dns, takiego jak 4.2.2.2, jest również przydatne w przypadku, gdy masz połączenie sieciowe, ale zepsuty dns.
djeikyb
Do sprawdzania DNS można oczywiście użyć host(zapytanie DNS). Jest również bardzo szybki.
Olli,
Dziękuję za odpowiedź @Olli & @djeikyb Zaktualizowałem pytanie, proszę spojrzeć
Ashfame
7

Używam tej metody ...

if [["$ (ping -c 1 8.8.8.8 | grep '100% utraty pakietu')"! = ""]]; następnie
    echo „Internet nie jest obecny”
    wyjście 1
jeszcze
    echo „Internet jest obecny”
    wget www.site.com
fi
bais bais
źródło
Mam różne wyniki dla ping -c 1 8.8.8.8i ping -c 1 www.google.com. W jaki sposób?
MERose
2
Pamiętaj, że to się nie powiedzie w Chinach i innych krajach, które blokują Google
Tom J Nowell
7

Właśnie użyłem

nm-online

który zatrzymuje się, aż menedżer sieci utworzy połączenie sieciowe. Działało dobrze. Możesz także robić inne rzeczy.

ntsecrets
źródło
6

Sprawdzanie, czy witryna jest uruchomiona, zwykle odbywa się za pomocą narzędzia do monitorowania, takiego jak nagios. Będzie to stale monitorować witrynę i może powiadamiać o awariach.

Podczas sprawdzania, czy Internet jest uruchomiony z linii poleceń, wykonuję kilka kroków:

  • Sprawdź, czy Internet jest włączony ping google.com (sprawdza DNS i znaną dostępną stronę).
  • Sprawdź, czy witryna jest w użyciu, wgetlub w3mpobierz stronę.

Jeśli Internet nie działa, zdiagnozuj go na zewnątrz.

  • Sprawdź, czy brama jest pingowana. (Sprawdź, czy adres bramy to ifconfig.)
  • Sprawdź, czy serwery DNS są pingowane. (Sprawdź adresy /etc/resolv.conf.)
  • Sprawdź, czy zapora sieciowa blokuje się. (Zaznacz / var / log / syslog, gdy loguję bloki.)

Jeśli Internet działa, ale witryna nie działa, w3m http://isup.me/example.comzastąp example.comją witryną, która pojawia się w dół. Użyj wget, lynx lub dowolnej przeglądarki wiersza poleceń, którą masz dostępną, jeśli nie masz zainstalowanej przeglądarki w3m.

BillThor
źródło
Dzięki za Twoją sugestię! Czy mój skrypt spełnia podstawowy wymóg sprawdzania i powiadamiania mnie o awarii mojej witryny? I będzie cicho na wypadek problemów z łącznością z Internetem
Ashfame
Wygląda na to, że Twój skrypt zrobi to, co chcesz. Możesz dołączyć polecenie wget do instrukcji if jako if ! wget --spider http:///example.com; then.
BillThor
masz na myśli, że wget zawsze zwraca 1 dla 200 kodu odpowiedzi HTTP?
Ashfame
Mam na myśli, że test [ $? != 0 ]jest taki sam jak test ! command. Wget jest udokumentowany, aby zwracał 0 w przypadku sukcesu, a nie 0 w przypadku niepowodzenia. If zachowuje się tak samo, niezależnie od tego, w jaki sposób go kodujesz. Jeśli wget zwróci błąd przy odpowiedzi 200, test zakończy się niepowodzeniem w obu przypadkach. To samo, jeśli zwraca 0 dla kodu odpowiedzi innego niż 200.
BillThor
Dzięki! Dzięki temu skrypt byłby mniejszy i łatwiejszy do zrozumienia.
Ashfame
4

Oto skrypt powłoki, którego używam do testowania łączności z Internetem:

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

Musisz zainstalować curl i mpg321

sudo apt-get install curl mpg321

Będziesz potrzebował pliku dźwiękowego .mp3 o zmienionej nazwie na alarm.mp3 w tym samym folderze, jeśli chcesz mieć funkcję alarmu dźwiękowego. Na koniec skonfiguruj adres URL strony i egrep do swoich potrzeb.

01BTC10
źródło
Działa to doskonale nawet wtedy, gdy użytkownik stoi za portalem i nie jest zalogowany.
Ashhar Hasan
Możesz użyć egrep -qzamiastegrep ... > /dev/null
wjandrea
Dlaczego skrypt wywołuje samą siebie zamiast używać whilepętli?
wjandrea
Och, czekaj, to się nie nazywa. Wywołuje skrypt wywoływany alarm.shw wd, więc jeśli wywołasz ten skrypt z innego katalogu, to albo wystąpi błąd, albo jeśli jest skrypt wywoływany alarm.shw wd, wywoła to zamiast tego. To zła praktyka. Możesz użyć "$0"zamiast tego, ale whilepętla byłaby lepsza.
wjandrea
„Dlaczego skrypt wywołuje sam siebie zamiast po prostu używać pętli while?”: Ponieważ byłem noobem, kiedy pisałem ten post i tak, skrypt sam się nazywał.
01BTC10
2

Sprawdzanie, czy działa internet

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

Z wyników (fragment):

1 #System is connected to internet

Jednak, jak wspominają inni, nie mówi to, czy naprawdę masz łączność, czy nie. Na przykład. Możesz być podłączony do routera, a router niekoniecznie musi być podłączony do Internetu.

Venkat Kotra
źródło
2
nm-toolzostał usunięty z Ubuntu 15.04+, ale możesz go użyć nmcli. Np.[[ $(nmcli -f STATE -t g) = connected ]]
Sześć
@Six nmcli -f STATE -t nmdobrą rzeczą jest niezależność od stron internetowych!
Aquarius Power
1
Zauważ, że nm-tooli nmclipowie ci tylko, czy jesteś podłączony do sieci lokalnej , tj. Czy masz połączenie z domowym Wi-Fi / Ethernet. Nie powie ci, czy możesz dotrzeć do czegokolwiek poza siecią lokalną, np. Do Internetu.
Sergiy Kolodyazhnyy
1

Korzystam z tej metody:

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

Spróbuje połączyć się ze znaną witryną, a jeśli będzie mógł się z nią połączyć, zakładamy, że jest internet.

Abraham Hernandez
źródło
0

Potrzebowałem pomocy z tym samym pytaniem i otrzymałem odpowiedź w ten sposób:

echo $(nm-online) $? connection problems
octius4u
źródło
jak to działa?
wjandrea
Sprawdza tylko status (jednego znaku) nm-onlinepolecenia ... Zwróci 0, jeśli wszystko będzie w porządku. Zwykle we wszystkich UNIXmuszlach.
Antonio
0

Sprawdzenie, czy Internet działa, nie jest takie proste. ping to ICMP, więc może działać, nawet jeśli serwer proxy sieci Web jest wyłączony. Coś podobnego dzieje się z DNS, jeśli testujesz z IP.

Ponieważ moje połączenie internetowe jest niestabilne, stworzyłem ten skrypt ( oparty na tym ), który wydaje delikatny akord, aby do mnie zadzwonić, a także używa powiadomienia Ubuntu o powrocie połączenia internetowego:

#!/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;
pabloab
źródło
0

Szukałem skryptu, który nieustannie testowałby moje połączenie internetowe, który byłby uruchamiany za każdym razem, gdy mój serwer był uruchomiony i zrobiłem to:

  1. Najpierw zainstaluj fping

    apt-get install fping
    
  2. Utwórz skrypt init w folderze /etc/init.d z następującą zawartością (nazwałem to testcon)

    #!/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. Utwórz skrypt w folderze /etc/init.d o następującej treści (nazwałem go testcond)

    #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" [email protected]
    
    #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" [email protected]
        fi
        #echo Internet is online
        #wait 60 seconds
        sleep 60
            done
    
  4. Następnie uruchamiam poniższe polecenia, aby dodać do uruchamiania:

    sudo update-rc.d testcon defaults
    sudo update-rc.d testcon enable
    
  5. Restart

Rafael
źródło
0

Mój Broadcom BCM94331CDukład scalony napotkał przypadkowe zerwanie połączeń Wi-Fi . Opracowałem następujący skrypt bash (nieskończona pętla) sprawdzający co sekundę, czy połączenie internetowe Wi-Fi jest uruchomione. Inna proponowana tutaj linia poleceń będzie czekać co najmniej 5 do 10 sekund przed zamknięciem ze statusem tjping . Tymczasem szukam też ostatecznego rozwiązania.

Z wyników na askubuntu będę musiał wyczyścić bcmwl-kernel-sourcepakiet podczas używania firmware-b43-installerib43-fwcutter .

Dziękujemy wszystkim za sugestie (powyżej).

Skrypt ten należy dodać w programach startowych i nie wymaga on również super useruprawnień do uruchamiania.

#!/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
Antonio
źródło