Eu recomendo não usar ping
para determinar a conectividade. Existem muitos administradores de rede que desabilitam o ICMP (o protocolo usado) devido a preocupações com ataques de inundação de ping originados em suas redes.
Em vez disso, uso um teste rápido de um servidor confiável em uma porta que você pode esperar estar aberta:
if nc -zw1 google.com 443; then
echo "we have connectivity"
fi
Isso usa netcat ( nc
) no modo de varredura de porta , um toque rápido ( -z
é o modo de E / S zero [usado para varredura] ) com um tempo limite rápido ( -w 1
aguarda no máximo um segundo). Ele verifica o Google na porta 443 (HTTPS).
Eu usei HTTPS em vez de HTTP como um esforço para proteger contra portais cativos e proxies transparentes que podem responder na porta 80 (HTTP) para qualquer host. Isso é menos provável ao usar a porta 443, pois haveria uma incompatibilidade de certificado, mas ainda acontece.
Se você quiser se provar contra isso, precisará validar a segurança na conexão:
test=google.com
if nc -zw1 $test 443 && echo |openssl s_client -connect $test:443 2>&1 |awk '
handshake && $1 == "Verification" { if ($2=="OK") exit; exit 1 }
$1 $2 == "SSLhandshake" { handshake = 1 }'
then
echo "we have connectivity"
fi
Isso verifica se há uma conexão (em vez de aguardar o tempo limite do openssl) e, em seguida, efetua o handshake SSL, digitando a fase de verificação. Ele sai silenciosamente ("true") se a verificação foi "OK" ou sai com um erro ("false"), então relatamos a descoberta.
$ ethtool <dev> | awk '$0 ~ /link detected/{print $3}'