paquetes - ¿Cómo verificar el acceso a internet usando bash script en linux?
ping linux opciones (8)
ping
confiable en un script bash separado:
#!/bin/bash
ipaddr=''8.8.8.8'' # Google''s public DNS server
[[ -z `ping -c1 $ipaddr |& grep -o ''Network is unreachable''` ]] || exit 1
[[ -z `ping -c3 $ipaddr |& grep -o ''100% packet loss''` ]] && exit 0 || exit 1
Pon esto en un guión separado. Manejará diferentes situaciones de red, ya que (1) no está conectado a una red, (2) está conectado a la red pero no puede acceder a Internet (o al menos a Google), y (3) está conectado a Internet.
Luego puede usar el exit code
de exit code
del script para verificar la conectividad, por ejemplo,
~$ script-name && echo online || echo offline
En mi escuela, Internet no está disponible (todas las noches, después de las 23: 0, la escuela eliminará Internet, para colocarnos en la cama> .. <), luego el ping nunca se detendrá, aunque he usado el parámetro ping -w1 ...
Es decir, cuando uso: ping -q -w1 -c1 8.8.8.8
para verificar si Internet está arriba / abajo, estará allí sin salida y no saldrá, como si estuviera usando un solo cat
.
¿Puedes entender mi pregunta? No sé por qué es así, pero creo que el problema está relacionado con el servicio de Internet de la escuela . ¿Cualquier sugerencia? (Creo que wget
puede ser una buena alternativa, pero ¿cómo usarlo?)
Instale fping:> menos problema luego haga ping.
fping google.com | grep alive
para usar, por ejemplo, como:
#!/bin/bash
itest=$(fping google.com | grep alive)
while [ "$itest" == "" ]
do
sleep 5
itest=$(fping google.com | grep alive)
done
echo now online
Si la escuela realmente apaga su enrutador en lugar de redirigir todo el tráfico a una página de "por qué no estás en la cama", entonces no es necesario descargar una página web completa ni enviar encabezados HTTP. Todo lo que tienes que hacer es simplemente hacer una conexión y comprobar si alguien está escuchando.
nc -z 8.8.8.8 53
Esto dará como resultado "La conexión al 8.8.8.8 puerto 53 [tcp / dominio] se realizó correctamente" y devuelve un valor de 0 si alguien está escuchando.
Si quieres usarlo en un script de shell:
nc -z 8.8.8.8 53 >/dev/null 2>&1
online=$?
if [ $online -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
Usando el ejemplo anterior, escribí este script para registrar el estado de su conexión: https://gist.github.com/cganterh/ffc2fffa8263857cbece
Primero, guarde el siguiente código en un archivo name.sh
#!/bin/bash
while true
do
wget -q --tries=10 --timeout=20 -O - http://google.com > /dev/null
if [[ $? -eq 0 ]]; then
echo $(date) "1" | tee -a log.csv
else
echo $(date) "0" | tee -a log.csv
fi
sleep 5
done
Luego, ejecute el archivo name.sh
en la terminal, luego verifique la información de estado del registro en log.csv
de la misma carpeta.
Utilice la opción de tiempo de espera -t
:
ping -q -t 5 -w1 -c1 8.8.8.8 t
Utilizando wget:
#!/bin/bash
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
echo "Online"
else
echo "Offline"
fi
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
Disfrutar;)
#!/bin/bash
INTERNET_STATUS="UNKNOWN"
TIMESTAMP=`date +%s`
while [ 1 ]
do
ping -c 1 -W 0.7 8.8.4.4 > /dev/null 2>&1
if [ $? -eq 0 ] ; then
if [ "$INTERNET_STATUS" != "UP" ]; then
echo "UP `date +%Y-%m-%dT%H:%M:%S%Z` $((`date +%s`-$TIMESTAMP))";
INTERNET_STATUS="UP"
fi
else
if [ "$INTERNET_STATUS" = "UP" ]; then
echo "DOWN `date +%Y-%m-%dT%H:%M:%S%Z` $((`date +%s`-$TIMESTAMP))";
INTERNET_STATUS="DOWN"
fi
fi
sleep 1
done;
la salida producirá algo como:
bash-3.2$ ./internet_check.sh
UP 2016-05-10T23:23:06BST 4
DOWN 2016-05-10T23:23:25BST 19
UP 2016-05-10T23:23:32BST 7
el número al final de una línea muestra la duración del estado anterior, es decir, 19 arriba, 7 segundos abajo