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

31

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

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

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

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

#!/bin/bash

# Sending the output of the wget in a variable and not what wget fetches
RESULT=`wget --spider http://blog.ashfame.com 2>&1`
FLAG=0

# Traverse the string considering it as an array of words
for x in $RESULT; do
    if [ "$x" = '200' ]; then
        FLAG=1 # This means all good
    fi
done

if [ $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  
fi

exit

Таким образом, мне нужно проверять подключение к Интернету только там, где есть проблема с моим кодом ответа блога. Это немного тяжело (так как я не использую пинг), но не должно давать никаких ложных срабатываний. Правильно? Кроме того, как я могу случайным образом пинговать на другой сайт каждый раз, например, Facebook, Google, Yahoo и т. Д. Кроме того (я пытался избежать ввода-вывода) я могу записать в файл журнала, с помощью которого я могу проверить количество проверок простоя и затем пропустите дальнейшие проверки, пока сайт не выйдет из строя или вызовите более длительные проверки (10 минут вместо каждой минуты). Что вы думаете?

Ashfame
источник
«Подключение к Интернету» не имеет четкого определения, вы можете только проверить подключение к определенной службе или набору служб. Если вы имеете в виду подключение по локальной сети, хорошим вариантом будет пинговать ваш сетевой шлюз.
Жоау Пинту
С точки зрения непрофессионала, я бы определил подключение к Интернету, если вы можете получить доступ к Интернету. Проблема может быть чем-то промежуточным. Мне просто нужно различать, работает ли он нормально или есть проблема из множества проблем, которые могут быть ответственными. Я надеюсь, что я ясно дал понять. :)
Ashfame

Ответы:

29

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

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

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

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

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

Проверка работоспособности интернета

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

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

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

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

sudo ethtool eth0

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

Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
Link detected: yes

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

Олли
источник
Это полностью для моей установки, работающей на Always-ON Ethernet. Но рад, что вы указали, как это не будет работать правильно в некоторых случаях. Также я считаю, что пинг будет быстрее, чем wget. Что вы думаете? и если я где-нибудь проверяю код состояния 200, я бы скорее всего пинговал его. Правильно? или есть что-то, что я должен знать?
Ashfame
2
пинг быстрее и лучше, потому что другой конец не будет сердиться на вас. ping довольно безопасен, но даже это не гарантирует, что вы сможете открывать веб-страницы. Также возможно, что брандмауэр блокирует пинг, но разрешает HTTP-запросы.
Олли
1
Проверка связи с известным DNS-сервером, таким как 4.2.2.2, также полезна, если у вас есть сетевое соединение, но у вас не работает DNS.
djeikyb
Для проверки DNS вы можете, конечно, использовать host(DNS запрос). Это тоже очень быстро.
Олли
Спасибо за ваш ответ @Olli & @djeikyb Я обновил вопрос, пожалуйста, посмотрите
Ashfame
7

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

if [["$ (ping -c 1 8.8.8.8 | grep '100% потери пакетов')"! = ""]]; тогда
    эхо "Интернета нет"
    выход 1
еще
    эхо "интернет присутствует"
    Wget www.site.com
фи
Байс Байс
источник
Я получил разные результаты для ping -c 1 8.8.8.8и ping -c 1 www.google.com. Как так?
MERose
2
Обратите внимание, что это не удастся в Китае и других странах, которые блокируют Google
Том Дж. Новелл
7

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

nm-online

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

ntsecrets
источник
6

Проверка того, работает ли сайт, обычно выполняется с помощью такого инструмента мониторинга, как 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.

BillThor
источник
Спасибо за ваше предложение! Мой сценарий покрывает основное требование проверки и оповещения меня, когда мой сайт не работает? И будет тихо, если будет какая-то проблема с подключением к Интернету
Ashfame
Похоже, ваш скрипт будет делать то, что вы хотите. Вы можете включить команду wget в оператор if as if ! wget --spider http:///example.com; then.
BillThor
Вы имеете в виду, что wget всегда возвращает 1 для 200 HTTP-кода ответа?
Ashfame
Я имею в виду, что тест [ $? != 0 ]такой же, как тест ! command. Задокументировано, что wget возвращает 0 в случае успеха, а не 0 в случае неудачи. If ведет себя одинаково, каким бы способом вы его ни кодировали. Если wget вернет ошибку 200, ответ провалится в любом случае. То же самое, если он возвращает 0 для кода ответа, отличного от 200.
BillThor
Благодарность! Это сделало бы сценарий меньше и легче для понимания.
Ashfame
4

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

alarm.sh

#! /bin/bash

if curl --silent --head http://www.google.com/ |
    egrep "20[0-9] Found|30[0-9] Found" >/dev/null
then
    echo Internet status: OK
else
    echo Internet status: ERROR
    mpg321 alarm.mp3 &> /dev/null
fi
sleep 60
clear

./alarm.sh

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

sudo apt-get install curl mpg321

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

01BTC10
источник
Это прекрасно работает, даже если пользователь находится за захваченным порталом и не вошел в систему.
Ашхар Хасан
Вы можете использовать egrep -qвместоegrep ... > /dev/null
wjandrea
Почему скрипт вызывает сам себя, а не просто использует whileцикл?
wjandrea
Ой, подождите, это не называет себя. Он вызывает скрипт, вызываемый alarm.shв wd, поэтому, если вы вызовете этот скрипт из другого каталога, это приведет либо к ошибке, либо, если alarm.shв wd есть скрипт , который будет вызываться, он вызовет его вместо этого. Так что это плохая практика. Вы можете использовать "$0"вместо этого, но whileцикл будет лучше.
wjandrea
«Почему скрипт вызывает сам себя, а не просто использует цикл while?»: Потому что я был новичком, когда писал эту статью, и да, этот скрипт вызывал сам себя.
01BTC10
2

Проверка работоспособности интернета

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

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

1 #System is connected to internet

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

Венкат Котра
источник
2
nm-toolбыл удален в Ubuntu 15.04+, но вы можете использовать nmcliвместо этого. Например[[ $(nmcli -f STATE -t g) = connected ]]
Шесть
@ Шесть nmcli -f STATE -t nmхорошо, это независимость от веб-сайтов!
Водолей Сила
1
Обратите внимание, что nm-toolи nmcliскажет вам только, подключены ли вы к локальной сети или нет, то есть подключены ли вы к домашней сети Wi-Fi / Ethernet. Он не скажет вам, можете ли вы достичь чего-либо за пределами вашей локальной сети, например, Интернета.
Сергей Колодяжный
1

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

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

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

Авраам Эрнандес
источник
0

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

echo $(nm-online) $? connection problems
octius4u
источник
как это работает?
wjandrea
Это просто проверка состояния (один символ) nm-onlineкоманды ... Она вернет 0, если все в порядке. Обычный во всех UNIXснарядах.
Антонио
0

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

Так как мое интернет-соединение нестабильно, я создал этот сценарий ( на основе этого ), который издает мягкий аккорд, чтобы позвонить мне, а также использует уведомление Ubuntu, когда интернет-соединение возвращается:

#!/bin/bash

hash 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.site

function 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;
done

exit 0;
pabloab
источник
0

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

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

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

    #!/bin/bash
    
    PIDFILE=/var/run/testcon.pid
    
    . /lib/lsb/init-functions
    
    case "$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
        ;;
    esac
    
    exit 0
    
  3. Создайте скрипт в папке /etc/init.d со следующим содержимым (я назвал его testcond)

    #echo Computer starting or testing daemon init
    while [ "$itest" == "" ] 
    do
        #wait 5 seconds 
        sleep 5
        itest=$(fping 8.8.8.8 | grep alive)
    done
    date | mail -s "Server is up and Internet is online" your_email@gmail.com
    
    #loop forever
    while [ "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 defaults
    sudo update-rc.d testcon enable
    
  5. перезагружать

Рафаэль
источник
0

Я столкнулся со случайным сбросом подключений Wi-Fi Broadcom BCM94331CD микросхемой. Я разработал следующий скрипт bash (бесконечный цикл), проверяющий каждую секунду, работает ли подключение к Интернету через Wi-Fi. Другая из командной строки , предложенная здесь будет ждать по крайней мере 5 до 10 секунд до закрытия со статусом т.е. ping. В то же время я ищу окончательное решение, а также.

По результатам аскубунту, мне придется очищать bcmwl-kernel-sourceпакет по мере использования firmware-b43-installerиb43-fwcutter .

Спасибо всем за их предложения (выше).

Этот сценарий необходимо добавить в автозагрузку программ, и ему также не нужны super userпривилегии для запуска.

#!/bin/bash
#

# Check if Wi-Fi is disabled e.g. 'out of range'
# If so quickly re-enable Wi-Fi
# Due to a problem with Broadcom proprietary driver in package firmware-b43-installer

# Script is part of Start-Up programs
# Stored in /usr/local/bin/
# Infinite loop checking every second if Wi-Fi is up and running

while true; do
  # https://askubuntu.com/questions/27954/how-can-i-check-internet-connectivity-in-a-console
  if [[ $(nmcli -f STATE -t g) != 'connected' ]]; then
    # Disable and Re-Enable Wi-Fi as the Wi-Fi is now 'out of range' (disconnected)
    nmcli radio wifi off
    nmcli radio wifi on
  fi
  sleep 1
done
Антонио
источник