Сценарии Shell: Надлежащий способ проверить на интернет-соединение?

Другое типичное задание для awk:

POSIXLY_CORRECT=1 LC_ALL=C awk '
  $1 ~ /^[A-Z]{3}$/ {
    if ($1 == "CSI")
      file = "csi.txt"
    else
      file = "rest.txt"
  }
  file {print > file}'

POSIXLY_CORRECT только в случае, если Ваш awk GNU awk, который не распознает {...} если в стандартном совместимом режиме.

LC_ALL=C должен удостовериться [A-Z] означает символ ASCII от A кому: Z, иначе тот диапазон мог бы включать другие символы в зависимости от настроек локализации.

Если на Солярисе, использовать command -p awk или /usr/xpg4/bin/awk поскольку иначе Вы могли бы закончить с /bin/awk который не должен использоваться больше.

26
06.05.2018, 05:22
6 ответов

Тестирование подключения IPv4

Если ваша сеть позволяет звонить, попробуйте пинговать 8,8 .8.8 (сервер работает по Google).

if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then
  echo "IPv4 is up"
else
  echo "IPv4 is down"
fi

Тестирование подключения IP и DNS

Если вы хотите, только тест добиться успеха, когда DNS также работает, используйте имя хоста.

if ping -q -c 1 -W 1 google.com >/dev/null; then
  echo "The network is up"
else
  echo "The network is down"
fi

Тестирование веб-соединения

Некоторые брандмауэры блокируют. В некоторых местах есть брандмауэр, который блокирует весь трафик, кроме через веб-прокси. Если вы хотите проверить веб-соединение, вы можете сделать HTTP-запрос.

case "$(curl -s --max-time 2 -I http://google.com | sed 's/^[^ ]*  *\([0-9]\).*/\1/; 1q')" in
  [23]) echo "HTTP connectivity is up";;
  5) echo "The web proxy won't let us through";;
  *) echo "The network is down or very slow";;
esac
29
27.01.2020, 19:39

Есть много IPS в Интернете, легкий подход для пинга некоторых из них

 if ping -c 4 google.com ; then OK ; else KO ; fi
 if ping -c 4 facebook.com ; then OK ; else KO ; fi
 if ping -c 4 nsa.gov ; then OK ; else KO ; fi # <- this one might not reply

более полный ответ может получать страницы с использованием wget

 wget google.com -o google.txt
 if parse google.txt ; then OK ; else KO ; fi

, где

  • Parse - это программа, которую вы пишете, которые убедитесь Google.txt не (слишком старая) кэшированная версия Google.com
2
27.01.2020, 19:39

Я сделал скрипт, который использует несколько способов проверки подключения к Интернету (Ping, NC, И скручивается благодаря Адаму Кац, Жилесу и Арчемуру). Я надеюсь, что кто-то найдет это полезное. Не стесняйтесь редактировать его по своему вкусу / оптимизировать его.

проверяет ваш шлюз, DNS и подключение к Интернету (используя завиток, NC и Ping). Положите это в файл, затем сделайте его исполняемым (обычно sudo chmod + x filename )

#!/bin/bash

GW=`/sbin/ip route | awk '/default/ { print $3 }'`
checkdns=`cat /etc/resolv.conf | awk '/nameserver/ {print $2}' | awk 'NR == 1 {print; exit}'`
checkdomain=google.com

#some functions

function portscan
{
  tput setaf 6; echo "Starting port scan of $checkdomain port 80"; tput sgr0;
  if nc -zw1 $checkdomain  80; then
    tput setaf 2; echo "Port scan good, $checkdomain port 80 available"; tput sgr0;
  else
    echo "Port scan of $checkdomain port 80 failed."
  fi
}

function pingnet
{
  #Google has the most reliable host name. Feel free to change it.
  tput setaf 6; echo "Pinging $checkdomain to check for internet connection." && echo; tput sgr0;
  ping $checkdomain -c 4

  if [ $? -eq 0 ]
    then
      tput setaf 2; echo && echo "$checkdomain pingable. Internet connection is most probably available."&& echo ; tput sgr0;
      #Insert any command you like here
    else
      echo && echo "Could not establish internet connection. Something may be wrong here." >&2
      #Insert any command you like here
#      exit 1
  fi
}

function pingdns
{
  #Grab first DNS server from /etc/resolv.conf
  tput setaf 6; echo "Pinging first DNS server in resolv.conf ($checkdns) to check name resolution" && echo; tput sgr0;
  ping $checkdns -c 4
    if [ $? -eq 0 ]
    then
      tput setaf 6; echo && echo "$checkdns pingable. Proceeding with domain check."; tput sgr0;
      #Insert any command you like here
    else
      echo && echo "Could not establish internet connection to DNS. Something may be wrong here." >&2
      #Insert any command you like here
#     exit 1
  fi
}

function httpreq
{
  tput setaf 6; echo && echo "Checking for HTTP Connectivity"; tput sgr0;
  case "$(curl -s --max-time 2 -I $checkdomain | sed 's/^[^ ]*  *\([0-9]\).*/\1/; 1q')" in
  [23]) tput setaf 2; echo "HTTP connectivity is up"; tput sgr0;;
  5) echo "The web proxy won't let us through";exit 1;;
  *)echo "Something is wrong with HTTP connections. Go check it."; exit 1;;
  esac
#  exit 0
}


#Ping gateway first to verify connectivity with LAN
tput setaf 6; echo "Pinging gateway ($GW) to check for LAN connectivity" && echo; tput sgr0;
if [ "$GW" = "" ]; then
    tput setaf 1;echo "There is no gateway. Probably disconnected..."; tput sgr0;
#    exit 1
fi

ping $GW -c 4

if [ $? -eq 0 ]
then
  tput setaf 6; echo && echo "LAN Gateway pingable. Proceeding with internet connectivity check."; tput sgr0;
  pingdns
  pingnet
  portscan
  httpreq
  exit 0
else
  echo && echo "Something is wrong with LAN (Gateway unreachable)"
  pingdns
  pingnet
  portscan
  httpreq

  #Insert any command you like here
#  exit 1
fi
9
27.01.2020, 19:39

Я настоятельно рекомендую против с использованием Ping для определения подключения. Существует слишком много сетевых администраторов, которые отключены ICMP (протокол, который он использует) из-за беспокойства о Ping Plain атаки, возникающие из их сетей.

Вместо этого я использую быстрый тест надежного сервера на порту, который вы можете ожидать, чтобы быть открытым:

if nc -zw1 google.com 443; then
  echo "we have connectivity"
fi

Это использует NetCat ( NC ) в его в режиме порта , быстрое тэка ( -Z - режим нулевого ввода-вывода [используется для сканирования] ) с быстрым таймаусом ( --w 1 ждет второй). Он проверяет Google на порт 443 (HTTPS).

Я использовал HTTPS, а не HTTP, как усилие для защиты от в пленных порталах и прозрачных прокси , которые могут отвечать на порт 80 (http) для любого хоста. Это менее вероятно при использовании порта 443, поскольку не будет несоответствие сертификата, но это все еще происходит.

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

test=google.com
if nc -zw1 $test 443 && echo |openssl s_client -connect $test:443 2>&1 |awk '
  handshake && $1 == "Verification" { if ($2=="OK") exit; exit 1 }
  $1 $2 == "SSLhandshake" { handshake = 1 }'
then
  echo "we have connectivity"
fi

это проверки для подключения (вместо того, чтобы ждать openssl до времени), а затем делает рукопожатие SSL, что на этапе проверки. Он молча выходит («правда»), если проверка была «ОК» или выходит с ошибкой («false»), то мы сообщаем о нахождении.

27
27.01.2020, 19:39

@PNDA предложил получить данные из ethtool, что мне нравится. Но я предпочитаю конвейер, а не grep, и использую более простую команду awk, которую люди, не использующие -bash, могут понять быстрее. Разница во времени между ними незначительна.

Использование:Ubuntu Bionic 18.04

Обнаружение сетевого интерфейса:

root@srv:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:1e:67:96:a3:97 brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.101/8 brd 10.255.255.255 scope global eno1
       valid_lft forever preferred_lft forever
    inet6 fe80::21e:67ff:fe96:a397/64 scope link 
       valid_lft forever preferred_lft forever
3: rename3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether 00:1e:67:96:a3:96 brd ff:ff:ff:ff:ff:ff

вывод ethtool:

root@srv:~# ethtool eno1
Settings for eno1:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Supported FEC modes: Not reported
        Advertised link modes:  10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Advertised FEC modes: Not reported
        Speed: 1000Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 1
        Transceiver: internal
        Auto-negotiation: on
        MDI-X: on (auto)
        Supports Wake-on: pumbg
        Wake-on: g
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes

Пример команды:

ethtool eno1 | grep "ink detected" | awk '{print $3}'

Выберите свое собственное приключение:

ethtool {{network adapter}} | grep "ink detected" | awk '{print $3}'

Выход:

Если есть ссылка:

root@srv:~# ethtool eno1 | grep "ink detected" | awk '{print $3}'
yes

Если ссылки нет:

root@srv:~# ethtool rename3 | grep "ink detected" | awk '{print $3}'
no
0
21.02.2020, 15:09

Если вы хотите избежать ложных срабатываний из-за наличия Captive Portal, вам придется сверять выходные данные HTTP-соединения с веб-сайтом с предсказуемым содержанием/ответом.

Примерно так:

#!/bin/sh

detection_out=$(wget -q http://detectportal.firefox.com/success.txt --timeout=10 -O - 2> /dev/null)

test "$detection_out" = "success"

exit $?

Это проверяет, точно ли содержимоеhttp://detectportal.firefox.com/success.txtидентично success.

Выход предоставляется в виде кода выхода :, если код выхода равен нулю, соединение доступно, в противном случае оно либо недоступно по какой-либо причине, либо заблокировано авторизованным порталом.

Этот скрипт я взял отсюда :https://github.com/libremesh/lime-packages/pull/712/files

0
27.05.2020, 09:18

Теги

Похожие вопросы