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

23

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

Editar: 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 tenho cron configurado para verificar a cada minuto. Para isso, estou verificando o código de resposta HTTP de wget --spider no meu blog. Se não é 200, ele me notifica (eu acredito que isso será melhor do que apenas pingar, como o site pode estar sob carga pesada e pode ser o tempo limite ou responder muito tarde). Hoje, ontem, houve algum problema com a minha Internet. A LAN estava bem conectada, mas não consegui acessar nenhum site. Então, continuo recebendo notificações, pois o script não encontrou 200 na resposta do wget. Agora quero ter certeza de que isso me exibe uma notificação quando tiver conectividade com a Internet.

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

Aqui está meu script para verificar 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 quaisquer falsos positivos. Certo? Também como posso randomizar o ping para um site diferente toda vez, como facebook, google, yahoo etc. Também (eu estava tentando evitar qualquer I / O) eu posso escrever em um arquivo de log pelo qual eu posso verificar a contagem de verificações de inatividade e em seguida, ignore outras verificações até que o site esteja inativo ou faça verificações mais longas (10 minutos em vez de cada minuto). O que você acha?

    
por Ashfame 24.02.2011 / 21:42

10 respostas

24

Verificando se um site específico está ativo

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

Em segundo lugar, usar wget --spider para o seu próprio script é uma boa ideia. Você obterá alguns falsos positivos quando o computador estiver inoperante ou quando o servidor DNS não estiver funcionando. Verificar o 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, há falhas nessa abordagem. Se o seu provedor tiver armazenado em cache seu registro DNS, mas o servidor DNS estiver inativo, outros não poderão acessar seu site, mesmo que o monitoramento diga que está tudo bem. Você pode escrever uma pequena solução alternativa com host , por exemplo, host example.com <your dns server IP> . Isso retornará um erro se o servidor DNS não estiver respondendo, mesmo se o OpenDNS ou o servidor DNS do seu provedor funcionar bem.

Verificando se a internet está funcionando

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

Por exemplo, você pode executar ping -c1 em vários sites conhecidos (por exemplo, www.google.com, facebook.com e ping.funet.fi) e verificar códigos de retorno para determinar se algum destino está acessível. Você pode verificar automaticamente o código de retorno usando a variável $? . O parâmetro -c1 está 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 pings e solicitações HTTP. Em caso afirmativo, você pode receber respostas de ping e códigos de status HTTP sem erro, mesmo quando não puder acessar outros sites.

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

sudo ethtool eth0

Da saída (trecho):

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

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

    
por Olli 24.02.2011 / 21:47
6

Estou usando esse método ...

if [[ "$(ping -c 1 8.8.8.8 | grep '100% packet loss' )" != "" ]]; then
    echo "Internet isn't present"
    exit 1
else
    echo "Internet is present"
    wget www.site.com
fi
    
por bais bais 14.10.2013 / 11:18
5

Verificar se um site está ativo normalmente é 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á funcionando a partir da linha de comando, percorro várias etapas:

  • Verifique se a Internet está em ping google.com (verifica o DNS e o site conhecido acessível).
  • Verifique se o site está em uso wget ou w3m para buscar página.

Se a Internet não estiver diagnosticando para fora.

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

Se a Internet estiver ativa, mas o site estiver inoperante, verifique com w3m http://isup.me/example.com substituindo example.com pelo site exibido abaixo. Use o wget, lynx ou qualquer outro navegador de linha de comando disponível se você não tiver o navegador w3m instalado.

    
por BillThor 27.02.2011 / 17:20
3

Eu acabei de usar

nm-online

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

    
por ntsecrets 26.12.2016 / 00:03
3

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 curl e mpg321

sudo apt-get install curl mpg321

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

    
por 01BTC10 21.04.2012 / 01:34
2

Verificando se a internet está funcionando

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

Da saída (trecho):

1 #System is connected to internet

No entanto, como mencionado por outros, isso não está dizendo 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.

    
por Venkat Kotra 19.11.2012 / 01:46
0

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

echo $(nm-online) $? connection problems
    
por octius4u 23.04.2014 / 09:21
0

Verificar se a Internet está funcionando não é tão trivial. O 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 suave acorde soar para me chamar, e também usa o Ubuntu notificar quando a conexão com a Internet voltar:

#!/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 ;
        #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;
    
por pabloab 18.11.2014 / 14:31
0

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

  1. Primeiro, instale o fping

    apt-get install fping
    
  2. Crie um script de inicialização na pasta /etc/init.d com o seguinte conteúdo (chamei de testcon)

    #!/bin/bash
    
    PIDFILE=/var/run/testcon.pid
    
    . /lib/lsb/init-functions
    
    case "" 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 (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. Em seguida, executo os comandos abaixo para adicionar à inicialização:

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

por Rafael 08.05.2014 / 02:00
0

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

A partir dos resultados no askubuntu, terei que limpar o pacote bcmwl-kernel-source enquanto uso firmware-b43-installer e b43-fwcutter .

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

Este script precisa ser adicionado nos Programas de inicialização e não precisa do privilégio super user 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
    
por Antonio 04.03.2018 / 00:11