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

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

Ответы [ 19 ]

3 голосов
/ 12 января 2018

Ответ с наибольшим количеством голосов не работает для 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

2 голосов
/ 21 сентября 2017

Этот 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
2 голосов
/ 31 мая 2017

Подобно @ ответу Джесси , этот параметр может быть намного быстрее, чем любое решение, использующее ping, и, возможно, немного более эффективно, чем @ ответ Джесси .

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 значения - Цитирование :

Кажется, есть три состояния:

  • . / Carrier не читается (например, когда интерфейс отключен в Network Manager).
  • . / Carrier содержит «1» (когда интерфейс активирован и он подключен к сети WiFi)
  • . / Carrier содержит «0» (когда интерфейс активирован и не подключен к сети WiFi)

Первый вариант не учтен в @ ответ Джесси . Выдвинутая команда sh:

# Note: $0 == $interface
cat "$0"/carrier 2>&1

cat используется для проверки содержимого carrier и перенаправления всех выходных данных на стандартный вывод, даже если он выходит из строя, поскольку файл не читается. Если grep -q находит среди этих файлов "1", это означает, что подключен как минимум 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 &

Ссылка

2 голосов
/ 03 декабря 2014

Проверка страницы индекса 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
2 голосов
/ 31 мая 2009

Пинг был разработан, чтобы делать именно то, что вы хотите сделать. Однако, если сайт блокирует эхо ICMP, вы всегда можете подключиться к порту 80 какого-либо сайта, wget или curl. Telnet.

2 голосов
/ 14 мая 2019

В Bash, используя свою сетевую оболочку через / dev / { udp , tcp } / host / порт

if echo -n >/dev/tcp/8.8.8.8/53; then
  echo 'Internet available.'
else
  echo 'Offline.'
fi
1 голос
/ 02 июня 2009

Понг не означает, что веб-сервис на сервере запущен; это просто означает, что сервер отвечает на эхо-запрос ICMP. Я бы порекомендовал использовать curl и проверить его возвращаемое значение.

0 голосов
/ 30 мая 2009
ping www.google.com
ping www.yahoo.com
ping www.facebook.com
ping www.stackoverflow.com

Сделайте это, и вы можете быть уверены:)

0 голосов
/ 15 августа 2018

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

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