“verificador de conexão à internet one-liner”

5

Com isso, posso verificar se existe "conexão com a internet". se não houver "conexão de internet" (pings bem sucedidos para esses 2 lugares), então ele espera por 600 seg, então corre junto:

ping -W 1 -c 4 www.google.com >& /dev/null && ping -W 1 -c 4 www.yahoo.com >& /dev/null || sleep 600

Mas: como eu poderia reescrever esta linha, de modo que ela faça um loop até que haja conexão com a internet?

    
por LanceBaynes 03.04.2011 / 13:43

4 respostas

7
while ! ping -W 1 -c 4 www.google.com >& /dev/null ||
      ! ping -W 1 -c 4 www.yahoo.com >& /dev/null; do
  sleep 600
done

Embora eu apenas teste a conectividade com um endereço IP; 8.8.8.8 é o servidor DNS público do Google (tem disponibilidade muito alta). Testar se o DNS funciona não é confiável, porque a entrada pode estar no cache.

while ! ping -W 1 -c 1 8.8.8.8 >&/dev/null; do sleep 600; done

O ping nem sempre é a melhor maneira de verificar a conectividade com a Internet. Muitos lugares (especialmente redes corporativas) bloqueiam todos, menos o acesso à web. Você pode testar se a Web está funcionando baixando um arquivo de um servidor de alta disponibilidade. Isso também testa o DNS, pelo menos do ponto de vista do proxy HTTP (o que novamente é o que importa).

while ! wget -q -O /dev/null --no-cache http://www.google.com/; do sleep 6000; done
    
por 03.04.2011 / 14:08
3

Algumas falhas com algumas das abordagens acima e por que um abrangente "é a Internet funcionando" não pode ser feito em uma linha:

  • Você deve sempre verificar se o seu link está ativo antes mesmo de tentar pingar alguma coisa. Se não houver nenhum cabo conectado à sua porta Ethernet ou se seu gato estúpido mascou o fio, nada vai funcionar.

  • Deve testar o host local primeiro. Isso irá verificar a integridade da sua pilha TCP / IP.

  • Confiar na resolução do DNS especificando nomes do doman pode falhar se o seu servidor DNS estiver inacessível ou bloqueado. Só porque o seu servidor DNS preferido está inativo não significa que você não pode se conectar a outros hosts via Internet

  • Não é bom usar sempre o mesmo endereço ou host para verificar a conectividade em um servidor que você não possui. Você deve testar um conjunto variado / aleatório de hosts conhecidos para sempre, preferencialmente hosts que você possui fora de sua rede.

  • Eu até diria que você deveria usar uma variedade de protocolos para realmente ver se a "internet" está ativa ou não. Talvez uma máquina zumbi em sua rede tenha enviado uma enxurrada de pings como parte de um DDoS e seu provedor bloqueou o ICMP.

Se você realmente precisa ter uma abordagem de uma linha, o que eu faria seria um traceroute para google.com ou outro site conhecido de sua escolha. Só uma vez. Descubra quantos hops seu tráfego leva para sair da rede do seu provedor de serviços. Posteriormente, você pode usar um traceroute para testar sua conectividade externa, mas limitá-lo a muitos saltos. Se o ping final no traceroute for bem sucedido, você poderá sair da rede. Gostaria que houvesse um utilitário "traceroute-like" para outros protocolos, como HTTP e outros.

    
por 04.04.2011 / 22:13
2

Você pode usar apenas um loop while do shell.

while true; do
    if ping -W 1 -c 4 www.google.com >& /dev/null &&
       ping -W 1 -c 4 www.yahoo.com >& /dev/null; then
        break
    fi
    sleep 600
done

Os comandos /bin/true e test 0 sempre retornarão 0 (verdadeiro), mas true nem sempre será interno.

    
por 03.04.2011 / 13:57
0

Para tornar a lógica um pouco mais clara, você pode escrever o cheque em um subshell, por exemplo

while ! ( ping -W 1 -c 4 www.google.com >& /dev/null &&
          ping -W 1 -c 4 www.yahoo.com >& /dev/null ); do
    sleep 600
done

Ou escreva o teste em uma função.

can_ping_internet() {
    ping -W 1 -c 4 www.google.com && ping -W 1 -c 4 www.yahoo.com
}

while ! can_ping_internet; do
    sleep 600
done
    
por 04.04.2011 / 23:36