Как проверить интернет соединение с bash? - PullRequest
95 голосов
/ 30 мая 2009

Как проверить интернет-соединение без проверки связи с каким-либо веб-сайтом? Я имею в виду, что если есть связь, но сайт не работает? Есть ли проверка на связь с миром?

Ответы [ 19 ]

107 голосов
/ 08 ноября 2014

Без пинга

#!/bin/bash

wget -q --spider http://google.com

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

-q : режим тишины

- паук : не получить, просто проверить доступность страницы

$? : код возврата оболочки

0 : код оболочки "Все в порядке"

без 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
89 голосов
/ 31 мая 2009

Пингует ваш шлюз по умолчанию:

#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
25 голосов
/ 18 февраля 2013

Супер. Спасибо пользователю somedrew за сообщение здесь: https://bbs.archlinux.org/viewtopic.php?id=55485 2008-09-20 02: 09: 48

Поиск в / sys / class / net должен быть односторонним

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

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

#!/usr/bin/bash

# Test for network conection
for interface in $(ls /sys/class/net/ | grep -v lo);
do
  if [[ $(cat /sys/class/net/$interface/carrier) = 1 ]]; then OnLine=1; fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr; exit; fi

Примечание для новичков в bash: Последний оператор 'if' проверяет, если НЕ [!] Онлайн, и завершает работу, если это так. Смотрите man bash и ищите «Выражения могут быть объединены» для более подробной информации.

P.S. Я чувствую, что ping - не лучшая вещь для использования здесь, потому что она нацелена на проверку соединения с конкретным хостом НЕ проверять, есть ли соединение с сетью любого рода.

P.P.S. Вышеприведенная версия работает на Ubuntu 12.04. / Sys может не существовать на некоторых других дистрибутивах. Смотрите ниже:

Современные дистрибутивы Linux включают каталог / sys в качестве виртуальной файловой системы (sysfs, сравнимый с / proc, который является procfs), который хранит и позволяет изменять устройства, подключенные к системе, тогда как многие традиционные UNIX и Unix-подобные операционные системы используют / sys как символическую ссылку на исходное дерево ядра. [цитата нужна]

Из Википедии https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

21 голосов
/ 19 июня 2016

Работает как в MacOSX, так и в Linux:

#!/bin/bash

ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
7 голосов
/ 30 мая 2009

Ранее я писал сценарии, которые просто используют telnet для подключения к порту 80, а затем передают текст:

HTTP/1.0 GET /index.html

, за которыми следуют две последовательности CR / LF.

Если вы получаете какую-либо форму HTTP-ответа, вы можете предположить, что сайт работает.

7 голосов
/ 01 февраля 2018

В верхнем ответе пропущен тот факт, что вы можете иметь совершенно стабильное соединение со своим шлюзом по умолчанию, но это не означает, что вы действительно можете что-то достичь в Интернете. ОП спрашивает, как он / она может проверить связь с миром. Поэтому я предлагаю изменить верхний ответ, изменив IP-адрес шлюза на известный IP-адрес (x.y.z.w), который находится за пределами вашей локальной сети.

Таким образом, ответ будет:

ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error

Также удаляются нежелательные галочки для подстановки команд [1] .

Если вы просто хотите убедиться, что вы подключены к миру, прежде чем выполнять какой-либо код, вы также можете использовать:

if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
    # more code
fi
5 голосов
/ 13 декабря 2017

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

$ curl -Is http://www.google.com | head -1 HTTP/1.1 200 OK

Код состояния «200 OK» означает, что запрос успешно выполнен и веб-сайт доступен.

4 голосов
/ 19 ноября 2017

убедитесь, что ваша сеть разрешает входящий и исходящий трафик TCP, тогда вы можете вернуть свой общедоступный IP-адрес с помощью следующей команды

curl ifconfig.co
4 голосов
/ 31 мая 2009

Если ваш локальный сервер имен не работает,

ping 4.2.2.1

- это легко запоминающийся постоянно работающий IP (на самом деле это даже сервер имен).

3 голосов
/ 11 октября 2017

кратчайший путь: fping 4.2.2.1 => "4.2.2.1 жив"

Я предпочитаю это, поскольку это быстрее и менее многословно, чем ping, недостатком является то, что вам придется установить его.

Вы можете использовать любой общедоступный DNS , а не определенный веб-сайт.

fping -q google.com && echo "do something because you're connected!"

-q возвращает код выхода, поэтому я просто показываю пример запуска чего-то, что вы в сети.

для установки на Mac: brew install fping; на Ubuntu: sudo apt-get install fping

...