Як я можу перевірити підключення до Інтернету в консолі?


31

Чи є простий спосіб перевірити підключення до Інтернету з консолі? Я намагаюся грати навколо в сценарії оболонки. Мені здається, одна ідея - перевірити код відповіді HTTP, щоб інтерпретувати, чи працює інтернет-з'єднання нормально. Але я думаю, що повинен бути простий спосіб без необхідності перевірки сайту, який ніколи не виходить з ладу;)wget --spider http://www.google.co.in/

Редагувати: Схоже, може бути безліч факторів, які можна оглянути окремо, добре. На даний момент я маю намір перевірити, чи не працює мій блог. У мене є інсталяційний крон, щоб перевіряти його щохвилини. Для цього я перевіряю код відповіді 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), але не повинно давати помилкових позитивних результатів. Правильно? Крім того, як я можу щодня рандомізувати пінг на інший веб-сайт, наприклад, у facebook, google, yahoo тощо. Також (я намагався уникати будь-яких вводу-виводу), я можу написати в журнал файл, за допомогою якого я можу перевірити кількість перевірок простоїв і потім пропустіть подальші перевірки, поки сайт не працює або не спричинить довші перевірки (10 хв замість кожні хв). Як ти гадаєш?


"Підключення до Інтернету" не має чіткого визначення, ви можете перевірити підключення лише до певної послуги або набору послуг. Якщо ви маєте на увазі підключення до локальної мережі, хорошим варіантом буде пінг мережевого шлюзу.
Жоао Пінто

Простіше кажучи, я б визначив підключення до Інтернету, якщо ви можете отримати доступ до Інтернету. Проблема може бути між собою. Мені просто потрібно розмежувати, чи нормально це працює чи є проблема із набору проблем, які можуть бути відповідальними. Сподіваюся, я дав зрозуміти. :)
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- обмеження кількості пакетів ping до одного.

Ви можете зіткнутися з проблемами з деякими загальнодоступними війнами, коли є шлюз для входу, який перенаправляє всі pings та HTTP-запити. Якщо це так, ви можете отримати відповіді на пінг та коди статусу HTTP без помилок, навіть коли ви не можете отримати доступ до будь-яких інших сайтів.

Якщо ви хочете перевірити стан кабелю, можете скористатися

sudo ethtool eth0

З виводу (уривок):

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

Однак це не говорить про те, чи справді ви маєте підключення чи ні, а лише чи підключений кабель і щось на іншому кінці.


Це повністю для мого налаштування, що працює над Ethernet Завжди ON. Але раді, що ви вказали, як це не спрацює правильно в деяких випадках. Також я вважаю, що пінггінг буде швидше, ніж wget. Як ти гадаєш? і якщо я перевіряю код статусу 200 в будь-якому місці, я вважаю за краще його просто ввести. Правильно? чи є щось, що я повинен знати?
Ashfame

2
пінг швидше і краще, тому що інший кінець не буде злий на вас. ping досить безпечний, але навіть це не гарантує, що ви можете відкривати веб-сторінки. Також можливо, що брандмауер блокує ping, але дозволяє HTTP-запити.
Оллі,

1
Pinging добре відомого сервера dns, як-от 4.2.2.2, також корисний у випадку, якщо ви маєте мережеве підключення, але порушений dns.
djeikyb

Для перевірки DNS, звичайно, можна використовувати host(запит DNS). Це також дуже швидко.
Оллі

Дякую за вашу відповідь @Olli & @djeikyb Я оновив питання, будь ласка, подивіться
Ashfame

7

Я використовую цей метод ...

if [["$ (ping -c 1 8.8.8.8 | grep '100% втрати пакету')"! = ""]]; потім
    echo "Інтернету немає"
    вихід 1
ще
    ехо "Інтернет присутній"
    wget www.site.com
фі

Я отримав різні результати для ping -c 1 8.8.8.8та ping -c 1 www.google.com. Як у тому, що?
MERose

2
Зауважте, що це стане невдалим у Китаї та інших країнах, які блокують Google
Том Дж. Ноуелл

7

Я просто використовував

nm-online

який призупиняється, поки мережевий зв’язок не з’явиться у мережі. Добре працювали. Ви можете робити і інші речі з ним.


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.


Дякуємо за вашу пропозицію! Чи охоплює мій сценарій основну вимогу перевірки та оповіщення мене, коли мій сайт не працює? І буде тихо, якщо буде якась проблема з підключенням до Інтернету
Ashfame

Схоже, ваш сценарій буде робити те, що ви хочете. Ви можете включити команду wget в оператор if як if ! wget --spider http:///example.com; then.
BillThor

ти маєш на увазі, що wget завжди повертає 1 за 200 код відповіді HTTP?
Ashfame

Я маю на увазі тест [ $? != 0 ]те саме, що і тест ! command. wget задокументовано, щоб повернути 0 на успіх, а не 0 на провал. The if поводиться однаково, коли б ви його не кодували. Якщо wget поверне помилку у відповіді 200, тест не вдасться в будь-якому випадку, коли ви його напишите. Те саме, якщо він повертає 0 для коду відповіді, окрім 200.
BillThor,

Спасибі! Це зробило б сценарій меншим та легким для розуміння.
Ashfame

4

Це серптер оболонки, який я використовую для тестування на підключення до Інтернету:

сигнал.ш.

#! /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 -qзамістьegrep ... > /dev/null
wjandrea

Чому сценарій називає себе замість того, щоб просто використовувати whileцикл?
wjandrea

О, чекайте, він не називає себе. Він викликає скрипт, викликаний alarm.shу wd, тому якщо ви викликаєте цей скрипт з іншого dir, він або помилиться, або якщо alarm.shв wd є скрипт, який буде викликаний натомість. Так що це погана практика. Ви можете використовувати "$0"замість цього, але whileцикл буде краще.
wjandrea

"Чому скрипт називає себе замість того, щоб просто використовувати цикл" час "?
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 ]]
шість

@Six nmcli -f STATE -t nmдобре, що це незалежність від веб-сайтів!
Сила Водолія

1
Зверніть увагу на це, nm-toolі nmcliви скажете лише про те, чи не підключений ви до локального мережі, тобто ви підключені до домашнього wifi / 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

як це працює?
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;

0

Я шукав сценарій, який би постійно перевіряв моє підключення до Інтернету, який би запускався щоразу, коли мій сервер був запущений, і я зробив це:

  1. Спочатку встановіть fping

    apt-get install fping
    
  2. Створіть сценарій init у папці /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 із наступним вмістом (я назвав його тестунгом)

    #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. Тим часом я також шукаю остаточне рішення.

З результатів на 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.