Shell Scripting: Maneira correta de verificar a conectividade com a Internet?

22

Encontrei scripts que dizem verificar a conectividade com a Internet. Alguns verificam o endereço IP se a interface estiver ativa, MAS não verifica a conectividade com a Internet. Eu encontrei alguns que usam ping assim: if [ 'ping google.com -c 4 | grep time' != "" ]; then , mas às vezes isso pode não ser confiável, pois o próprio ping pode travar por algum motivo (por exemplo, esperar por algum IO preso).

Alguma sugestão sobre a maneira correta / confiável de verificar a conectividade com a Internet usando scripts? Eu tenho que usar alguns pacotes?

Ele precisa ser capaz de verificar periodicamente com cron , por exemplo, então, faça algo quando a conexão cair, como invocar ifup --force [interface]

    
por pandalion98 16.03.2015 / 16:28

5 respostas

26

Testando a conectividade IPv4

Se a sua rede permitir que você faça um ping, tente executar o ping 8.8.8.8 (um servidor executado pelo 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

Teste de conectividade IP e DNS

Se você quiser que o teste seja bem-sucedido quando o DNS também estiver funcionando, use um nome de host.

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

Teste de conectividade da web

Alguns firewalls bloqueiam pings. Alguns locais têm um firewall que bloqueia todo o tráfego, exceto por meio de um proxy da web. Se você quiser testar a conectividade da Web, poderá fazer uma solicitação HTTP.

case "$(curl -s --max-time 2 -I http://google.com | sed 's/^[^ ]*  *\([0-9]\).*//; 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
    
por 17.03.2015 / 02:08
21

Eu recomendo contra usando ping para determinar a conectividade. Existem muitos administradores de rede que desativam o ICMP (o protocolo usado) devido a preocupações sobre pingar inundações ataques originados de suas redes.

Em vez disso, eu uso um teste rápido de um servidor confiável em uma porta que você espera abrir:

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

Isso usa o netcat ( nc ) em seu modo varredura de porta , um puxão rápido ( -z é modo zero-I / O [usado para varredura] ) com um tempo limite rápido ( -w 1 espera no máximo um segundo). Ele verifica o Google na porta 443 (HTTPS).

Eu usei HTTPS em vez de HTTP como um esforço para proteger contra portais cativos e proxies transparentes que podem responder na porta 80 (HTTP) para qualquer host. Isso é menos provável ao usar a porta 443, já que haveria uma incompatibilidade de certificado, mas ainda acontece.

Se você quiser se proteger disso, precisará validar a segurança na conexão:

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

Isso verifica a conexão (em vez de esperar pelo tempo limite do openssl) e, em seguida, faz o handshake SSL, digitando na fase de verificação. Ele sai silenciosamente ("true") se a verificação foi "OK" ou então sai com um erro ("false"), então relatamos a descoberta.

    
por 17.03.2015 / 01:23
6

Eu fiz um script que usa várias maneiras de verificar a conexão com a internet (ping, nc e curl, graças a Adam Katz, Gilles e Archemar). Espero que alguém ache isso útil. Sinta-se à vontade para editá-lo ao seu gosto / otimizá-lo.

Verifica seu gateway, DNS e conexão com a Internet (usando curl, nc e ping). Coloque isso em um arquivo e torne-o executável (geralmente 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]\).*//; 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
    
por 17.03.2015 / 04:35
2

existem muitos IPs na internet, uma abordagem leve é pingar alguns deles

 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

uma resposta mais completa pode estar recebendo páginas usando wget

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

onde

  • parse é um programa que você escreve para garantir que o google.txt não seja uma versão em cache (antiga) do google.com
por 16.03.2015 / 16:36
1

graças às suas contribuições de cada usuário e outra web, consegui concluir esse script em três dias. e vou deixá-lo livre para seu uso.

este script automatiza a renovação do endereço IP quando a conexão é perdida, isso acontece com persistência.

#!/bin/bash

# Autor: John Llewelyn
# FB: fb.com/johnwilliam.llewelyn
# Twitter: twitter.com/JWLLEWELYN
# TLF: +584-1491-011-15
# Its use is free.
# Description: Connection Monitor for ADSL modem.
# Requirements:
# Copy this code or save to /home/administrator/ConnectionMonitor.sh
# It requires the installed packages fping beep and cron
# Comment the blacklist pcspkr snd-pcsp in /etc/modprobe.d/blacklist.conf
# Give execute permissions: chmod +x /home/administrator/ConnectionMonitor.sh
# Add this line in crontab -e with root user
# @reboot sleep 120 && /home/administrator/MonitorDeConexion.sh

#################################################################################
# SETTINGS
TEST="8.8.8.8"       # TEST PING
ADAPTER1="enp4s0"    # EXTERNAL ETHERNET ADAPTER

# Report
LOGFILE=/home/administrator/Documentos/ReportInternet.log

# Messages
MESSAGE1="Restoring Connectivity..."
MESSAGE2="Wait a moment please..."
MESSAGE3="No Internet connectivity."
MESSAGE4="Yes, there is Internet connectivity."
#################################################################################

# Time and Date
TODAY=$(date "+%r %d-%m-%Y")

# Show IP Public Address
IPv4ExternalAddr1=$(ip addr list $ADAPTER1 |grep "inet " |cut -d' ' -f6|cut -d/ -f1)
IPv6ExternalAddr1=$(ip addr list $ADAPTER1 |grep "inet6 " |cut -d' ' -f6|cut -d/ -f1)

# Alarm
alarm() {
    beep -f 1500 -l 200;beep -f 1550 -l 200;beep -f 1500 -l 200;beep -f 1550 -l 200;beep -f 1500 -l 200;beep -f 1550 -l 200;beep -f 1500 -l 200;beep -f 1550$
}

# Restoring Connectivity
resolve() {
    clear
    echo "$MESSAGE1"
    sudo ifconfig $ADAPTER1 up;sudo dhclient -r $ADAPTER1;sleep 5;sudo dhclient $ADAPTER1
    echo "$MESSAGE2"
    sleep 120
}

# Execution of work
while true; do
    if [[ "$(fping -I $ADAPTER1 $TEST | grep 'unreachable' )" != "" ]]; then
        alarm
        clear
        echo "================================================================================" >> ${LOGFILE}
        echo "$MESSAGE3 - $TODAY"                                                               >> ${LOGFILE}
        echo "$MESSAGE3 - $TODAY"
        echo "================================================================================" >> ${LOGFILE}
        sleep 10
        resolve
    else
        clear
        echo "================================================================================"   >> ${LOGFILE}
        echo "$MESSAGE4 - $TODAY - IPv4 Addr: $IPv4ExternalAddr1 - IPv6 Addr: $IPv6ExternalAddr1" >> ${LOGFILE}
        echo "$MESSAGE4 - $TODAY - IPv4 Addr: $IPv4ExternalAddr1 - IPv6 Addr: $IPv6ExternalAddr1"
        echo "================================================================================"   >> ${LOGFILE}
        sleep 120
    fi
done

pastebin: link

    
por 04.12.2017 / 03:59