Як перевірити доступ до Інтернету за допомогою bash-скрипта в linux?

In my school, the internet is not available(every night after 23:0 the school will kill the internet, to put us in bed >..<), then the ping will never stop, though I have used the parameter ping -w1 ....

Тобто, коли я використовую: ping -q -w1 -c1 8.8.8.8 , щоб перевірити, чи є інтернет вгору/вниз, він буде там без будь-якого виводу і не вийде, так само, як я використовую один код cat .

Чи можете ви зрозуміти моє запитання? Я не знаю, чому це так, але я думаю, що проблема пов'язана з школою-інтернет-службою . Будь-яка пропозиція? (Я думаю, що wget може бути гарною альтернативою, але як використовувати?)

15
це може допомогти stackoverflow.com/questions/929368/…
додано Автор Sagar Rakshe, джерело

8 Відповіді

Використання wget:

#!/bin/bash

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
        echo "Online"
else
        echo "Offline"
fi
33
додано
Ви дійсно повинні використовувати параметр --spider , оскільки він буде надсилати HTTP-запит HEAD , а не HTTP-запит GET . Тепер у цьому випадку ви перевіряєте google.com, яка є досить легкою сторінкою, тому вона може бути нормальною. Але, як правило, ви повинні використовувати запит HEAD , якщо ви просто хочете перевірити, чи є щось доступне без його фактичного завантаження. Я відповів відповідним чином.
додано Автор peterh, джерело
Особисто я розширюю цю схему, зробивши цей wget -q --tries = 10 --timeout = 20 -O - http://google.com>/dev/null . Це викидає вихідні дані, що означає, що файли не залишаються валятися, і немає ніяких проблем з правами на запис.
додано Автор Andrew Ferrier, джерело
Вона добре працює. Велике спасибі! У моїй старої версії відсутній --tries , тому він не працює.
додано Автор wenlibin02, джерело

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

nc -z 8.8.8.8 53

Це виведе "Підключення до 8.8.8.8 порт 53 [tcp/домен] вдалося!" і повертає значення 0, якщо хтось слухає.

Якщо ви хочете використовувати його в сценарії оболонки:

nc -z 8.8.8.8 53  >/dev/null 2>&1
online=$?
if [ $online -eq 0 ]; then
    echo "Online"
else
    echo "Offline"
fi
13
додано
Це найшвидший підхід, він пінгсує сервер DNS замість отримання даних веб-сайту Google. пальці вгору.
додано Автор Yoni, джерело

Скористайтеся параметром timeout -t :

ping -q -t 5 -w1 -c1 8.8.8.8 t
2
додано
одна проблема в цьому рішенні полягає в тому, що деякі мережі можуть блокувати вихідні повідомлення (мої об'єднання мали відомий запис). це не здається бути у випадку з OP, хоча.
додано Автор umläute, джерело
@umlaeute, у цьому випадку ви можете використовувати wget http://google.com або навіть (краще та простіше) curl
додано Автор Eddy_Em, джерело

Install fping: > less problem then ping.

fping google.com | grep alive

використовувати, наприклад:

#!/bin/bash

itest=$(fping google.com | grep alive)

while [ "$itest" == "" ] 
        do
        sleep 5
        itest=$(fping google.com | grep alive)
done
echo now online
2
додано
#!/bin/bash

INTERNET_STATUS="UNKNOWN"
TIMESTAMP=`date +%s`
while [ 1 ]
 do
    ping -c 1 -W 0.7 8.8.4.4 > /dev/null 2>&1
    if [ $? -eq 0 ] ; then
        if [ "$INTERNET_STATUS" != "UP" ]; then
            echo "UP   `date +%Y-%m-%dT%H:%M:%s%Z` $((`date +%s`-$TIMESTAMP))";
            INTERNET_STATUS="UP"
        fi
    else
        if [ "$INTERNET_STATUS" = "UP" ]; then
            echo "DOWN `date +%Y-%m-%dT%H:%M:%s%Z` $((`date +%s`-$TIMESTAMP))";
            INTERNET_STATUS="DOWN"
        fi
    fi
    sleep 1
 done;

вихід буде вироблятись як:

bash-3.2$ ./internet_check.sh
UP   2016-05-10T23:23:06BST 4
DOWN 2016-05-10T23:23:25BST 19
UP   2016-05-10T23:23:32BST 7

число в кінці рядка показує тривалість попереднього стану, тобто 19 вгору, 7 секунд вниз

2
додано
Ласкаво просимо до переповнення стека! Хоча цей код може відповісти на запитання, краще включити контекст , пояснивши як він працює, і коли його використовувати. Відповіді лише на коди не є корисними в довгостроковій перспективі.
додано Автор Benjamin W., джерело

Using the example above I wrote this script to log the state of your connection: https://gist.github.com/cganterh/ffc2fffa8263857cbece

Збережіть наступний код у файлі name.sh .

#!/bin/bash

while true
do
    wget -q --tries=10 --timeout=20 -O - http://google.com > /dev/null
    if [[ $? -eq 0 ]]; then
        echo $(date) "1" | tee -a log.csv
    else
        echo $(date) "0" | tee -a log.csv
    fi
    sleep 5
done
1
додано

Без wget

#!/bin/bash

echo -e "GET http://google.com HTTP/1.0\n\n" | nc google.com 80 > /dev/null 2>&1

if [ $? -eq 0 ]; then
    echo "Online"
else
    echo "Offline"
fi

Насолоджуйтесь;)

1
додано
Так, це спрацювало! Дякую.
додано Автор wenlibin02, джерело

Надійний старий ping у окремому сценарії bash:

#!/bin/bash
ipaddr='8.8.8.8' # Google's public DNS server
[[ -z `ping -c1 $ipaddr |& grep -o 'Network is unreachable'` ]] || exit 1
[[ -z `ping -c3 $ipaddr |& grep -o '100% packet loss'` ]] && exit 0 || exit 1

Покладіть це на окремий скрипт. Він оброблятиме різні ситуації в мережі як (1) не підключений до мережі, (2) підключений до мережі, але не має доступу до Інтернету (або принаймні Google) і (3) підключений до Інтернет.


Пізніше ви можете скористатися кодом виходу скрипта для перевірки підключення, наприклад,

~$ script-name && echo online || echo offline
0
додано