Как можно проверить интернет-соединение без проверки какого-либо веб-сайта? Я имею в виду, что, если есть соединение, но сайт не работает? Есть ли проверка связи с миром?
Как проверить подключение к Интернету с помощью bash?
Ответ 1
ping www.google.com
ping www.yahoo.com
ping www.facebook.com
ping www.stackoverflow.com
Сделайте это, и вы можете быть уверены:)
Ответ 2
Без пинга
#!/bin/bash
wget -q --spider http://google.com
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
-q: режим молчания
- spider: не получить, просто проверить доступность страницы
$?: код возврата оболочки
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
Ответ 3
Ping ваш шлюз по умолчанию:
#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
Ответ 4
Супер Спасибо пользователю somedrew за сообщение здесь: https://bbs.archlinux.org/viewtopic.php?id=55485 в 2008-09-20 02: 9:48
Включение/sys/class/net должно быть одним из способов
Здесь мой script для проверки сетевого подключения, отличного от цикла. Я использую ниже в другом script, который у меня есть для периодического тестирования, если мой сайт доступен. Если он НЕ доступен, всплывающее окно предупреждает меня о проблеме.
script ниже не позволяет мне получать всплывающие сообщения каждые пять минут, когда мой ноутбук не подключен к сети.
#!/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" проверяет, если NOT [!] онлайн, и завершает работу, если это так. См. 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
Ответ 5
Это работает как на MacOSX, так и на Linux:
#!/bin/bash
ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
Ответ 6
Я уже писал сценарии, чтобы просто использовать telnet для подключения к порту 80, а затем передать текст:
HTTP/1.0 GET /index.html
за которым следуют две последовательности CR/LF.
Если вы вернетесь к какой-либо форме ответа HTTP, вы обычно можете предположить, что сайт работает.
Ответ 7
В верхнем ответе пропущен тот факт, что вы можете иметь совершенно стабильное соединение со своим шлюзом по умолчанию, но это не означает, что вы действительно можете что-то достичь в Интернете. ОП спрашивает, как он/она может проверить связь с миром. Поэтому я предлагаю изменить верхний ответ, изменив IP-адрес шлюза на известный IP-адрес (xyzw), который находится за пределами вашей локальной сети.
Таким образом, ответ станет:
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
Ответ 8
Выполните следующую команду, чтобы проверить, работает ли веб-сайт и какое сообщение о состоянии показывает веб-сервер:
$ curl -Is http://www.google.com |
head -1 HTTP/1.1 200 OK
Код состояния "200 OK" означает, что запрос выполнен успешно и веб-сайт доступен.
Ответ 9
Если ваш локальный сервер имен не работает,
ping 4.2.2.1
- это простой для запоминания всегда IP-адрес (он фактически является сервером имен даже).
Ответ 10
убедитесь, что ваша сеть разрешает вход и выход TCP-трафика, затем вы можете вернуть свой публичный IP-адрес с помощью следующей команды
curl ifconfig.co
Ответ 11
кратчайший путь: fping 4.2.2.1
= > "4.2.2.1 жив"
Я предпочитаю это, поскольку это быстрее и менее подробный вывод, чем ping
, недостатком является то, что вам придется его установить.
вы можете использовать любой public dns, а не определенный веб-сайт.
fping -q google.com && echo "do something because you're connected!"
-q
возвращает код выхода, поэтому я просто показываю пример запуска чего-то, что вы в сети.
для установки на mac: brew install fping
; на ubuntu: sudo apt-get install fping
Ответ 12
Ответ с наибольшим количеством голосов не работает для MacOS, поэтому для тех, кто на Mac, я успешно проверил это:
GATEWAY='route -n get default | grep gateway'
if [ -z "$GATEWAY" ]
then
echo error
else
ping -q -t 1 -c 1 'echo $GATEWAY | cut -d ':' -f 2' > /dev/null && echo ok || echo error
fi
протестировано на MacOS High Sierra 10.12.6
Ответ 13
В Bash он использует сетевую оболочку через /dev/ { udp, tcp } / host / port:
if echo -n >/dev/tcp/8.8.8.8/53; then
echo 'Internet available.'
else
echo 'Offline.'
fi
Ответ 14
Ping был разработан, чтобы делать именно то, что вы хотите сделать. Однако, если сайт блокирует эхо-сигнал ICMP, вы всегда можете подключить telnet к порту 80 какого-либо сайта, wget или curl.
Ответ 15
Проверка страницы индекса Google - это еще один способ:
#!/bin/bash
WGET="/usr/bin/wget"
$WGET -q --tries=20 --timeout=10 http://www.google.com -O /tmp/google.idx &> /dev/null
if [ ! -s /tmp/google.idx ]
then
echo "Not Connected..!"
else
echo "Connected..!"
fi
Ответ 16
Аналогично @Jesse answer, эта опция может быть намного быстрее, чем любое решение с использованием ping
и, возможно, немного более эффективно, чем @Jesse answer.
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'
Explenation:
Эта команда использует find
с -exec
для запуска команды для всех файлов, не названных *lo*
в /sys/class/net/
. Это должны быть ссылки на каталоги, содержащие информацию о доступных сетевых интерфейсах на вашем компьютере.
Выполняемая команда представляет собой команду sh
, которая проверяет содержимое файла carrier
в этих каталогах. Значение $interface/carrier
имеет 3 значения - Цитата:
Кажется, есть три состояния:
- ./несущая не читается (например, когда интерфейс отключен в Network Manager).
- ./несущая содержит "1" (когда интерфейс активирован и подключен к сети WiFi).
- ./несущая содержит "0" (когда интерфейс активирован и не подключен к сети WiFi).
Первый вариант не учитывается в @Jesse answer. Командная строка sh
:
# Note: $0 == $interface
cat "$0"/carrier 2>&1
cat
используется для проверки содержимого carrier
и перенаправляет весь вывод на стандартный вывод, даже если он терпит неудачу, потому что файл не читается.
Если grep -q
находит "1"
среди этих файлов, это означает, что имеется по меньшей мере один интерфейс. Код завершения grep -q
будет конечным кодом выхода.
Использование
Например, используя этот статус выхода команды, вы можете использовать его gnubiff в своем ~/.xprofile
, только если у вас есть интернет-соединение.
online() {
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1 > /dev/null | grep -q "1" && exit 0' {} \;
}
online && gnubiff --systemtray --noconfigure &
Ссылка
Ответ 17
Этот bash-скрипт постоянно проверяет интернет и издает звуковой сигнал, когда интернет доступен.
#!/bin/bash
play -n synth 0.3 sine 800 vol 0.75
while :
do
pingtime=$(ping -w 1 8.8.8.8 | grep ttl)
if [ "$pingtime" = "" ]
then
pingtimetwo=$(ping -w 1 www.google.com | grep ttl)
if [ "$pingtimetwo" = "" ]
then
clear ; echo 'Offline'
else
clear ; echo 'Online' ; play -n synth 0.3 sine 800 vol 0.75
fi
else
clear ; echo 'Online' ; play -n synth 0.3 sine 800 vol 0.75
fi
sleep 1
done
Ответ 18
Понг не означает, что веб-сервис на сервере запущен; это просто означает, что сервер отвечает на эхо ICMP. Я бы рекомендовал использовать завиток и проверить его возвращаемое значение.
Ответ 19
Если вашей целью является проверка доступа в Интернет, многие из существующих ответов на этот вопрос ошибочны. Несколько вещей, которые вы должны знать:
- Ваш компьютер может быть подключен к сети без доступа к Интернету.
- Возможно отключение сервера без недоступности всего интернета
- Невозможный портал может вернуть HTTP-ответ для произвольного URL, даже если у вас нет доступа к Интернету.
Имея это в виду, я считаю, что лучшая стратегия состоит в том, чтобы связаться с несколькими сайтами через соединение HTTPS и вернуть true, если какой-либо из этих сайтов ответит.
Например:
connected_to_internet() {
test_urls="\
https://www.google.com/ \
https://www.microsoft.com/ \
https://www.cloudflare.com/ \
"
processes="0"
pids=""
for test_url in $test_urls; do
curl --silent --head "$test_url" > /dev/null &
pids="$pids $!"
processes=$(($processes + 1))
done
while [ $processes -gt 0 ]; do
for pid in $pids; do
if ! ps | grep "^[[:blank:]]*$pid[[:blank:]]" > /dev/null; then
# Process no longer running
processes=$(($processes - 1))
pids=$(echo "$pids" | sed --regexp-extended "s/(^| )$pid($| )/ /g")
if wait $pid; then
# Success! We have a connection to at least one public site, so the
# internet is up. Ignore other exit statuses.
kill -TERM $pids > /dev/null 2>&1 || true
wait $pids
return 0
fi
fi
done
# wait -n $pids # Better than sleep, but not supported on all systems
sleep 0.1
done
return 1
}
Использование:
if connected_to_internet; then
echo "Connected to internet"
else
echo "No internet connection"
fi
Некоторые замечания об этом подходе:
- Это устойчиво против всех ложных положительных и отрицательных сторон, которые я обрисовал в общих чертах выше
- Все запросы выполняются параллельно, чтобы максимизировать скорость
- Он вернет false, если у вас есть технически доступ к интернету, но DNS не работает или настройки вашей сети в противном случае испорчены, что я считаю разумным решением в большинстве случаев.
Ответ 20
Просто пропустите Google DNS и выведите из строя или верните логическое значение, если это не удалось. Используйте || true
в конце строки, чтобы терминалы, настроенные на немедленный выход после сбоя, этого не сделали (установите -e).
validateInternet () {
error=$(ping -q -w1 -c1 "8.8.8.8" 2>&1 >"/dev/null" || true)
if [ "${error}" != "" ]; then
echo "No internet" >&2
exit 1
fi
}