Как проверить доступ в Интернет с помощью bash script в linux?

В моей школе интернет недоступен (каждую ночь после 23: 0 школа убьет интернет, чтобы положить нас в постель > .. <), тогда пинг никогда не остановится, хотя я использовал параметр ping -w1 ....

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

Вы можете понять мой вопрос??? Я не знаю, почему это так, Но я думаю, что проблема связана с школьным интернет-сервисом. Любое предложение? (Я думаю, что wget может быть хорошей альтернативой, но как использовать?)

Ответы

Ответ 1

Использование wget:

#!/bin/bash

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
        echo "Online"
else
        echo "Offline"
fi

Ответ 2

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

nc -z 8.8.8.8 53

Появится сообщение "Connection to 8.8.8.8 port 53 [tcp/domain]". и вернуть значение 0, если кто-то прослушивает.

Если вы хотите использовать его в оболочке script:

nc -z 8.8.8.8 53  >/dev/null 2>&1
online=$?
if [ $online -eq 0 ]; then
    echo "Online"
else
    echo "Offline"
fi

Ответ 3

Используйте параметр таймаута -t:

ping -q -t 5 -w1 -c1 8.8.8.8 t

Ответ 4

Установить fping: > меньше проблем, чем 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

Ответ 5

#!/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;

вывод будет производить smth как:

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 секунд вниз

Ответ 6

Используя приведенный выше пример, я написал этот script для регистрации состояния вашего соединения: 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

Ответ 7

Без 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

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

Ответ 8

Надежный старый ping в отдельном bash script:

#!/bin/bash
ipaddr='8.8.8.8' # Google 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

Поместите это на отдельный script. Он будет обрабатывать различные сетевые ситуации, поскольку (1) не подключен к сети, (2) подключен к сети, но не может получить доступ к Интернету (или, по крайней мере, Google), и (3) подключен к сети интернет.


Вы можете позже использовать exit code для script для проверки возможности подключения, например

~$ script-name && echo online || echo offline