¿Cómo puedo verificar la conexión a Internet antes de ejecutar /etc/rc.local script

8

Quiero usar Raspberry Pi como una puerta de enlace VPN. El RPi se conecta a mi red doméstica e Internet a través de wlan0, andcualquier dispositivo conectado eth0obtiene una conexión VPN. Estoy usando pptp-linuxpara hacer la conexión VPN y todo funcionó bien durante mi etapa de creación de prototipos. Sin embargo, para completar el proyecto, puse la conexión VPN en el /etc/rc.localscript para que comience en el arranque. Ahora falla el 50% del tiempo. Sospecho que está intentando la conexión VPN antes de conectarme correctamente a Internet a través de wlan0. Si este es el problema, necesito una prueba para una conexión a Internet válida al comienzo rc.localantes de continuar con el resto del script. ¿Alguna idea de cómo podría hacer esto?

usuario7848
fuente
Puede agregar un sleep 20antes de su secuencia de comandos. O mejor, pon tu guión /etc/network/if-up.d. De esa forma, el script se ejecuta una vez que la interfaz de red sube.
Gerben

Respuestas:

7

De esta respuesta de StackOverflow ;

Haga ping a su puerta de enlace local;

#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
Jivings
fuente
4

justo en la parte superior de mi cabeza:

  1. haga ping a su enrutador

  2. ping google.com

  3. ifconfigsalida grep para puerta de enlace válida y / o dirección IP válida

lenik
fuente
Necesitaría greplos pings para una respuesta válida. En un bucle while hasta que se cumplan todas las condiciones. Hacer ping no hará mucho. Jivings citó una buena línea de código.
Piotr Kula
@ppumkin no es necesario usarlo grep, el ping usa códigos de salida para informarle sobre los resultados, algo así comoping -qc 1 192.168.1.1 && echo ok || echo error
lenik
4

Basado en el código de muestra Jivings y parte de mi propia lógica.

#!/bin/bash

STATE="error";

while [  $STATE == "error" ]; do
    #do a ping and check that its not a default message or change to grep for something else
    STATE=$(ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error)

    #sleep for 2 seconds and try again
    sleep 2
 done

#put your VPN code here...

La forma correcta sería crear una función que devuelva un valor booleano en el comparador while. pero así es como debería verse la lógica de shell.

Piotr Kula
fuente
1

Debian ahora usa advenedizo. Esta es probablemente una forma mucho más simple de hacerlo que los scripts init.d.

Es posible que deba probar algunos servicios diferentes para esperar, pero networking(si está allí) o network-managerpodría ser uno bueno para probar primero.

Esto es para Ubuntu, pero no debería encontrar demasiadas diferencias http://upstart.ubuntu.com/cookbook/

KayEss
fuente