Как я могу проверить подключение к Интернету в консоли?

Есть ли простой способ проверить подключение к Интернету с консоли? Я пытаюсь поиграть в сценарии оболочки.Одна идея, которую я, кажется, должен wget --spider http://www.google.co.in/ и проверьте код ответа HTTP, чтобы определить, работает ли подключение к Интернету нормально. Но я думаю, что должен быть простой способ без необходимости проверять сайт, который никогда не выходит из строя ;)

Редактировать: Похоже, что может быть много факторов, которые можно рассмотреть индивидуально, и это хорошо. Мое намерение на данный момент состоит в том, чтобы проверить, не работает ли мой блог. Я настроил cron, чтобы проверять его каждую минуту.Для этого я проверяю код HTTP-ответа wget --spider на свой блог. Если его не 200, он уведомляет меня (я считаю, что это будет лучше, чем просто пинговать его, так как сайт может находиться под большой нагрузкой и может быть тайм-аут или отвечать очень поздно). Итак, вчера у меня возникла какая-то проблема с Интернетом. Локальная сеть была подключена нормально, но просто я не мог получить доступ ни к одному сайту. Поэтому я продолжаю получать уведомления, поскольку скрипт не смог найти 200 в ответе wget. Теперь я хочу убедиться, что он отображает мне уведомление, когда у меня есть подключение к Интернету.

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

Вот мой скрипт для постоянной проверки времени простоя моего блога:

#!/bin/bash# Sending the output of the wget in a variable and not what wget fetchesRESULT=`wget --spider http://blog.ashfame.com 2>&1`FLAG=0# Traverse the string considering it as an array of wordsfor x in $RESULT; do    if [ "$x" = '200' ]; then        FLAG=1 # This means all good    fidoneif [ $FLAG -eq '0' ]; then    # A good point is to check if the internet is working or not        # Check if we have internet connectivity by some other site        RESULT=`wget --spider http://www.facebook.com 2>&1`        for x in $RESULT; do            if [ "$x" = '200' ]; then                FLAG=1 # This means we do have internet connectivity and the blog is actually down            fi        done    if [ $FLAG -eq '1' ]; then        DISPLAY=:0 notify-send -t 2000 -i /home/ashfame/Dropbox/Ubuntu/icons/network-idle.png "Downtime Alert!" "http://blog.ashfame.com/ is down."             fi  fiexit

Таким образом, мне нужно проверять подключение к Интернету только в тех случаях, когда есть проблема с кодом ответа моего блога. Это немного тяжеловато (так как я не использую ping), но не должно давать никаких ложных срабатываний. Верно? Кроме того, как я могу каждый раз рандомизировать пинг на другой сайт, например, facebook, google, yahoo и т.д. Кроме того (я пытался избежать каких-либо операций ввода-вывода), я могу записать в файл журнала, с помощью которого я могу проверить количество проверок времени простоя, а затем пропустить дальнейшие проверки, пока сайт не выйдет из строя или не вызовет более длительные проверки (10 минут вместо каждой минуты). Что вы думаете?

Проверка того, работает ли конкретный веб-сайт

Во-первых, доступно множество хороших онлайн-сервисов мониторинга. Чтобы выбрать один из них, Pingdom включает бесплатную учетную запись для мониторинга одной цели. (Отказ от ответственности: Я нет каким-либо образом связан с Pingdom).

Во-вторых, используя wget --spider для вашего собственного сценария это хорошая идея. Вы получите несколько ложных срабатываний, когда ваш компьютер не работает или когда ваш DNS-сервер не работает. Проверка возвращаемого кода - это простой способ реализовать это:

wget --spider --quiet http://example.comif [ "$?" != 0 ]; then  echo "Website failed!" | mail -s "Website down" your_email@provider.tldfi

И снова в этом подходе есть недостатки. Если ваш провайдер кэшировал вашу DNS-запись, но DNS-сервер не работает, другие пользователи не могут получить доступ к вашему сайту, даже если мониторинг показывает, что все в порядке. Вы можете написать короткое обходное решение с помощью host, например host example.com <your dns server IP>. Это вернет ошибку, если DNS-сервер не отвечает, даже если OpenDNS или DNS-сервер вашего собственного провайдера работает нормально.

Проверка того, работает ли Интернет

На самом деле не существует простого способа справиться с этим в каждом конкретном случае.

Вы можете, например, запустить ping -c1 на нескольких хорошо известных сайтах (например www.google.com , facebook.com и пинг.фунет.fi) и проверьте коды возврата, чтобы определить, доступен ли какой-либо пункт назначения. Вы можете автоматически проверить код возврата, используя переменную $?. Параметр -c1 ограничивает количество пакетов ping одним.

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

Если вы хотите проверить состояние кабеля, вы можете использовать

sudo ethtool eth0

Из выходных данных (выдержка):

Speed: 1000Mb/sDuplex: FullPort: Twisted PairLink detected: yes

Однако это не говорит о том, действительно ли у вас есть подключение или нет, просто подключен ли кабель и что-то находится на другом конце.

Я просто использовал

nm-online

который приостанавливается до тех пор, пока диспетчер сети не установит сетевое подключение. Сработало хорошо. Вы можете делать с ним и другие вещи.

Я использую этот метод...

если [[ "$(ping -c 1 8.8.8.8 | grep '100% потеря пакетов' )" != "" ]]; затем echo "Интернета нет" выходит из 1else echo "Интернет присутствует" wget www.site.comfi

Проверка работоспособности сайта обычно выполняется с помощью такого инструмента мониторинга, как nagios. Это позволит постоянно следить за сайтом и может уведомлять вас о перебоях в работе.

При проверке, подключен ли Интернет из командной строки, я выполняю несколько шагов:

  • Проверьте, работает ли Интернет ping google.com (проверяет DNS и известный доступный сайт).
  • Проверьте работоспособность веб-сайта. wget или w3m чтобы получить страницу.

Если Интернет не работает, диагностируйте его снаружи.

  • Проверьте, доступен ли пинг шлюза. (Проверьте ifconfig на наличие адреса шлюза.)
  • Проверьте, что DNS-серверы доступны для проверки. (Проверьте /etc/resolv.conf на наличие адресов.)
  • Проверьте, не блокирует ли брандмауэр. (Проверьте /var/log/syslog, когда я регистрирую блоки.)

Если интернет включен, но сайт не работает, проверьте с w3m http://isup.me/example.com заменяющий example.com с сайтом, который появляется внизу. Используйте wget, lynx или любой другой доступный вам браузер командной строки, если у вас не установлен браузер w3m.

Это srcript оболочки, который я использую для проверки подключения к Интернету:

alarm.sh

#! /bin/bashif curl --silent --head http://www.google.com/ |    egrep "20[0-9] Found|30[0-9] Found" >/dev/nullthen    echo Internet status: OKelse    echo Internet status: ERROR    mpg321 alarm.mp3 &> /dev/nullfisleep 60clear./alarm.sh

Вам нужно будет установить curl и mpg321

sudo apt-get install curl mpg321

Вам понадобится звуковой файл .mp3, переименованный в alarm.mp3, в той же папке, если вы хотите использовать функцию звуковой сигнализации. Наконец, настройте URL-адрес веб-сайта и egrep в соответствии с вашими потребностями.

Я использую этот метод:

if curl -s --head  --request GET www.google.com | grep "200 OK" > /dev/null ; then    echo "Internet is present"else    echo "Internet isn't present"fi

Он попытается подключиться к известному веб-сайту, и если он сможет подключиться к нему, то мы будем считать, что есть Интернет.

Проверка того, работает ли Интернет

sudo nm-tool | grep "State: connected" | wc -l

Из выходных данных (выдержка):

1 #System is connected to internet

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

Мне нужна была помощь с тем же вопросом, и я получил свой ответ таким образом:

echo $(nm-online) $? connection problems

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

  1. Сначала установите fping

    apt-get install fping
  2. Создайте сценарий инициализации в папке /etc/init.d со следующим содержимым (я назвал его testcon)

    #!/bin/bashPIDFILE=/var/run/testcon.pid. /lib/lsb/init-functionscase "$1" in  start)        log_daemon_msg "Starting internet connection tester"        /etc/init.d/testcond &        echo $! > $PIDFILE        log_end_msg $?    ;;  stop)        log_daemon_msg "Stopping internet connection tester"        PID=$(cat $PIDFILE)        kill -9 "$PID"        log_end_msg $?    ;;  *)    echo "Usage: /etc/init.d/testcon {start|stop}"    exit 1    ;;esacexit 0
  3. Создайте скрипт в папке /etc/init.d со следующим содержимым (я назвал его testcond)

    #echo Computer starting or testing daemon initwhile [ "$itest" == "" ] do    #wait 5 seconds     sleep 5    itest=$(fping 8.8.8.8 | grep alive)donedate | mail -s "Server is up and Internet is online" your_email@gmail.com#loop foreverwhile [ "1" == "1" ] do    itest=$(fping 8.8.8.8 | grep alive)    #if internet is down    if [ "$itest" == "" ]     then        #echo Internet is down        #log time it was found down        current_time=$(date)        echo "Internet was found down @ $current_time" >> /mnt/data/Server/internet_log.txt        #loop until it is back        while [ "$itest" == "" ]         do            #wait 60 seconds             sleep 60            itest=$(fping 8.8.8.8 | grep alive) # test the internet        done        #when it is back        current_time=$(date)        echo "Internet is back        @ $current_time" >> /mnt/data/Server/internet_log.txt        body=$(tail -2 /mnt/data/Server/internet_log.txt)        echo "$body" | mail -s "Internet is back online" your_email@gmail.com    fi    #echo Internet is online    #wait 60 seconds    sleep 60        done
  4. Затем я запускаю приведенные ниже команды, чтобы добавить их в запуск:

    sudo update-rc.d testcon defaultssudo update-rc.d testcon enable
  5. Перезагрузить

Проверка того, работает ли Интернет, не так уж и тривиальна. ping - это ICMP, поэтому он может работать, даже если веб-прокси не работает. Нечто подобное происходит с DNS, если вы тестируете с IP-адресом.

Поскольку мое интернет-соединение нестабильно, я создал этот скрипт (основываясь на этом), который издает нежный звук аккорда, чтобы позвонить мне, а также использует Ubuntu notify при восстановлении подключения к Интернету:

#!/bin/bashhash play 2>&- || { echo >&2 "I require «play» but it's not installed. Try apt-get install sox. Aborting."; exit 1; }WGET="`which wget`"URL="http://www.google.com"delay=3;noConnectionMessage="No connection, trying again in $delay seconds...";connectionMessage="WE HAVE INTERNET! :) Trying again in $delay seconds...";echo "INTERNET TESTER: Type Ctrl+C to quit";rm --force /tmp/index.sitefunction playSound {    time=1;    # Time played    if [ `sox --version| grep -oP "v[0-9.]+" | sed "s/[v.]//g"` -lt 1431 ]; then    #analize sox version, if greater than v14.3.1 can use pluck        play -q -n synth $time sine;    else        play -q -n synth $time pluck $1;        #for i in G4 G4 G4 E4;do play -n synth 0.1 pluck $i repeat 2;done    # You can play with something like this also :) (first three notes from Beethoven 5th symphony)    fi}while [ 1 -eq 1 ]; do    $WGET -q --tries=10 --timeout=2 $URL -O /tmp/index.site &> /dev/null    if [ ! -s /tmp/index.site ];then        echo $noConnectionMessage;        #playSound E2        sleep 1;    else        #~ zenity --warning --text "ADDRESS is back"        notify-send -i "notification-network-wireless-full" "Connection state:" "$connectionMessage";        echo $connectionMessage;        playSound E3    fi    sleep $delay;doneexit 0;

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

С точки зрения непрофессионала, я бы определил подключение к Интернету, если вы можете получить доступ к Интернету. Проблема может быть в чем-то промежуточном. Мне просто нужно различать, работает ли он нормально или есть проблема из набора проблем, которые могут быть ответственными. Надеюсь, я ясно выразился. :slight_smile: