Come posso verificare la connettività Internet in una console?


31

Esiste un modo semplice per verificare la connettività Internet dalla console? Sto cercando di giocare in uno script di shell. Un'idea che mi pare è quella di controllare il codice di risposta HTTP per interpretare se la connessione Internet funziona correttamente. Ma penso che ci debba essere un modo semplice senza la necessità di controllare un sito che non si blocca mai;)wget --spider http://www.google.co.in/

Modifica: sembra che ci possano essere molti fattori che possono essere esaminati individualmente, buona cosa. La mia intenzione al momento è di verificare se il mio blog non è attivo. Ho installato cron per controllarlo ogni minuto. Per questo, sto controllando il codice di risposta HTTP di wget --spider al mio blog. Se non è 200, mi avvisa (credo che questo sarà meglio del semplice ping, poiché il sito potrebbe essere sotto carico pesante e potrebbe scadere o rispondere molto tardi). Ora ieri c'era qualche problema con la mia Internet. La LAN era ben collegata ma non potevo accedere a nessun sito. Quindi continuo a ricevere notifiche poiché lo script non ha trovato 200 nella risposta di wget. Ora voglio assicurarmi che mi mostri una notifica quando ho la connessione a Internet.

Quindi, verificare la connettività DNS e LAN è un po 'eccessivo per me in quanto non ho quella necessità specifica per capire quale sia il problema. Quindi cosa mi consigliate come lo faccio?

Ecco il mio script per continuare a controllare i tempi di inattività del mio blog:

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

In questo modo devo verificare la connettività Internet solo se c'è un problema con il mio codice di risposta del blog. È un po 'pesante (dato che non sto usando il ping) ma non dovrebbe dare falsi positivi. Destra? Inoltre, come posso randomizzare il ping su un sito diverso ogni volta, come facebook, google, yahoo ecc. Inoltre (stavo cercando di evitare qualsiasi I / O) posso scrivere in un file di registro in cui posso controllare il conteggio dei controlli dei tempi di inattività e quindi salta ulteriori controlli fino a quando il sito non è inattivo o causa controlli più lunghi (10 minuti anziché ogni minuto). Cosa pensi?


"Connettività Internet" non ha una definizione chiara, è possibile testare la connettività solo a un servizio o set di servizi specifici. Se si intende la connettività "LAN", è consigliabile eseguire il ping del gateway di rete.
João Pinto,

In parole povere, definirei la connettività Internet se è possibile accedere a Internet. Il problema può da qualsiasi cosa nel mezzo. Ho solo bisogno di distinguere tra se funziona bene o se c'è un problema fuori dal set di problemi che può essere responsabile. Spero di essermi chiarito. :)
Ashfame,

Risposte:


29

Verifica se il sito Web specifico è attivo

Innanzitutto, sono disponibili diversi buoni servizi di monitoraggio online. Per sceglierne uno, Pingdom include un account gratuito per il monitoraggio di un target. (Dichiarazione di non responsabilità: non sono affiliato a Pingdom in alcun modo).

In secondo luogo, usare wget --spiderper il tuo script è una buona idea. Riceverai alcuni falsi positivi quando il tuo computer è spento o quando il tuo server DNS non funziona. Controllare il codice di ritorno è un modo semplice per implementare questo:

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

Ancora una volta, ci sono carenze in questo approccio. Se il tuo provider ha memorizzato nella cache il tuo record DNS, ma il server DNS è inattivo, altri non possono accedere al tuo sito anche se il monitoraggio dice che tutto va bene. È possibile scrivere una soluzione alternativa con host, ad esempio host example.com <your dns server IP>. Ciò restituirà un errore se il server DNS non risponde, anche se OpenDNS o il server DNS del proprio provider funzionano correttamente.

Verifica se Internet funziona

Non esiste un modo davvero semplice per gestirlo in ogni caso.

Ad esempio, è possibile eseguire ping -c1su più siti ben noti (ad esempio www.google.com, facebook.com e ping.funet.fi) e controllare i codici di ritorno per determinare se è possibile raggiungere qualsiasi destinazione. Puoi controllare automaticamente il codice di ritorno usando la variabile $?. Il parametro -c1limita il numero di pacchetti ping a uno.

Potresti riscontrare problemi con alcuni wifis pubblici quando esiste un gateway di accesso che reindirizza tutti i ping e le richieste HTTP. In tal caso, potresti ricevere risposte ping e codici di stato HTTP senza errori, anche quando non riesci ad accedere ad altri siti.

Se si desidera verificare lo stato del cavo, è possibile utilizzare

sudo ethtool eth0

Dall'output (estratto):

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

Tuttavia, questo non sta dicendo se hai davvero la connettività o meno, solo se il cavo è collegato e qualcosa è all'altro capo.


Questo è totalmente per la mia configurazione, lavorando su Ethernet sempre attiva. Ma sono contento che tu abbia sottolineato come in alcuni casi non funzionerà correttamente. Inoltre credo che il ping sia più veloce di wget. Cosa pensi? e se sto cercando un codice di stato 200 ovunque, preferirei semplicemente eseguirne il ping. Destra? o c'è qualcosa che dovrei sapere?
Ashfame,

2
il ping è più veloce e migliore, perché l'altra estremità non sarà arrabbiata per te. il ping è abbastanza sicuro, ma anche questo non garantisce che puoi aprire le pagine web. Inoltre, è possibile che il firewall blocchi il ping ma consenta le richieste HTTP.
Olli,

1
Eseguire il ping su un server DNS noto come 4.2.2.2 è utile anche in caso di connettività di rete ma DNS non funzionante.
djeikyb,

Per il controllo DNS puoi ovviamente usare host(query DNS). È anche molto veloce.
Olli,

Grazie per la tua risposta @Olli & @djeikyb Ho aggiornato la domanda, per favore dai un'occhiata
Ashfame

7

Sto usando questo metodo ...

if [["$ (ping -c 1 8.8.8.8 | grep '100% perdita di pacchetti')"! = ""]]; poi
    echo "Internet non presente"
    uscita 1
altro
    echo "Internet è presente"
    wget www.site.com
fi

Ho ottenuto risultati diversi per ping -c 1 8.8.8.8e ping -c 1 www.google.com. Come va?
MERose

2
Nota che questo non riuscirà in Cina e in altri Paesi che bloccano Google
Tom J Nowell,

7

Ho appena usato

nm-online

che fa una pausa fino a quando una connessione di rete non è presente dal gestore della rete. Ha funzionato bene Puoi fare anche altre cose con esso.


6

Controllare se un sito è attivo di solito viene fatto con uno strumento di monitoraggio come nagios. Questo monitorerà continuamente il sito e può avvisarti di interruzioni.

Quando controllo se Internet è attivo dalla riga di comando, eseguo una serie di passaggi:

  • Controlla che Internet sia attivo ping google.com(controlla DNS e sito raggiungibile noto).
  • Verificare che il sito Web sia attivo wgeto w3mper recuperare la pagina.

Se Internet non è attivo, diagnosticare all'esterno.

  • Controlla che il gateway sia pingabile. (Controlla ifconfig per l'indirizzo gateway.)
  • Verifica che i server DNS siano pingabili. (Controllare /etc/resolv.conf per gli indirizzi.)
  • Controlla se il firewall sta bloccando. (Controlla / var / log / syslog come blocco log.)

Se Internet è attivo ma il sito è inattivo, verificare con la w3m http://isup.me/example.comsostituzione example.comcon il sito visualizzato in basso. Usa wget, lynx o il browser della riga di comando che hai a disposizione se non hai installato il browser w3m.


Grazie per il tuo suggerimento! Il mio script copre i requisiti di base per controllare e avvisarmi quando il mio sito è inattivo? E sarà silenzioso nel caso ci sia qualche problema di connettività Internet
Ashfame,

Sembra che la tua sceneggiatura farà quello che vuoi. È possibile includere il comando wget nell'istruzione if as if ! wget --spider http:///example.com; then.
BillThor,

vuoi dire wget restituisce sempre 1 per 200 codice di risposta HTTP?
Ashfame,

Voglio dire, il test [ $? != 0 ]è lo stesso del test ! command. wget è documentato per restituire 0 in caso di successo e non 0 per errore. L'if si comporta in modo identico in qualunque modo lo codifichi. Se wget restituisce un errore su una risposta 200, il test fallirà in entrambi i modi. Lo stesso se restituisce 0 per un codice di risposta diverso da 200.
BillThor,

Grazie! Ciò renderebbe la sceneggiatura più piccola e di facile comprensione.
Ashfame,

4

Questo è lo script della shell che sto usando per testare la connettività Internet:

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

Dovrai installare curl e mpg321

sudo apt-get install curl mpg321

È necessario un file audio .mp3 rinominato in alarm.mp3 nella stessa cartella se si desidera la funzionalità di allarme acustico. Infine, configura l'URL del sito web ed egrep alle tue esigenze.


Funziona perfettamente anche quando l'utente si trova dietro un captive portal e non ha effettuato l'accesso.
Ashhar Hasan

Puoi usare egrep -qinvece diegrep ... > /dev/null
wjandrea il

Perché lo script chiama se stesso invece di usare solo un whileciclo?
wjandrea,

Oh aspetta, non si chiama da solo. Chiama uno script chiamato alarm.shin wd, quindi se si chiama questo script da una directory diversa, si verificherà un errore, o se c'è uno script chiamato alarm.shin wd, lo chiamerà invece. Quindi è una cattiva pratica. Si potrebbe usare "$0"invece, ma un whileciclo sarebbe meglio.
wjandrea,

"Perché lo script si chiama da solo invece di usare un ciclo while?": Perché ero un noob quando ho scritto quel post e sì, quello script si stava chiamando da solo.
01BTC10

2

Verifica se Internet funziona

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

Dall'output (estratto):

1 #System is connected to internet

Tuttavia, come menzionato da altri, questo non sta dicendo se hai davvero la connettività o meno. Per esempio. Potresti essere connesso al router e il router non è necessariamente connesso a Internet.


2
nm-toolè stato rimosso in Ubuntu 15.04+, ma è possibile utilizzare nmcliinvece. Ad esempio[[ $(nmcli -f STATE -t g) = connected ]]
Sei

@Six nmcli -f STATE -t nmil bello è essere indipendenti dai siti web!
Aquarius Power

1
Si noti che nm-toole nmclivi dirà solo se o non entrato in contatto con locali di rete, vale a dire anche se non si è connessi alla vostra casa wifi / ethernet. Non ti dirà se puoi raggiungere qualcosa oltre la tua rete locale, ad esempio Internet.
Sergiy Kolodyazhnyy,

1

Sto usando questo metodo:

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

Tenterà di connettersi a un noto sito Web e se riesce a connettersi ad esso, supponiamo che ci sia Internet.


0

Avevo bisogno di aiuto con la stessa domanda e ho ottenuto la mia risposta in questo modo:

echo $(nm-online) $? connection problems

come funziona?
wjandrea,

Sta solo controllando lo stato (un carattere) del nm-onlinecomando ... Restituirà 0 se tutto va bene. Solito in tutte le UNIXconchiglie.
Antonio

0

Controllare se Internet funziona non è così banale. ping è ICMP, quindi potrebbe funzionare anche se il proxy web non è attivo. Qualcosa di simile si verifica con DNS se si esegue il test con un IP.

Poiché la mia connessione Internet è instabile, ho creato questo script ( basato su questo ) che emette un suono di accordo gentile per chiamarmi e utilizza anche Ubuntu quando la connessione Internet ritorna:

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

0

Stavo cercando uno script che testasse continuamente la mia connessione Internet, che sarebbe stato avviato ogni volta che il mio server era attivo e ho fatto questo:

  1. Innanzitutto, installa fping

    apt-get install fping
    
  2. Crea uno script init nella cartella /etc/init.d con il seguente contenuto (l'ho chiamato 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. Crea uno script nella cartella /etc/init.d con il seguente contenuto (l'ho chiamato 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" your_email@gmail.com
    
    #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" your_email@gmail.com
        fi
        #echo Internet is online
        #wait 60 seconds
        sleep 60
            done
    
  4. Quindi eseguo i comandi seguenti per aggiungere all'avvio:

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


0

Il mio Broadcom BCM94331CDchip ha dovuto affrontare escrementi casuali di connessioni Wi-Fi . Ho ideato il seguente script bash (loop infinito) controllando ogni secondo se la connessione Internet Wi-Fi è attiva e funzionante. L'altra riga di comando qui proposta attenderà da 5 a 10 secondi prima di chiudere con uno stato, ad es ping. Nel frattempo cerco anche una soluzione definitiva.

Dai risultati su askubuntu, dovrò eliminare il bcmwl-kernel-sourcepacchetto mentre uso firmware-b43-installere b43-fwcutter.

Grazie a tutti per i loro suggerimenti (sopra).

Questo script deve essere aggiunto nei Programmi di avvio e non necessita di super userprivilegi per l'esecuzione.

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.