Я настоятельно рекомендую против использования ping
для определения подключения. Слишком много сетевых администраторов отключают ICMP (протокол, который он использует) из-за опасений по поводу пинг- атак, исходящих из их сетей.
Вместо этого я использую быстрый тест надежного сервера на порте, который вы можете ожидать открыть:
if nc -zw1 google.com 443; then
echo "we have connectivity"
fi
При этом используется netcat ( nc
) в режиме сканирования портов , быстрый щелчок ( -z
это режим с нулевым вводом-выводом [используется для сканирования] ) с быстрым таймаутом ( -w 1
ожидание не более одной секунды). Он проверяет Google на порт 443 (HTTPS).
Я использовал HTTPS, а не HTTP, чтобы защитить от порталов и прозрачных прокси, которые могут отвечать на порт 80 (HTTP) для любого хоста. Это менее вероятно при использовании порта 443, поскольку будет несоответствие сертификата, но это все же произойдет.
Если вы хотите защитить себя от этого, вам необходимо проверить безопасность соединения:
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
Это проверяет соединение (а не ожидает, когда openssl истечет время ожидания), а затем выполняет SSL-квитирование, вводя ключ на этапе проверки. Он тихо завершает работу («истина»), если проверка прошла «ОК», либо завершается с ошибкой («ложь»), тогда мы сообщаем об обнаружении.
$ ethtool <dev> | awk '$0 ~ /link detected/{print $3}'