Wie kann ich die Internetverbindung überprüfen, bevor ich das Skript /etc/rc.local ausführe?

8

Ich möchte den Raspberry Pi als VPN-Gateway verwenden. Das RPi stellt über wlan0, andjedes angeschlossene Gerät eth0eine Verbindung zu meinem Heimnetzwerk und dem Internet her und erhält eine VPN-Verbindung. Ich verwende pptp-linux, um die VPN-Verbindung herzustellen, und während meiner Prototyping-Phase hat alles einwandfrei funktioniert. Um das Projekt abzuschließen, habe ich die VPN-Verbindung in das /etc/rc.localSkript eingefügt, damit sie beim Booten startet. Jetzt schlägt es 50% der Zeit fehl. Ich vermute, dass versucht wird, die VPN-Verbindung herzustellen, bevor ich ordnungsgemäß über das Internet verbunden bin wlan0. Wenn dies das Problem ist, benötige ich zu Beginn einen Test für eine gültige Internetverbindung, rc.localbevor ich mit dem Rest des Skripts fortfahre. Irgendwelche Ideen, wie ich das machen könnte?

user7848
quelle
Sie können ein sleep 20vor Ihrem Skript hinzufügen . Oder besser, setzen Sie Ihr Skript ein /etc/network/if-up.d. Auf diese Weise wird das Skript ausgeführt, sobald die Netzwerkschnittstelle hochgefahren ist.
Gerben

Antworten:

7

Aus dieser StackOverflow-Antwort ;

Pingen Sie Ihr lokales Gateway an.

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

direkt auf meinem Kopf:

  1. Pingen Sie Ihren Router

  2. ping google.com

  3. grep- ifconfigAusgabe für gültiges Gateway und / oder gültige IP-Adresse

lenik
quelle
Sie müssten grepdie Pings für eine gültige Antwort. In einer while-Schleife, bis alle Bedingungen erfüllt sind. Nur Ping macht nicht viel. Jivings zitierte eine gute Codezeile.
Piotr Kula
@ppumkin keine Notwendigkeit zu verwenden grep, Ping verwendet Exit-Codes, um Sie über die Ergebnisse zu ping -qc 1 192.168.1.1 && echo ok || echo error
informieren
4

Basierend auf Jivings Beispielcode und einigen meiner eigenen Logik.

#!/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...

Der richtige Weg wäre, eine Funktion zu erstellen, die einen Booleschen Wert für den while-Komparator zurückgibt. Aber so sollte die Shell-Logik aussehen.

Piotr Kula
quelle
1

Debian verwendet jetzt Upstart. Dies ist wahrscheinlich eine viel einfachere Methode als init.d-Skripte.

Möglicherweise müssen Sie einige verschiedene Dienste ausprobieren, um darauf zu warten, aber networking(falls vorhanden) odernetwork-manager es sollten gute sein, die Sie zuerst ausprobieren sollten.

Dies ist für Ubuntu, aber Sie sollten nicht zu viele Unterschiede finden http://upstart.ubuntu.com/cookbook/

KayEss
quelle