Shell Scripting: Правильный способ проверить подключение к Интернету?

Я нашел сценарии, которые говорят, что они проверяют подключение к Интернету. Некоторые проверяют ip-адрес, если интерфейс подключен, но он не проверяет подключение к Интернету. Я нашел некоторые, которые используют ping следующим образом: if [ 'ping google.com -c 4 | grep time' != "" ]; then if [ 'ping google.com -c 4 | grep time' != "" ]; then if [ 'ping google.com -c 4 | grep time' != "" ]; then иногда это может быть ненадежным.

Любые предложения по правильному способу проверки подключения к Интернету с использованием сценариев? Должен ли я использовать некоторые пакеты?

Он должен периодически проверять (я угадываю cron), затем делать что-то, когда соединение идет вниз (возможно, вызывается ifup --force [interface] )

Еще одно: правильно ли я использую слово «invoke»?

4 Solutions collect form web for “Shell Scripting: Правильный способ проверить подключение к Интернету?”

Тестирование подключения IPv4

Если ваша сеть прокручивается, попробуйте выполнить ping 8.8.8.8 (сервер под управлением Google).

 if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then echo "IPv4 is up" else echo "IPv4 is down" fi 

Тестирование IP-соединений и DNS

Если вы хотите, чтобы тест был успешным, когда DNS также работает, используйте имя хоста.

 if ping -q -c 1 -W 1 google.com >/dev/null; then echo "The network is up" else echo "The network is down" fi 

Тестирование веб-подключения

Некоторые брандмауэры блокируют пинги. В некоторых местах есть брандмауэр, который блокирует весь трафик, за исключением веб-прокси. Если вы хотите протестировать веб-подключение, вы можете сделать HTTP-запрос.

 case "$(curl -s --max-time 2 -I http://google.com | sed 's/^[^ ]* *\([0-9]\).*/\1/; 1q')" in [23]) echo "HTTP connectivity is up";; 5) echo "The web proxy won't let us through";; *) echo "The network is down or very slow";; esac 

Я настоятельно рекомендую не использовать ping для определения возможности подключения. Слишком много сетевых администраторов, которые отключают ICMP (протокол, который он использует) из-за беспокойства о атаках ping flood, происходящих из их сетей.

Вместо этого я использую быстрый тест надежного сервера на порту, который вы можете ожидать, чтобы быть открытым:

 if nc -zw1 google.com 443; then echo "we have connectivity" fi 

Это использует netcat ( nc ) в режиме сканирования порта , быстрый poke ( -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-подтверждение, вводя фазу проверки. Он тихо выходит («истина»), если проверка была «ОК» или вышла с ошибкой («ложь»), тогда мы сообщим об обнаружении.

Я сделал сценарий, который использует несколько способов проверить подключение к Интернету (ping, nc и curl, благодаря Адаму Кацу, Жилю и Архемару). Надеюсь, кто-то найдет это полезным. Не стесняйтесь редактировать его по своему вкусу / оптимизации.

Проверяет ваш шлюз, DNS и интернет-соединение (используя curl, nc и ping). Поместите это в файл, затем сделайте его исполняемым (обычно sudo chmod +x filename )

 #!/bin/bash GW=`/sbin/ip route | awk '/default/ { print $3 }'` checkdns=`cat /etc/resolv.conf | awk '/nameserver/ {print $2}' | awk 'NR == 1 {print; exit}'` checkdomain=google.com #some functions function portscan { tput setaf 6; echo "Starting port scan of $checkdomain port 80"; tput sgr0; if nc -zw1 $checkdomain 80; then tput setaf 2; echo "Port scan good, $checkdomain port 80 available"; tput sgr0; else echo "Port scan of $checkdomain port 80 failed." fi } function pingnet { #Google has the most reliable host name. Feel free to change it. tput setaf 6; echo "Pinging $checkdomain to check for internet connection." && echo; tput sgr0; ping $checkdomain -c 4 if [ $? -eq 0 ] then tput setaf 2; echo && echo "$checkdomain pingable. Internet connection is most probably available."&& echo ; tput sgr0; #Insert any command you like here else echo && echo "Could not establish internet connection. Something may be wrong here." >&2 #Insert any command you like here # exit 1 fi } function pingdns { #Grab first DNS server from /etc/resolv.conf tput setaf 6; echo "Pinging first DNS server in resolv.conf ($checkdns) to check name resolution" && echo; tput sgr0; ping $checkdns -c 4 if [ $? -eq 0 ] then tput setaf 6; echo && echo "$checkdns pingable. Proceeding with domain check."; tput sgr0; #Insert any command you like here else echo && echo "Could not establish internet connection to DNS. Something may be wrong here." >&2 #Insert any command you like here # exit 1 fi } function httpreq { tput setaf 6; echo && echo "Checking for HTTP Connectivity"; tput sgr0; case "$(curl -s --max-time 2 -I $checkdomain | sed 's/^[^ ]* *\([0-9]\).*/\1/; 1q')" in [23]) tput setaf 2; echo "HTTP connectivity is up"; tput sgr0;; 5) echo "The web proxy won't let us through";exit 1;; *)echo "Something is wrong with HTTP connections. Go check it."; exit 1;; esac # exit 0 } #Ping gateway first to verify connectivity with LAN tput setaf 6; echo "Pinging gateway ($GW) to check for LAN connectivity" && echo; tput sgr0; if [ "$GW" = "" ]; then tput setaf 1;echo "There is no gateway. Probably disconnected..."; tput sgr0; # exit 1 fi ping $GW -c 4 if [ $? -eq 0 ] then tput setaf 6; echo && echo "LAN Gateway pingable. Proceeding with internet connectivity check."; tput sgr0; pingdns pingnet portscan httpreq exit 0 else echo && echo "Something is wrong with LAN (Gateway unreachable)" pingdns pingnet portscan httpreq #Insert any command you like here # exit 1 fi 

в Интернете есть много IP-адресов, легкий подход – пинг некоторых из них

  if ping -c 4 google.com ; then OK ; else KO ; fi if ping -c 4 facebook.com ; then OK ; else KO ; fi if ping -c 4 nsa.gov ; then OK ; else KO ; fi # <- this one might not reply 

более полным ответом может быть получение страниц с помощью wget

  wget google.com -o google.txt if parse google.txt ; then OK ; else KO ; fi 

где

  • parse – это программа, которую вы пишете, чтобы гарантировать, что google.txt не является (слишком старой) кешированной версией google.com
  • Как включить защиту от температуры процессора
  • Получение пустых данных при чтении текстового файла и отправка данных чтения в url cURL в linux
  • Как убить процесс, запущенный как демон?
  • Обертка Bash, которая будет форматировать вывод другой программы
  • ИЛИ в `expr match`
  • В командной строке я могу перенаправить вывод в файл WITHOUT>, >> или | операторы?
  • Запрос ввода пользователя при чтении файла по строкам
  • Как изменить сортировку результата из grep -rc
  • Найти файлы, созданные за определенное время после или до создания определенного файла
  • Запретить использование определенных команд
  • Записать вывод оболочки в документ MS Word
  • Interesting Posts

    синхронизировать или асинхронно для массового дублирования USB?

    Установлен ли Grub для всех MBR массива RAID по умолчанию установщиком Debian?

    Переопределение флагов udchcp, используемых ifup в BusyBox

    Как я мог перевернуть содержимое двоичного файла с помощью команд bash

    Простая функция обертки awk или псевдоним

    gunzip несколько сжатых файлов в другой каталог, не удаляя файлы .gz

    термальные нагрузки IP из текстового файла

    Добавить данные в файл, но не из содержимого? (стеганография)

    USB LABEL на другом языке

    Как предотвратить разделение слов, не предотвращая удаление пустой строки?

    Какова цель кажущихся непригодными для памяти сопоставлений в Linux?

    X.org работает без сокета в chroot?

    Возможно ли, что приложения KDE под управлением Gnome могут использовать информацию о приложениях Gnome?

    Как перенаправить stdout и stderr в разные файлы

    Диспетчер окон Windows 8 для Linux

    Linux и Unix - лучшая ОС в мире.