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



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

290   18  

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 &

ссылка

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

  1. это возможно для вашего компьютера, чтобы быть подключенным к сети без этой сети, имеющей доступ в интернет
  2. это возможно для сервера, чтобы быть вниз без всего интернета быть недоступным
  3. возможно, что захваченный портал вернет 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

некоторые заметки об этом подходе:

  1. он устойчив ко всем ложным позитивам и негативам, которые я изложил выше
  2. запросы все происходит параллельно, чтобы максимизировать скорость
  3. он вернет false, если вы технически есть доступ в интернет, но DNS не работает или ваши сетевые настройки в противном случае перепутались, что я думаю, что это разумная вещь, чтобы сделать в большинстве случаев
    Ничего не найдено.

Добавить ответ:
Отменить.