Como posso verificar a conectividade com a Internet em um console?

31

Existe uma maneira fácil de verificar a conectividade da Internet no console? Eu estou tentando brincar em um script de shell. Uma idéia que eu pareço é verificar o código de resposta HTTP para interpretar se a conexão com a Internet está funcionando bem. Mas acho que deve haver uma maneira fácil, sem a necessidade de verificar um site que nunca falha;)wget --spider http://www.google.co.in/

Edit: Parece que pode haver muitos fatores que podem ser examinados individualmente, coisa boa. Minha intenção no momento é verificar se meu blog está inativo. Eu configurei o cron para verificar a cada minuto. Para isso, estou verificando o código de resposta HTTP do wget --spider no meu blog. Se não for 200, ele me notificará (acredito que isso será melhor do que apenas fazer ping, pois o site pode estar com muita carga e pode estar atingindo o tempo limite ou responder muito tarde). Agora ontem, houve algum problema com minha Internet. A LAN estava conectada corretamente, mas não consegui acessar nenhum site. Então, continuo recebendo notificações, pois o script não conseguiu encontrar 200 na resposta do wget. Agora, quero ter certeza de que ele será exibido quando eu tiver conectividade com a Internet.

Portanto, verificar a conectividade DNS e LAN é um pouco exagerado para mim, pois não tenho essa necessidade específica de descobrir qual é o problema. Então, o que você sugere como eu faço isso?

Aqui está o meu script para continuar verificando o tempo de inatividade do meu 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

Dessa forma, preciso verificar a conectividade com a Internet somente quando houver um problema com o código de resposta do meu blog. É um pouco pesado (como eu não estou usando ping), mas não deve dar nenhum falso positivo. Direita? Além disso, como posso aleatoriamente executar ping em um site diferente a qualquer momento, como facebook, google, yahoo etc. Também (eu estava tentando evitar qualquer E / S), posso escrever em um arquivo de log no qual posso verificar a contagem de verificações de inatividade e depois pule as verificações adicionais até que o site esteja inoperante ou cause verificações mais longas (10 minutos em vez de cada minuto). O que você acha?

Ashfame
fonte
"Conectividade com a Internet" não tem uma definição clara; você só pode testar a conectividade com um serviço ou conjunto de serviços específico. Se você quer dizer conectividade "LAN", uma boa opção é executar ping no seu gateway de rede.
João Pinto
Em termos leigos, eu definiria conectividade com a Internet se você puder acessar a Internet. Problema pode por qualquer coisa no meio. Eu só preciso diferenciar entre se está funcionando bem ou se há um problema fora do conjunto de problemas que pode ser responsável. Espero ter me esclarecido. :)
Ashfame 25/02

Respostas:

29

Verificando se um site específico está ativo

Primeiro, vários bons serviços de monitoramento online estão disponíveis. Para escolher um, o Pingdom inclui uma conta gratuita para monitorar um alvo. (Disclaimer: Eu sou não afiliado com Pingdom de qualquer forma).

Segundo, usar wget --spiderpara o seu próprio script é uma boa ideia. Você receberá alguns falsos positivos quando o computador estiver inoperante ou quando o servidor DNS não estiver funcionando. A verificação do código de retorno é uma maneira direta de implementar isso:

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

Mais uma vez, existem deficiências nessa abordagem. Se o seu provedor armazenou em cache o seu registro DNS, mas o servidor DNS está inoperante, outras pessoas não podem acessar o site, mesmo que o monitoramento diga que está tudo bem. Você pode escrever uma solução alternativa curta host, por exemplo host example.com <your dns server IP>. Isso retornará um erro se o servidor DNS não estiver respondendo, mesmo que o OpenDNS ou o servidor DNS do seu próprio provedor funcione bem.

Verificando se a Internet está funcionando

Não há realmente uma maneira fácil de lidar com isso em todos os casos.

Você pode, por exemplo, executar ping -c1em vários sites conhecidos (por exemplo, www.google.com, facebook.com e ping.funet.fi) e verificar os códigos de retorno para determinar se algum destino é acessível. Você pode verificar automaticamente o código de retorno usando variável $?. O parâmetro -c1está limitando o número de pacotes de ping para um.

Você pode encontrar problemas com alguns wifis públicos quando houver um gateway de login que redirecione todos os pedidos de pings e HTTP. Nesse caso, você pode obter respostas de ping e códigos de status HTTP sem erro, mesmo quando não pode acessar outros sites.

Se você deseja verificar o estado do cabo, pode usar

sudo ethtool eth0

De saída (trecho):

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

No entanto, isso não indica se você realmente tem conectividade ou não, apenas se o cabo está conectado e se há algo do outro lado.

Olli
fonte
Isso é totalmente para minha configuração, trabalhando na Ethernet Always-ON. Mas, feliz que você apontou como isso não funcionará corretamente em alguns casos. Também acredito que o ping seria mais rápido que o wget. O que você acha? e se eu estiver verificando um código de status 200 em qualquer lugar, prefiro apenas fazer o ping. Direita? ou há algo que eu deveria saber?
Ashfame 25/02
2
o ping é mais rápido e melhor, porque o outro lado não ficará bravo com você. o ping é bastante seguro, mas mesmo isso não garante que você possa abrir páginas da web. Além disso, é possível que o firewall esteja bloqueando o ping, mas permitindo solicitações HTTP.
Olli
1
Efetuar ping em um servidor DNS conhecido como 4.2.2.2 também é útil caso você tenha conectividade de rede, mas DNS quebrado.
25411 djeikyb
Para verificação de DNS, é claro que você pode usar host(consulta de DNS). É muito rápido também.
Olli
Obrigado pela sua resposta @Olli & @djeikyb Atualizei a pergunta, por favor dê uma olhada #
Ashfame
7

Estou usando esse método ...

if [["$ (ping -c 1 8.8.8.8 | grep '100% perda de pacote')"! = ""]]; então
    eco "Internet não está presente"
    saída 1
outro
    eco "Internet está presente"
    wget www.site.com
fi
bais bais
fonte
Eu tenho resultados diferentes para ping -c 1 8.8.8.8e ping -c 1 www.google.com. Como é isso?
273 MERose
2
Note que este irá falhar na China e em outros países desse bloco Google
Tom J Nowell
7

Eu apenas usei

nm-online

que pausa até que uma conexão de rede esteja presente pelo gerenciador de rede. Funcionou bem. Você também pode fazer outras coisas.

ntsecrets
fonte
6

Verificar se um site está ativo geralmente é feito com uma ferramenta de monitoramento como nagios. Isso monitorará continuamente o site e poderá notificá-lo sobre interrupções.

Ao verificar se a Internet está acima da linha de comando, executei várias etapas:

  • Verifique se a Internet está funcionando ping google.com(verifica o DNS e o site acessível).
  • Verifique se o site está em uso wgetou w3mpara buscar a página.

Se a Internet não estiver ativa, diagnostique para fora.

  • Verificar gateway é pingável. (Verifique ifconfig para o endereço do gateway.)
  • Verifique se os servidores DNS são pingáveis. (Verifique /etc/resolv.conf para obter os endereços.)
  • Verifique se o firewall está bloqueando. (Marque / var / log / syslog como eu registro blocos.)

Se a Internet estiver ativa, mas o site estiver inativo, verifique com a w3m http://isup.me/example.comsubstituição example.compelo site que aparece inativo. Use wget, lynx ou qualquer navegador de linha de comando disponível, se você não tiver o navegador w3m instalado.

BillThor
fonte
Obrigado por sua sugestão! Meu script cobre o requisito básico de verificar e me alertar quando meu site estiver inativo? E ficará quieto no caso de haver algum problema de conectividade com a Internet.
Ashfame 27/02
Parece que seu script fará o que você deseja. Você pode incluir o comando wget na instrução if como if ! wget --spider http:///example.com; then.
BillThor 27/02
quer dizer que o wget sempre retorna 1 para 200 códigos de resposta HTTP?
Ashfame 27/02
Quero dizer, o teste [ $? != 0 ]é o mesmo que o teste ! command. O wget está documentado para retornar 0 em caso de sucesso e não 0 em caso de falha. O if se comporta de maneira idêntica de qualquer maneira que você o codifica. Se o wget retornar uma falha em uma resposta 200, o teste falhará de qualquer maneira que você a escrever. O mesmo se retornar 0 para um código de resposta diferente de 200.
BillThor 27/02
Obrigado! Isso tornaria o script menor e fácil de entender.
Ashfame 28/02
4

Este é o shell srcript que estou usando para testar a conectividade com a 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

Você precisará instalar o curl e o mpg321

sudo apt-get install curl mpg321

Você precisará de um arquivo de som .mp3 renomeado para alarm.mp3 na mesma pasta, se desejar a funcionalidade de alarme sonoro. Por fim, configure o URL do site e egrep de acordo com suas necessidades.

01BTC10
fonte
Isso funciona perfeitamente, mesmo quando o usuário está atrás de um portal cativo e não identificado.
Ashhar Hasan
Você pode usar em egrep -qvez deegrep ... > /dev/null
wjandrea 28/11
Por que o script se chama em vez de apenas usar um whileloop?
Wjandrea
Oh espere, ele não se chama. Ele chama um script chamado alarm.shwd; portanto, se você chamar esse script de um diretório diferente, ocorrerá um erro ou, se houver um script chamado alarm.shno wd, ele será chamado. Então isso é uma prática ruim. Você poderia usar "$0", mas um whileloop seria melhor.
Wjandrea
"Por que o script se autodenomina em vez de usar apenas um loop while?": Porque eu era um noob quando fiz essa postagem e sim esse script estava se autodenominando.
01BTC10
2

Verificando se a Internet está funcionando

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

De saída (trecho):

1 #System is connected to internet

No entanto, como mencionado por outros, isso não indica se você realmente tem conectividade ou não. Por exemplo. Você pode estar conectado ao roteador e o roteador não está necessariamente conectado à Internet.

Venkat Kotra
fonte
2
nm-toolfoi removido no Ubuntu 15.04+, mas você pode usá-lo nmcli. Por exemplo[[ $(nmcli -f STATE -t g) = connected ]]
Six
@ Seis nmcli -f STATE -t nma coisa boa é ser independente de sites!
Poder de Aquário
1
Observe isso nm-toole nmcliinformará apenas se você está ou não conectado à rede local , ou seja, se você está ou não conectado à sua rede wifi / Ethernet doméstica. Não lhe dirá se você pode ou não alcançar algo além da sua rede local, como a Internet.
Sergiy Kolodyazhnyy
1

Eu estou usando este método:

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

Ele tentará se conectar a um site conhecido e, se puder se conectar a ele, assumiremos que existe a Internet.

Abraham Hernandez
fonte
0

Eu precisava de ajuda com a mesma pergunta e recebi minha resposta desta maneira:

echo $(nm-online) $? connection problems
octius4u
fonte
Como é que isso funciona?
Wjandrea
Ele está apenas verificando o status (um caractere) do nm-onlinecomando ... Ele retornará 0 se tudo estiver bem. Usual em todas as UNIXconchas.
Antonio
0

Verificar se a Internet está funcionando não é tão trivial. ping é ICMP, portanto, pode funcionar mesmo se o proxy da web estiver inativo. Algo semelhante ocorre com o DNS se você testar com um IP.

Como minha conexão com a Internet é instável, criei este script ( baseado neste ) que faz um som suave para me chamar e também usa o Ubuntu notify quando a conexão com a Internet volta:

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

Eu estava procurando por um script que testasse continuamente minha conexão com a Internet, que seria iniciado sempre que meu servidor estivesse ativo e fiz isso:

  1. Primeiro, instale o fping

    apt-get install fping
    
  2. Crie um script init na pasta /etc/init.d com o seguinte conteúdo (chamei-o de 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. Crie um script na pasta /etc/init.d com o seguinte conteúdo (eu chamei de 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. Então, eu executo os comandos abaixo para adicionar à inicialização:

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

Rafael
fonte
0

Fui confrontado com excrementos aleatórios de conexões Wi-Fi pelos meus Broadcom BCM94331CD chip. Criei o seguinte script bash (loop infinito) verificando a cada segundo se a conexão Wi-Fi à Internet está ativa e funcionando. Outra linha de comando proposta aqui irá aguardar pelo menos 5 a 10 segundos antes de fechar com um status ie ping. Nesse meio tempo, também estou procurando uma solução definitiva.

Dos resultados no askubuntu, terei que limpar o bcmwl-kernel-sourcepacote enquanto uso firmware-b43-installereb43-fwcutter .

Obrigado a todos por suas sugestões (acima).

Esse script precisa ser adicionado nos Programas de Inicialização e não precisa de super userprivilégios para ser executado também.

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