¿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?
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:)
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
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
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
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
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.
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
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).
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
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.
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.
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
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
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
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.
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
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
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:
- Es posible que su computadora esté conectada a una red sin que esa red tenga acceso a Internet
- Es posible que un servidor esté inactivo sin que toda Internet sea inaccesible
- 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:
- Es robusto contra todos los falsos positivos y negativos que describí anteriormente
- Todas las solicitudes ocurren en paralelo para maximizar la velocidad
- 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
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