¿Cómo probar una conexión a Internet con bash?


¿Cómo se puede probar una conexión a Internet sin hacer ping a algún sitio web? Quiero decir, ¿qué pasa si hay una conexión pero el sitio está caído? ¿Hay un cheque para una conexión con el mundo?

Author: lauriys, 2009-05-30

18 answers

ping www.google.com
ping www.yahoo.com
ping www.facebook.com
ping www.stackoverflow.com

Haz eso y puedes estar bastante seguro:)

 -6
Author: Silfverstrom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-23 03:32:52

Haga ping a su puerta de enlace predeterminada:

#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
 86
Author: mateusza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-31 15:04:55

Sin ping

#!/bin/bash

wget -q --spider http://google.com

if [ $? -eq 0 ]; then
    echo "Online"
else
    echo "Offline"
fi

-q : Modo silencio

--spider: no lo consigas, solo comprueba la disponibilidad de la página

$?: código de retorno de shell

0 : código shell" All OK "

Sin wget

#!/bin/bash

echo -e "GET http://google.com HTTP/1.0\n\n" | nc google.com 80 > /dev/null 2>&1

if [ $? -eq 0 ]; then
    echo "Online"
else
    echo "Offline"
fi
 83
Author: user3439968,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-03 19:45:36

Super Gracias al usuario somedrew por su publicación aquí: https://bbs.archlinux.org/viewtopic.php?id=55485 el 2008-09-20 02:09: 48

Buscar en/sys/class / net debería ser una forma

Aquí está mi script para probar una conexión de red que no sea el bucle de vuelta. Utilizo lo siguiente en otro script que tengo para probar periódicamente si mi sitio web es accesible. Si NO es accesible, una ventana emergente me alerta de un problema.

El script de abajo me impide recibir mensajes emergentes cada cinco minutos cuando mi computadora portátil no está conectada a la red.

#!/usr/bin/bash

# Test for network conection
for interface in $(ls /sys/class/net/ | grep -v lo);
do
  if [[ $(cat /sys/class/net/$interface/carrier) = 1 ]]; then OnLine=1; fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr; exit; fi

Nota para aquellos nuevos en bash: La sentencia 'if' final prueba si NO [!] en línea y sale si este es el caso. Vea man bash y busque "Expressions may be combined" para más detalles.

PD: Siento que ping no es lo mejor para usar aquí porque tiene como objetivo probar una conexión a un host en particular NO probar si hay una conexión a una red de cualquier tipo.

P. P. S. Lo anterior funciona en Ubuntu 12.04 El / sys puede no existir en otras distribuciones. Ver abajo:

Las distribuciones modernas de Linux incluyen un directorio / sys como un sistema de archivos virtual (sysfs, comparable a /proc, que es un procfs), que almacena y permite la modificación de los dispositivos conectados al sistema, mientras que muchos sistemas operativos UNIX tradicionales y similares a UNIX utilizan /sys como un enlace simbólico a la fuente del núcleo arbol.[cita requerida]

De Wikipedia https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

 22
Author: Jesse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-18 15:09:32

Esto funciona tanto en MacOSX como en Linux:

#!/bin/bash

ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
 18
Author: legel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-03 15:53:56

He escrito scripts antes que simplemente usan telnet para conectarse al puerto 80, luego transmiten el texto:

HTTP/1.0 GET /index.html

Seguido de dos secuencias CR/LF.

Siempre que obtenga alguna forma de respuesta HTTP, generalmente puede asumir que el sitio está funcionando.

 8
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-30 08:50:24

La respuesta principal no tiene en cuenta el hecho de que puede tener una conexión perfectamente estable a su puerta de enlace predeterminada, pero eso no significa automáticamente que pueda llegar a algo en Internet. El OP pregunta cómo puede probar una conexión con el mundo. Así que sugiero alterar la respuesta superior cambiando la IP de la puerta de enlace a una IP conocida (x. y. z. w) que esté fuera de su LAN.

Así que la respuesta sería:

ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error

También la eliminación de los backsticks desfavorables para el comando sustitución[1].

Si solo desea asegurarse de que está conectado al mundo antes de ejecutar algún código, también puede usar:

if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
    # more code
fi
 5
Author: Fuwan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-01 14:42:00

Si su servidor de nombres local está desactivado,

ping 4.2.2.1

Es una IP siempre activa fácil de recordar (en realidad es un servidor de nombres, incluso).

 4
Author: ephemient,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-31 02:43:52

Asegúrese de que su red permita la entrada y salida de tráfico TCP, entonces podría recuperar su IP pública con el siguiente comando

curl ifconfig.co
 3
Author: WaiKit Kung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-19 09:52:14

Ejecute el siguiente comando para comprobar si un sitio web está activo y qué mensaje de estado está mostrando el servidor web:

$ curl -Is http://www.hithertech.com | head -1 HTTP/1.1 200 OK

El código de estado '200 OK' significa que la solicitud ha tenido éxito y que se puede acceder a un sitio web.

 3
Author: Chaminda Bandara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-13 13:53:07

Ping fue diseñado para hacer exactamente lo que estás buscando hacer. Sin embargo, si el sitio bloquea ICMP echo, entonces siempre puede hacer el telnet al puerto 80 de algún sitio, wget o curl.

 2
Author: nikudesu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-31 15:16:48

El camino más corto: fping 4.2.2.1 => "4.2.2.1 está vivo"

Prefiero esto ya que es una salida más rápida y menos detallada que ping, la desventaja es que tendrá que instalarlo.

Puede usar cualquier dns público en lugar de un sitio web específico.

fping -q google.com && echo "do something because you're connected!"

-q devuelve un código de salida, así que solo estoy mostrando un ejemplo de ejecutar algo que estás en línea.

Para instalar en mac: brew install fping; en ubuntu: sudo apt-get install fping

 2
Author: Alex Moore-Niemi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-11 00:40:34

La respuesta más votada no funciona para macOS, por lo que para aquellos en una mac, he probado con éxito esto:

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

Probado en macOS High Sierra 10.12.6

 2
Author: Francisc0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-12 15:34:43

Este script bash busca continuamente Internet y emite un pitido cuando Internet está disponible.

#!/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
Author: Arjun G Perambra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-27 09:07:02

Pong no significa que el servicio web en el servidor se esté ejecutando; simplemente significa que el servidor está respondiendo a ICMP echo. Yo recomendaría usar curl y comprobar su valor de retorno.

 1
Author: tomoe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-02 13:55:25

Revisar la página de índice de Google es otra forma de hacerlo:

#!/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
 1
Author: dm76,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-03 18:18:47

De manera similar a la respuesta de@Jesse, esta opción podría ser mucho más rápida que cualquier solución que use ping y quizás un poco más eficiente que la respuesta de@Jesse.

find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'

Explicación:

Este comando usa find con -exec para ejecutar el comando en todos los archivos no nombrados *lo* en /sys/class/net/. Estos deben ser enlaces a directorios que contengan información sobre las interfaces de red disponibles en su máquina.

El comando que se ejecuta es un comando sh que comprueba el contenido del archivo carrier en esos directorios. El valor de $interface/carrier tiene 3 significados - Citando:

Parece Que hay tres estados:

  • ./ carrier no legible (por ejemplo, cuando la interfaz está desactivada en Network Manager).
  • ./ carrier contiene "1" (cuando la interfaz está activada y está conectada a una red WiFi)
  • ./ carrier contiene " 0 " (cuando la interfaz está activada y no está conectada a una WiFi red)

La primera opción no está atendida en @la respuesta de Jesse. El comando sh rayado es:

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

cat se utiliza para comprobar el contenido de carrier y redirigir toda la salida a la salida estándar incluso cuando falla porque el archivo no es legible. Si grep -q encuentra "1" entre esos archivos significa que hay al menos 1 interfaz conectada. El código de salida de grep -q será el código de salida final.

Uso

Por ejemplo, usando el estado de salida de este comando, puede usarlo iniciar un gnubiff en su ~/.xprofile solo si tiene una conexión a Internet.

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 &

Referencia

 1
Author: Doron Behar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-16 16:15:04

Si su objetivo es realmente verificar el acceso a Internet, muchas de las respuestas existentes a esta pregunta son defectuosas. Algunas cosas que debe tener en cuenta:

  1. Es posible que su computadora esté conectada a una red sin que esa red tenga acceso a Internet
  2. Es posible que un servidor esté inactivo sin que toda Internet sea inaccesible
  3. Es posible que un portal cautivo devuelva una respuesta HTTP para una URL arbitraria, incluso si no lo hace tener acceso a Internet

Con eso en mente, creo que la mejor estrategia es contactar varios sitios a través de una conexión HTTPS y devolver true si alguno de esos sitios responde.

Por ejemplo:

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
}

Uso:

if connected_to_internet; then
  echo "Connected to internet"
else
  echo "No internet connection"
fi

Algunas notas sobre este enfoque:

  1. Es robusto contra todos los falsos positivos y negativos que describí anteriormente
  2. Todas las solicitudes ocurren en paralelo para maximizar la velocidad
  3. devolverá false si técnicamente tiene acceso a Internet, pero DNS no funciona o su configuración de red está en mal estado, lo que creo que es una cosa razonable hacer en la mayoría de los casos
 0
Author: Ajedi32,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-04 13:25:05