¿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 no funciona? ¿Hay alguna verificación de conexión con el mundo?
¿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 no funciona? ¿Hay alguna verificación de conexión con el mundo?
Respuestas:
Sin ping
#!/bin/bash
wget -q --spider http://google.com
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
-q : modo de silencio
--spider : no lo consigas, solo verifica la disponibilidad de la página
PS: código de retorno de shell
0 : código de shell "Todo 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
nc
para asegurarse de que se agote. algo así comonc google.com 80 -w 10
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
function ping_gw() { ... && return 0 || return 1 }
y luego usarla así:ping_gw || (echo "no network, bye" && exit 1)
ifconfig down wlan0
y todavía tengo una puerta de enlace predeterminada y se puede hacer ping, aunque de hecho no puedo llegar al mundo exterior.
Super Gracias al usuario somedrew por su publicación aquí: https://bbs.archlinux.org/viewtopic.php?id=55485 en 2008-09-20 02:09:48
Mirar en / sys / class / net debe ser de una forma
Aquí está mi secuencia de comandos para probar una conexión de red que no sea el bucle de retorno. 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 avisa de un problema.
El siguiente script 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 los nuevos en bash: La declaración final 'if' prueba si NO [!] Está en línea y sale si este es el caso. Consulte man bash y busque "Las expresiones se pueden combinar" para obtener más detalles.
PD: Creo 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.
PPS The Above funciona en Ubuntu 12.04. Es posible que / sys no exista en algunas otras distribuciones. Vea 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 tradicionales UNIX y similares a Unix usan / sys como enlace simbólico al árbol de fuentes del kernel. [cita requerida]
De Wikipedia https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
cat /sys/class/net/wwan0/carrier
No funciona en ubuntu 14.04 LTS.
2>/dev/null
después cat /sys/class/net/$interface/carrier
para no tener una salida de error en caso de que la red esté desactivada.
Esto funciona tanto en MacOSX como en Linux:
#!/bin/bash
ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
ping: invalid option -- w
)
fping google.com
o simplemente fping 8.8.8.8
hace la magia con un bono, obtienes un código de estado sin la necesidad de probarlo (" google.com is alive
") ...
En Bash, usando su envoltorio de red a través de / dev / { udp , tcp } / host / port :
if : >/dev/tcp/8.8.8.8/53; then
echo 'Internet available.'
else
echo 'Offline.'
fi
( :
es el no-op de Bash, porque solo desea probar la conexión, pero no el procesamiento).
He escrito scripts antes de eso, simplemente use telnet para conectarse al puerto 80, luego transmita el texto:
HTTP/1.0 GET /index.html
seguido de dos secuencias CR / LF.
Siempre que obtenga algún tipo de respuesta HTTP, generalmente puede asumir que el sitio está funcionando.
La respuesta principal pasa por alto 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 acceder a algo en Internet. El OP pregunta cómo puede probar una conexión con el mundo. Por lo tanto, sugiero modificar la respuesta principal cambiando la IP de la puerta de enlace a una IP conocida (xyzw) que esté fuera de su LAN.
Entonces la respuesta sería:
ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error
También se eliminan las comillas inversas desfavorecidas para la sustitución de comandos [1] .
Si solo desea asegurarse de estar 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
asegúrese de que su red permita la entrada y salida del tráfico TCP, luego podría recuperar su IP pública con el siguiente comando
curl ifconfig.co
Ejecute el siguiente comando para verificar si un sitio web está activo y qué mensaje de estado muestra el servidor web:
$ curl -Is http://www.google.com |
head -1 HTTP/1.1 200 OK
El código de estado '200 OK' significa que la solicitud se ha realizado correctamente y se puede acceder a un sitio web.
curl -Is http://www.google.com | head -1 | grep 200; if [[ $? -eq 0 ]]; then; echo "Online"; else; echo "Offline"; fi;
Si su servidor de nombres local no funciona,
ping 4.2.2.1
es una IP siempre activa fácil de recordar (en realidad es un servidor de nombres, incluso).
La respuesta más votada no funciona para MacOS, por lo que para aquellos en una Mac, he probado esto con éxito:
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
route
comando a route -n get default 2> /dev/null | grep gateway
para evitar escribir un error en stderr cuando esté desconectado.
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
camino más corto: fping 4.2.2.1
=> "4.2.2.1 está vivo"
prefiero esto porque es una salida más rápida y menos detallada ping
, la desventaja es que tendrás que instalarlo.
puede utilizar 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, por lo que solo estoy mostrando un ejemplo de cómo ejecutar algo en línea.
para instalar en Mac: brew install fping
; en ubuntu:sudo apt-get install fping
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'
Este comando se usa find
con -exec
para ejecutar el comando en todos los archivos que no se nombran *lo*
en/sys/class/net/
. 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 sh
comando que verifica 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á deshabilitada en Network Manager).
- ./carrier contiene "1" (cuando la interfaz está activada y está conectada a una red WiFi)
- ./carrier contienen "0" (cuando la interfaz está activada y no está conectada a una red WiFi)
La primera opción no se atiende en la respuesta de @ Jesse . El sh
comando rayado es:
# Note: $0 == $interface
cat "$0"/carrier 2>&1
cat
se utiliza para comprobar el contenido 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.
Por ejemplo, usando el estado de salida de este comando, puede usarlo para 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 &
Si su objetivo es comprobar el acceso a Internet , muchas de las respuestas existentes a esta pregunta son erróneas. Algunas cosas que debe tener en cuenta:
Con eso en mente, creo que la mejor estrategia es contactar a varios sitios a través de una conexión HTTPS y devolver el valor verdadero 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:
if wait $pid;
. No tengo idea de por qué eso no funciona en su sistema. ¿Estás seguro de que estás usando bash?
wait
y ahora entiendo que el código de retorno se está probando. Volví a copiar tu código y hoy funciona. ¡Ups! Debo haber estropeado algo la última vez, aunque no puedo entender qué o cómo. Sin embargo, mea culpa. Disculpas
Esto es notablemente más rápido que cualquier solución publicada aquí y se puede utilizar para probar un host específico. .
El truco es resolver la IP utilizando un solucionador de DNS menos ocupado que el empleado por ping
:
validateConnection () {
host="${1}"
ip=$(getent ahostsv4 "${host}" | awk '{ print $1 }' | head -n1)
ping -c1 "${ip}" 2>&1 >"/dev/null"
if [ "${?}" -ne 0 ]; then
echo "No connection to: ${host}" >&2
exit 1
fi
}