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

Есть ли простой способ проверить интернет-соединение с консоли? Я пытаюсь поиграться в сценарии оболочки. Мне кажется, одна идея состоит в том, чтобы 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 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 минут вместо каждой минуты). Что ты думаешь?

31
задан 9 March 2018 в 09:48

11 ответов

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

Во-первых, доступно несколько хороших онлайн-сервисов мониторинга. Чтобы выбрать один, 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

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

0
ответ дан 9 March 2018 в 09:48

Я только что использовал

nm-online

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

0
ответ дан 9 March 2018 в 09:48

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

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
ответ дан 9 March 2018 в 09:48

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

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 в соответствии с вашими потребностями.

0
ответ дан 9 March 2018 в 09:48

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

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

По результатам (отрывок):

1 #System is connected to internet

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

0
ответ дан 9 March 2018 в 09:48

Проверка работоспособности интернета не так тривиальна. 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;
0
ответ дан 9 March 2018 в 09:48

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

  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
ответ дан 9 March 2018 в 09:48

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

echo $(nm-online) $? connection problems
0
ответ дан 9 March 2018 в 09:48

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

0
ответ дан 9 March 2018 в 09:48

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

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
0
ответ дан 9 March 2018 в 09:48

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

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

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

Этот скрипт необходимо добавить в Start-Up Programs и не требовать права 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
0
ответ дан 9 March 2018 в 09:48

Другие вопросы по тегам:

Похожие вопросы: