Comment puis-je vérifier la connexion Internet avant d'exécuter le script /etc/rc.local

8

Je souhaite utiliser le Raspberry Pi comme passerelle VPN. Le RPi se connecte à mon réseau domestique et Internet via wlan0, andn'importe quel appareil branché eth0obtient une connexion VPN. J'utilise pptp-linuxpour établir la connexion VPN et tout a bien fonctionné pendant ma phase de prototypage. Cependant, pour terminer le projet, j'ai mis la connexion VPN dans le /etc/rc.localscript afin qu'elle démarre au démarrage. Maintenant, il échoue 50% du temps. Je soupçonne qu'il tente la connexion VPN avant que je ne soit correctement connecté à Internet via wlan0. Si c'est le problème, j'ai besoin d'un test pour une connexion Internet valide au début rc.localavant de continuer avec le reste du script. Des idées sur la façon dont je pourrais faire cela?

user7848
la source
Vous pouvez ajouter un sleep 20avant votre script. Ou mieux, insérez votre script /etc/network/if-up.d. De cette façon, le script est exécuté une fois que l'interface réseau monte.
Gerben

Réponses:

7

De cette réponse StackOverflow ;

Envoyez un ping à votre passerelle locale;

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

tout en haut de ma tête:

  1. cingler votre routeur

  2. ping google.com

  3. ifconfigsortie grep pour passerelle valide et / ou adresse IP valide

lenik
la source
Vous auriez besoin grepdes pings pour une réponse valide. Dans une boucle de temps jusqu'à ce que toutes les conditions soient remplies. Pingler ne fera pas grand chose. Jivings a cité une bonne ligne de code.
Piotr Kula
@ppumkin pas besoin d'utiliser grep, ping utilise des codes de sortie pour vous informer des résultats, quelque chose commeping -qc 1 192.168.1.1 && echo ok || echo error
lenik
4

Basé sur un exemple de code Jivings et une partie de ma propre logique.

#!/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 bonne façon serait de créer une fonction qui renvoie un booléen sur le comparateur while. mais voici à quoi devrait ressembler la logique du shell.

Piotr Kula
la source
1

Debian utilise désormais upstart. C'est probablement une façon beaucoup plus simple de le faire que les scripts init.d.

Vous devrez peut-être essayer quelques services différents pour attendre, mais networking(si c'est le cas) ou network-managerpeut-être les bons à essayer en premier.

C'est pour Ubuntu, mais vous ne devriez pas trouver trop de différences http://upstart.ubuntu.com/cookbook/

KayEss
la source