Saltar al contenido

Shell Scripting: ¿forma adecuada de comprobar la conectividad a Internet?

El paso a paso o código que hallarás en este artículo es la solución más rápida y válida que encontramos a tus dudas o problema.

Solución:

Prueba de la conectividad IPv4

Si su red permite hacer ping, intente hacer ping 8.8.8.8 (un servidor ejecutado por 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

Prueba de conectividad IP y DNS

Si solo desea que la prueba tenga éxito cuando el DNS también está funcionando, use un nombre 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

Probando la conectividad web

Algunos cortafuegos bloquean los pings. Algunos lugares tienen un firewall que bloquea todo el tráfico excepto a través de un proxy web. Si desea probar la conectividad web, puede realizar una solicitud 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

te lo recomiendo mucho contra utilizando ping para determinar la conectividad. Hay demasiados administradores de red que deshabilitan ICMP (el protocolo que utiliza) debido a las preocupaciones sobre los ataques de inundación de ping que se originan en sus redes.

En su lugar, utilizo una prueba rápida de un servidor confiable en un puerto que puede esperar que esté abierto:

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

Esto usa netcat (nc) en su modo de escaneo de puertos, un toque rápido (-z es modo de E / S cero [used for scanning]) con un tiempo de espera rápido (-w 1 espera como máximo un segundo, aunque los usuarios de Apple OS X pueden necesitar usar -G 1 en lugar de). Comprueba Google en el puerto 443 (HTTPS).

He usado HTTPS en lugar de HTTP como un esfuerzo para protegerme contra portales cautivos y proxies transparentes que pueden responder en el puerto 80 (HTTP) para cualquier host. Esto es menos probable cuando se usa el puerto 443, ya que habría una falta de coincidencia de certificados, pero aún así sucede.

Si desea protegerse contra eso, deberá validar la seguridad en la conexión:

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

Esto verifica una conexión (en lugar de esperar a que se agote el tiempo de espera de openssl) y luego realiza el protocolo de enlace SSL, ingresando en la fase de verificación. Sale silenciosamente (“true”) si la verificación fue” OK “o si sale con un error (“false”), luego informamos el hallazgo.

Hice un script que usa múltiples formas de verificar la conexión a Internet (ping, nc y curl, gracias a Adam Katz, Gilles y Archemar). Espero que alguien lo encuentre útil. Siéntase libre de editarlo a su gusto / optimizarlo.

Comprueba su puerta de enlace, DNS y conexión a Internet (mediante curl, nc y ping). Coloque esto en un archivo y luego hágalo ejecutable (generalmente 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
 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

Agradecemos que quieras añadir valor a nuestro contenido colaborando tu experiencia en las explicaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *