¿Cómo puedo verificar la conectividad a Internet en una consola?

31

¿Hay una manera fácil de verificar la conectividad a Internet desde la consola? Estoy tratando de jugar en un script de shell. Parece que una idea es comprobar el código de respuesta HTTP para interpretar si la conexión a Internet funciona bien. Pero creo que debe haber una manera fácil sin la necesidad de revisar un sitio que nunca falla;)wget --spider http://www.google.co.in/

Editar: Parece que puede haber muchos factores que pueden examinarse individualmente, algo bueno. Mi intención en este momento es verificar si mi blog está caído. He configurado cron para verificarlo cada minuto. Para esto, estoy revisando el código de respuesta HTTP de wget --spider para mi blog. Si no es 200, me lo notifica (creo que esto será mejor que simplemente hacer ping, ya que el sitio puede estar bajo una gran carga y puede estar agotando el tiempo de espera o responder muy tarde). Ahora ayer, hubo algún problema con mi Internet. LAN estaba bien conectada pero no pude acceder a ningún sitio. Así que sigo recibiendo notificaciones ya que el script no pudo encontrar 200 en la respuesta de wget. Ahora quiero asegurarme de que me muestre una notificación cuando tenga conectividad a Internet.

Por lo tanto, verificar la conectividad de DNS y LAN es un poco exagerado para mí, ya que no tengo tanta necesidad específica de averiguar qué problema es. Entonces, ¿qué sugieres cómo lo hago?

Aquí está mi script para seguir revisando el tiempo de inactividad de mi blog:

#!/bin/bash

# Sending the output of the wget in a variable and not what wget fetches
RESULT=`wget --spider http://blog.ashfame.com 2>&1`
FLAG=0

# Traverse the string considering it as an array of words
for x in $RESULT; do
    if [ "$x" = '200' ]; then
        FLAG=1 # This means all good
    fi
done

if [ $FLAG -eq '0' ]; then
    # A good point is to check if the internet is working or not
        # Check if we have internet connectivity by some other site
        RESULT=`wget --spider http://www.facebook.com 2>&1`
        for x in $RESULT; do
            if [ "$x" = '200' ]; then
                FLAG=1 # This means we do have internet connectivity and the blog is actually down
            fi
        done

    if [ $FLAG -eq '1' ]; then
        DISPLAY=:0 notify-send -t 2000 -i /home/ashfame/Dropbox/Ubuntu/icons/network-idle.png "Downtime Alert!" "http://blog.ashfame.com/ is down."         
    fi  
fi

exit

De esta manera, debo verificar la conectividad a Internet solo cuando haya un problema con el código de respuesta de mi blog. Es un poco pesado (ya que no estoy usando ping) pero no debería dar ningún falso positivo. ¿Correcto? Además, ¿cómo puedo aleatorizar el ping a un sitio diferente cada vez, como Facebook, Google, Yahoo, etc.? También (estaba tratando de evitar cualquier E / S) puedo escribir en un archivo de registro mediante el cual puedo verificar el recuento de las comprobaciones de tiempo de inactividad y luego omita más controles hasta que el sitio esté inactivo o provoque controles más largos (10 minutos en lugar de cada minuto). ¿Qué piensas?

Ashfame
fuente
La "conectividad a Internet" no tiene una definición clara, solo puede probar la conectividad a un servicio o conjunto de servicios específicos. Si quiere decir conectividad "LAN", una buena opción es hacer ping a su puerta de enlace de red.
João Pinto
En términos simples, definiría que la conectividad a Internet es si puede acceder a Internet. El problema puede por cualquier cosa en el medio. Solo necesito diferenciar si funciona bien o si hay un problema fuera del conjunto de problemas que puede ser responsable. Espero haberme aclarado. :)
Ashfame

Respuestas:

29

Comprobando si el sitio web específico está activo

Primero, hay varios servicios de monitoreo en línea disponibles. Para elegir uno, Pingdom incluye una cuenta gratuita para monitorear un objetivo. (Negación: estoy no afiliado con Pingdom de ninguna manera).

En segundo lugar, usar wget --spiderpara tu propio script es una buena idea. Obtendrá algunos falsos positivos cuando su computadora esté inactiva o cuando su servidor DNS no funcione. Verificar el código de retorno es una forma sencilla de implementar esto:

wget --spider --quiet http://example.com
if [ "$?" != 0 ]; then
  echo "Website failed!" | mail -s "Website down" [email protected]
fi

Una vez más, hay deficiencias en este enfoque. Si su proveedor ha almacenado en caché su registro DNS, pero el servidor DNS está inactivo, otros no pueden acceder a su sitio a pesar de que la supervisión dice que todo está bien. Puede escribir una solución breve con host, por ejemplo host example.com <your dns server IP>. Eso devolverá un error si el servidor DNS no responde, incluso si OpenDNS o el servidor DNS de su propio proveedor funcionan bien.

Comprobar si internet funciona

No hay una manera realmente fácil de manejar esto en todos los casos.

Puede, por ejemplo, ejecutar ping -c1en múltiples sitios conocidos (por ejemplo, www.google.com, facebook.com y ping.funet.fi) y verificar los códigos de retorno para determinar si se puede acceder a algún destino. Puede verificar automáticamente el código de retorno utilizando la variable $?. El parámetro -c1limita el número de paquetes de ping a uno.

Puede encontrar problemas con algunos wifis públicos cuando hay una puerta de enlace de inicio de sesión que redirige todos los pings y solicitudes HTTP. Si es así, puede obtener respuestas de ping y códigos de estado HTTP sin errores, incluso cuando no pueda acceder a ningún otro sitio.

Si desea verificar el estado del cable, puede usar

sudo ethtool eth0

De salida (extracto):

Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
Link detected: yes

Sin embargo, esto no indica si realmente tiene conectividad o no, solo si el cable está conectado y algo está en el otro extremo.

Olli
fuente
Esto es totalmente para mi configuración, trabajando en Ethernet siempre encendido. Pero me alegro de que hayas señalado cómo no funcionará correctamente en algunos casos. También creo que hacer ping sería más rápido que wget. ¿Qué piensas? y si estoy buscando un código de estado 200 en cualquier lugar, prefiero simplemente hacer ping. ¿Correcto? o hay algo que debo saber?
Ashfame
2
el ping es más rápido y mejor, porque el otro extremo no se enojará por ti. ping es bastante seguro, pero incluso eso no garantiza que pueda abrir páginas web. Además, es posible que el firewall esté bloqueando el ping pero permitiendo solicitudes HTTP.
Olli
1
Hacer ping a un servidor DNS conocido como 4.2.2.2 también es útil en caso de que tenga conectividad de red pero DNS roto.
djeikyb
Para la comprobación de DNS, por supuesto, puede usar host(consulta DNS). Es muy rápido también.
Olli
Gracias por su respuesta @Olli & @djeikyb He actualizado la pregunta, por favor, eche un vistazo
Ashfame
7

Estoy usando este método ...

if [["$ (ping -c 1 8.8.8.8 | grep '100% pérdida de paquetes')"! = ""]]; luego
    echo "Internet no está presente"
    salida 1
más
    echo "Internet está presente"
    wget www.site.com
fi
bais bais
fuente
Obtuve resultados diferentes para ping -c 1 8.8.8.8y ping -c 1 www.google.com. ¿Como es eso?
MERose
2
Tenga en cuenta que esto fallará en China y otros países que bloquean Google
Tom J Nowell
7

Acabo de usar

nm-online

que se detiene hasta que el administrador de red presente una conexión de red. Funcionado bien. Puedes hacer otras cosas con él también.

ntsecrets
fuente
6

La verificación para ver si un sitio está activo generalmente se realiza con una herramienta de monitoreo como nagios. Esto supervisará continuamente el sitio y puede notificarle sobre interrupciones.

Cuando compruebo si Internet está activo desde la línea de comandos, ejecuto varios pasos:

  • Verifique que Internet esté activo ping google.com(verifica el DNS y el sitio accesible conocido).
  • Compruebe si el sitio web está en uso wgeto w3mpara buscar la página.

Si Internet no está funcionando, diagnostique hacia afuera.

  • Verifique que la puerta de enlace sea pingable. (Compruebe ifconfig para la dirección de la puerta de enlace).
  • Verifique que los servidores DNS tengan ping. (Verifique /etc/resolv.conf para las direcciones).
  • Verifique si el firewall está bloqueando. (Marque / var / log / syslog mientras registro bloques).

Si Internet está activo pero el sitio está inactivo, verifique si se w3m http://isup.me/example.comreemplaza example.comcon el sitio que aparece inactivo. Utilice wget, lynx o cualquier navegador de línea de comandos que tenga disponible si no tiene instalado el navegador w3m.

BillThor
fuente
¡Gracias por tu sugerencia! ¿Mi script cubre el requisito básico de verificar y alertarme cuando mi sitio está inactivo? Y será silencioso en caso de que haya algún problema de conectividad a Internet
Ashfame
Parece que tu script hará lo que quieras. Puede incluir el comando wget en la instrucción if como if ! wget --spider http:///example.com; then.
BillThor
quieres decir que wget siempre devuelve 1 por 200 código de respuesta HTTP?
Ashfame
Quiero decir que la prueba [ $? != 0 ]es la misma que la prueba ! command. wget está documentado para devolver 0 en caso de éxito y no 0 en caso de error. El if se comporta de manera idéntica en cualquier forma que lo codifique. Si wget devuelve un error en una respuesta 200, la prueba fallará de cualquier manera que la escriba. Lo mismo si devuelve 0 para un código de respuesta que no sea 200.
BillThor
¡Gracias! Eso haría el guión más pequeño y fácil de entender.
Ashfame
4

Este es el script de shell que estoy usando para probar la conectividad a Internet:

alarm.sh

#! /bin/bash

if curl --silent --head http://www.google.com/ |
    egrep "20[0-9] Found|30[0-9] Found" >/dev/null
then
    echo Internet status: OK
else
    echo Internet status: ERROR
    mpg321 alarm.mp3 &> /dev/null
fi
sleep 60
clear

./alarm.sh

Deberá instalar curl y mpg321

sudo apt-get install curl mpg321

Necesitará un archivo de sonido .mp3 renombrado como alarm.mp3 en la misma carpeta si desea una funcionalidad de alarma audible. Finalmente configure la URL del sitio web y egrep a sus necesidades.

01BTC10
fuente
Esto funciona perfectamente incluso cuando el usuario está detrás de un portal cautivo y no ha iniciado sesión.
Ashhar Hasan
Puede usar en egrep -qlugar deegrep ... > /dev/null
wjandrea
¿Por qué el script se llama a sí mismo en lugar de simplemente usar un whilebucle?
wjandrea
Oh, espera, no se llama a sí mismo. Llama a un script llamado alarm.shen el wd, por lo que si llama a este script desde un directorio diferente, se producirá un error, o si hay un script llamado alarm.shen el wd, lo llamará en su lugar. Entonces esa es una mala práctica. En su "$0"lugar, podría usar , pero un whilebucle sería mejor.
wjandrea
"¿Por qué el script se llama a sí mismo en lugar de simplemente usar un bucle while?": Porque era un novato cuando hice esa publicación y sí, ese script se estaba llamando a sí mismo.
01BTC10
2

Comprobar si internet funciona

sudo nm-tool | grep "State: connected" | wc -l

De salida (extracto):

1 #System is connected to internet

Sin embargo, como lo mencionaron otros, esto no indica si realmente tiene conectividad o no. P.ej. Podría estar conectado al enrutador y el enrutador no está necesariamente conectado a internet.

Venkat Kotra
fuente
2
nm-toolse ha eliminado en Ubuntu 15.04+, pero puede usarlo nmclien su lugar. Por ejemplo[[ $(nmcli -f STATE -t g) = connected ]]
seis
¡@Six nmcli -f STATE -t nmlo bueno es ser independiente de los sitios web!
Acuario Power
1
Tenga en cuenta que nm-tooly nmclile dirá solamente si está o no está conectado al local de la red, es decir, si está o no está conectado a su casa wifi / ethernet. No le dirá si puede alcanzar algo más allá de su red local, es decir, Internet.
Sergiy Kolodyazhnyy
1

Estoy usando este método:

if curl -s --head  --request GET www.google.com | grep "200 OK" > /dev/null ; then
    echo "Internet is present"
else
    echo "Internet isn't present"
fi

Intentará conectarse a un sitio web conocido y, si puede conectarse a él, asumiremos que existe Internet.

Abraham Hernández
fuente
0

Necesitaba ayuda con la misma pregunta, y obtuve mi respuesta de esta manera:

echo $(nm-online) $? connection problems
octius4u
fuente
¿como funciona esto?
wjandrea
Solo está comprobando el estado (un carácter) del nm-onlinecomando ... Devolverá 0 si todo está bien. Usual en todas las UNIXconchas.
Antonio
0

Comprobar si Internet funciona no es tan trivial. ping es ICMP, por lo que podría funcionar incluso si el proxy web está inactivo. Algo similar ocurre con el DNS si prueba con una IP.

Como mi conexión a Internet es inestable, creé este script ( basado en este ) que hace que suene un suave acorde para llamarme, y también utiliza Ubuntu para notificar cuando vuelve la conexión a Internet:

#!/bin/bash

hash play 2>&- || { echo >&2 "I require «play» but it's not installed. Try apt-get install sox. Aborting."; exit 1; }

WGET="`which wget`"
URL="http://www.google.com"
delay=3;
noConnectionMessage="No connection, trying again in $delay seconds...";
connectionMessage="WE HAVE INTERNET! :) Trying again in $delay seconds...";

echo "INTERNET TESTER: Type Ctrl+C to quit";
rm --force /tmp/index.site

function playSound {
    time=1;    # Time played
    if [ `sox --version| grep -oP "v[0-9.]+" | sed "s/[v.]//g"` -lt 1431 ]; then    #analize sox version, if greater than v14.3.1 can use pluck
        play -q -n synth $time sine;
    else
        play -q -n synth $time pluck $1;
        #for i in G4 G4 G4 E4;do play -n synth 0.1 pluck $i repeat 2;done    # You can play with something like this also :) (first three notes from Beethoven 5th symphony)
    fi
}

while [ 1 -eq 1 ]; do
    $WGET -q --tries=10 --timeout=2 $URL -O /tmp/index.site &> /dev/null
    if [ ! -s /tmp/index.site ];then
        echo $noConnectionMessage;
        #playSound E2
        sleep 1;
    else
        #~ zenity --warning --text "ADDRESS is back"
        notify-send -i "notification-network-wireless-full" "Connection state:" "$connectionMessage";
        echo $connectionMessage;
        playSound E3
    fi
    sleep $delay;
done

exit 0;
pabloab
fuente
0

Estaba buscando una secuencia de comandos que probara continuamente mi conexión a Internet, que se iniciaría cada vez que mi servidor estuviera encendido e hice esto:

  1. Primero, instala fping

    apt-get install fping
    
  2. Cree un script de inicio en la carpeta /etc/init.d con el siguiente contenido (lo llamé testcon)

    #!/bin/bash
    
    PIDFILE=/var/run/testcon.pid
    
    . /lib/lsb/init-functions
    
    case "$1" in
      start)
            log_daemon_msg "Starting internet connection tester"
            /etc/init.d/testcond &
            echo $! > $PIDFILE
            log_end_msg $?
        ;;
      stop)
            log_daemon_msg "Stopping internet connection tester"
            PID=$(cat $PIDFILE)
            kill -9 "$PID"
            log_end_msg $?
        ;;
      *)
        echo "Usage: /etc/init.d/testcon {start|stop}"
        exit 1
        ;;
    esac
    
    exit 0
    
  3. Cree un script en la carpeta /etc/init.d con el siguiente contenido (lo llamé testcond)

    #echo Computer starting or testing daemon init
    while [ "$itest" == "" ] 
    do
        #wait 5 seconds 
        sleep 5
        itest=$(fping 8.8.8.8 | grep alive)
    done
    date | mail -s "Server is up and Internet is online" [email protected]
    
    #loop forever
    while [ "1" == "1" ] 
    do
        itest=$(fping 8.8.8.8 | grep alive)
        #if internet is down
        if [ "$itest" == "" ] 
        then
            #echo Internet is down
            #log time it was found down
            current_time=$(date)
            echo "Internet was found down @ $current_time" >> /mnt/data/Server/internet_log.txt
            #loop until it is back
            while [ "$itest" == "" ] 
            do
                #wait 60 seconds 
                sleep 60
                itest=$(fping 8.8.8.8 | grep alive) # test the internet
            done
            #when it is back
            current_time=$(date)
            echo "Internet is back        @ $current_time" >> /mnt/data/Server/internet_log.txt
            body=$(tail -2 /mnt/data/Server/internet_log.txt)
            echo "$body" | mail -s "Internet is back online" [email protected]
        fi
        #echo Internet is online
        #wait 60 seconds
        sleep 60
            done
    
  4. Luego ejecuto los siguientes comandos para agregar a la puesta en marcha:

    sudo update-rc.d testcon defaults
    sudo update-rc.d testcon enable
    
  5. Reiniciar

Rafael
fuente
0

Mi Broadcom BCM94331CDchip me enfrentó a excreciones aleatorias de conexiones Wi-Fi . Diseñé el siguiente script bash (bucle infinito) comprobando cada segundo si la conexión Wi-Fi a Internet está en funcionamiento. Otra línea de comando propuesta aquí esperará al menos 5 a 10 segundos antes de cerrar con un estado, es decir ping. Mientras tanto, estoy buscando una solución definitiva también.

De los resultados en askubuntu, tendré que purgar el bcmwl-kernel-sourcepaquete mientras lo uso firmware-b43-installery b43-fwcutter.

Gracias a todos por sus sugerencias (arriba).

Este script debe agregarse en los Programas de inicio y no necesita super userprivilegios para ejecutarse también.

#!/bin/bash
#

# Check if Wi-Fi is disabled e.g. 'out of range'
# If so quickly re-enable Wi-Fi
# Due to a problem with Broadcom proprietary driver in package firmware-b43-installer

# Script is part of Start-Up programs
# Stored in /usr/local/bin/
# Infinite loop checking every second if Wi-Fi is up and running

while true; do
  # https://askubuntu.com/questions/27954/how-can-i-check-internet-connectivity-in-a-console
  if [[ $(nmcli -f STATE -t g) != 'connected' ]]; then
    # Disable and Re-Enable Wi-Fi as the Wi-Fi is now 'out of range' (disconnected)
    nmcli radio wifi off
    nmcli radio wifi on
  fi
  sleep 1
done
Antonio
fuente