Verificando a disponibilidade do host usando o ping em scripts bash

Eu quero escrever um script, que iria verificar se algum dos dispositivos na rede, que deveria estar online o dia todo, está realmente online. Eu tentei usar ping, mas

if [ "`ping -c 1 some_ip_here`" ] then echo 1 else echo 0 fi 

1 não importa se eu inserir um endereço IP válido ou inválido. Como posso verificar se um endereço específico (ou melhor algum dos dispositivos da lista de endereços IP) ficou offline?

O ping retorna diferentes códigos de saída, dependendo do tipo de erro.

 ping 256.256.256.256 ; echo $? # 68 ping -c 1 127.0.0.1 ; echo $? # 0 ping -c 1 192.168.1.5 ; echo $? # 2 

0 significa host acessível

2 significa inacessível

Você não precisa dos backticks na declaração if. Você pode usar essa verificação

 if ping -c 1 some_ip_here &> /dev/null then echo 1 else echo 0 fi 

O comando if verifica o código de saída do comando a seguir (o ping). Se o código de saída for zero (o que significa que o comando saiu com sucesso), o bloco será executado. Se retornar um código de saída diferente de zero, o bloco else será executado.

Há uma versão avançada do ping – “fping”, que dá a possibilidade de definir o tempo limite em milissegundos.

 #!/bin/bash IP='192.168.1.1' fping -c1 -t300 $IP 2>/dev/null 1>/dev/null if [ "$?" = 0 ] then echo "Host found" else echo "Host not found" fi 

Eu posso pensar em um forro como este para executar

 ping -c 1 127.0.0.1 &> /dev/null && echo success || echo fail 

Substitua 127.0.0.1 por IP ou hostname, substitua os comandos echo pelo que precisa ser feito em ambos os casos.

O código acima será bem-sucedido, talvez tente com um IP ou nome de host que você sabe que não está acessível.

Como isso:

 ping -c 1 google.com &> /dev/null && echo success || echo fail 

e isto

 ping -c 1 lolcatz.ninja &> /dev/null && echo success || echo fail 

FYI, eu apenas fiz alguns testes usando o método acima e se usarmos multi ping (10 pedidos)

ping -c10 8.8.8.8 &> / dev / null; echo $?

o resultado do comando multi ping será “0” se pelo menos um dos resultados do ping puder ser alcançado, e “1” no caso de todas as solicitações de ping serem inacessíveis.

 up=`fping -r 1 $1 ` if [ -z "${up}" ]; then printf "Host $1 not responding to ping \n" else printf "Host $1 responding to ping \n" fi