18 ответов:
ping www.google.com ping www.yahoo.com ping www.facebook.com ping www.stackoverflow.comсделать это, и вы можете быть уверены:)
Ping ваш шлюз по умолчанию:
#!/bin/bash ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
без пинг
#!/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
супер Спасибо пользователю 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Примечание Для тех, кто новичок в Баш: окончательный оператор ' if ' проверяет, если нет [!] онлайн и выходит, если это так. См. man bash и поиск "выражения могут быть объединены" для получения более подробной информации.
P. S. Я чувствую, пинг-это не лучшая вещь, чтобы использовать здесь, потому что она призвана проверить подключение к конкретному хосту не проверить, если есть связь в сети любого рода.
P. P. S. вышеуказанные работы на Ubuntu 12.04 /sys могут не существовать в некоторых других дистрибутивах. Смотрите ниже:
современные дистрибутивы Linux включают каталог /sys в качестве виртуальной файловой системы (sysfs, сопоставимый с / proc, который является procfs), который хранит и позволяет изменять устройства, подключенные к системе, тогда как многие традиционные UNIX и Unix-подобные операционные системы используют /sys как символическую ссылку на исходное дерево ядра.[цитата необходима]
из Википедии https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
это работает как на MacOSX, так и на Linux:
#!/bin/bash ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
я писал сценарии до этого просто использовать telnet для подключения к порту 80, а затем передать текст:
HTTP/1.0 GET /index.htmlзатем следуют две последовательности CR/LF.
Если вы вернете какую-то форму ответа HTTP, вы можете вообще предположить, что сайт работает.
в верхнем ответе отсутствует тот факт, что вы можете иметь совершенно стабильное соединение с вашим шлюзом по умолчанию, но это не означает, что вы можете автоматически достичь чего-то в интернете. ОП спрашивает, как он/она может проверить связь с миром. Поэтому я предлагаю изменить верхний ответ, изменив 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
Если ваш локальный сервер имен не работает,
ping 4.2.2.1Это простой в запоминании всегда вверх IP (это на самом деле сервер имен, даже).
убедитесь, что ваша сеть разрешает вход и выход TCP-трафика, а затем вы можете вернуть свой публичный IP-адрес с помощью следующей команды
curl ifconfig.co
выполните следующую команду, чтобы проверить, работает ли веб-сайт и какое сообщение о состоянии отображается на веб-сервере:
$ curl -Is http://www.hithertech.com |head -1 HTTP/1.1 200 OKкод состояния '200 OK' означает, что запрос выполнен успешно и веб-сайт доступен.
пинг был разработан, чтобы сделать именно то, что вы хотите сделать. Однако, если сайт блокирует Эхо ICMP, то вы всегда можете сделать telnet для порта 80 какого-либо сайта, wget или curl.
кратчайший путь:
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
на топ-проголосовали ответ не работает для 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
этот сценарий 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
Pong не означает, что веб-служба на сервере запущена; это просто означает, что сервер отвечает на Эхо ICMP. Я бы рекомендовал использовать curl и проверить возвращаемое значение.
проверка индексной страницы 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
аналогично @Джесси, эта опция может быть намного быстрее, чем любое решение с помощью
pingи, возможно, немного более эффективным, чем @Джесси.find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat ""/carrier 2>&1' {} \; | grep -q '1'Explenation:
эта команда использует
findС-execвыполнить команду для всех файлов без имени*lo*на/sys/class/net/. Это должны быть ссылки на каталоги, содержащие информацию о доступных сетевых интерфейсов машина.команду, побежал-это
shкоманда, которая проверяет содержимое файлаcarrierв этих каталогах. Значение$interface/carrierимеет 3 значения - цитирую:кажется, есть три состояния:
- ./ носитель не читается (например, когда интерфейс отключен в Диспетчере сети).
- ./ несущая содержит "1" (когда интерфейс активирован и он подключен к WiFi сеть)
- ./ несущая содержит "0" (когда интерфейс активирован и не подключен к сети WiFi)
первый вариант не рассматривается в @Джесси. Элемент
shкоманда striped out is:# Note: == $interface cat ""/carrier 2>&1
catиспользуется для проверки содержанияcarrierи перенаправить весь вывод в стандартный вывод, даже если это не удается потому что файл не читается. Еслиgrep -qнаходит"1"среди эти файлы это означает, что есть по крайней мере 1 интерфейс подключен. Код выходаgrep -qбудет окончательный код выхода.использование
например, используя статус выхода этой команды, вы можете использовать ее start a gnubiff в своем
~/.xprofileтолько если у вас есть подключение к интернету.online() { find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat ""/carrier 2>&1 > /dev/null | grep -q "1" && exit 0' {} \; } online && gnubiff --systemtray --noconfigure &ссылка
Если ваша цель на самом деле проверить интернет доступ, многие из существующих ответов на этот вопрос являются ошибочными. Несколько вещей, которые вы должны знать:
- это возможно для вашего компьютера, чтобы быть подключенным к сети без этой сети, имеющей доступ в интернет
- это возможно для сервера, чтобы быть вниз без всего интернета быть недоступным
- возможно, что захваченный портал вернет 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 не работает или ваши сетевые настройки в противном случае перепутались, что я думаю, что это разумная вещь, чтобы сделать в большинстве случаев
Comments