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

23

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

Изменить: Похоже, что может быть много факторов, которые можно индивидуально изучить, хорошо. Мое намерение на данный момент состоит в том, чтобы проверить, отключен ли мой блог. У меня есть настройка cron, чтобы проверять каждую минуту. Для этого я проверяю код ответа HTTP wget -spider на свой блог. Если он не 200, он уведомляет меня (я считаю, что это будет лучше, чем просто пинговать его, так как сайт может быть тяжелой нагрузкой и может быть тайм-аут или ответить очень поздно). Теперь вчера была проблема с моим Интернетом. LAN была подключена нормально, но я просто не мог получить доступ к сайту. Поэтому я продолжаю получать уведомления, так как сценарий не может найти 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

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

    
задан Ashfame 24.02.2011 в 21:42
источник

10 ответов

24

Проверка наличия определенного веб-сайта

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

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

wget --spider http://example.com
if [ "$?" != 0 ]; then
  echo "Website failed!" | mail -s "Website down" [email protected]
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 является ограничивающим числом пакетов ping для одного.

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

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

sudo ethtool eth0

От выхода (выдержка):

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

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

    
ответ дан Olli 24.02.2011 в 21:47
источник
6

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

if [[ "$(ping -c 1 8.8.8.8 | grep '100% packet loss' )" != "" ]]; then
    echo "Internet isn't present"
    exit 1
else
    echo "Internet is present"
    wget www.site.com
fi
    
ответ дан bais bais 14.10.2013 в 11:18
5

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

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

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

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

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

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

    
ответ дан BillThor 27.02.2011 в 17:20
3

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

nm-online

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

    
ответ дан ntsecrets 26.12.2016 в 00:03
3

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

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 21.04.2012 в 01:34
2

Проверка работы интернета

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

От выхода (выдержка):

1 #System is connected to internet

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

    
ответ дан Venkat Kotra 19.11.2012 в 01:46
0

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

echo $(nm-online) $? connection problems
    
ответ дан octius4u 23.04.2014 в 09:21
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 ;
        #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 18.11.2014 в 14:31
0

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

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

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

    #!/bin/bash
    
    PIDFILE=/var/run/testcon.pid
    
    . /lib/lsb/init-functions
    
    case "" 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" [email protected]
    
    #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" [email protected]
        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. Reboot

ответ дан Rafael 08.05.2014 в 02:00
0

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

Из результатов на askubuntu мне придется очистить пакет 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
    
ответ дан Antonio 04.03.2018 в 00:11