Как проверить подключение к Интернету с помощью 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

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

  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 не работает или настройки вашей сети в противном случае испорчены, что я считаю разумным решением в большинстве случаев.

Ответ 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
}