Warten Sie, bis der SSH-Tunnel (ssh -w) eingerichtet ist, bevor Sie den Befehl ausführen

7

Gibt es bei Verwendung des SSH-VPN-Tunnels (Option -w) eine Möglichkeit, festzustellen, wann der Tunnel tatsächlich aktiv ist? Ich möchte dies in einem Skript verwenden, das den Tunnel automatisch einrichtet, indem ssh -w und dann ifup [1] ausgeführt werden.

Die Option -f hilft nicht, da sie nach dem Herstellen einer Verbindung zum Server, aber bevor der Tunnel aktiv ist, zurückgegeben wird. Ein paar Sekunden schlafen funktioniert, aber es fühlt sich einfach zu hackig an.

Die LocalCommand-Option scheint zu funktionieren, zum Beispiel:

ssh -w 0:1 "-oLocalCommand=ifup tun0" "-oPermitLocalCommand=yes" myserver.example.org true

Auf der Manpage heißt es jedoch: "Der Befehl wird synchron ausgeführt und hat keinen Zugriff auf die Sitzung des SSH (1), der ihn erzeugt hat." Funktioniert der oben genannte Aufruf garantiert oder war es nur ein Glück, dass LocalCommand ausgeführt wurde, nachdem der Tunnel eingerichtet wurde?

Was noch wichtiger ist: Gibt es eine Standardmethode für die Verwendung von ssh -w in Skripten?

[1] ich auf Fedora bin, ifup funktioniert , weil ich eingerichtet haben /etc/sysconfig/network-scripts/ifcfg-tun0und /etc/sysconfig/network-scripts/route-tun0

imgx64
quelle

Antworten:

1

Ich sehe also, dass es hier zwei Fragen gibt: 1) Wie man wartet, bis der Tunnel tatsächlich hoch ist, oder wie man weiß, dass er tatsächlich hoch ist. 2) Wenn es eine Standardmethode zum Konfigurieren eines SSH-Tunnels in Fedora gibt.

Über 1): Ich persönlich würde einfach so etwas verwenden wie:

timeout=2 # Wait for two seconds for a reply.
ip=192.168.0.1 # Use IP address assigned to tunnel endpoint.
while ! ping -W "$timeout" -c 1 "$ip" &>/dev/null; do
  echo "Waiting for tunnel to be up..."
  sleep 0.5
done
echo "Tunnel is up."

Sie können schicker werden, indem Sie eine forSchleife mit einer konfigurierten Anzahl von Versuchen verwenden oder so etwas wie -I tun0an den Ping-Befehl übergeben, um die Verwendung des Tun-Geräts zu erzwingen.

Ein Grund, warum ich diesen Ansatz bevorzuge, ist, dass die Tatsache, dass der Tunnel selbst nicht notwendig ist, nicht bedeutet, dass Kommunikation stattfinden wird. Es kann zu Paketverlust, Iptables-Regeln, Routenkonfigurationsfehlern usw. kommen. Ich würde darauf achten, dass das Skript beendet wird, wenn es hängt, und sicherstellen, dass alle Befehle, für die der Tunnel erforderlich ist, eine Timeout- / Wiederholungsstrategie haben.

Über 2): Ich kenne keinen Standardmechanismus zum Konfigurieren von SSH-Tunneln in einer Distribution. Das heißt nicht, dass sie nicht existieren. In der Vergangenheit habe ich Autossh verwendet .

rabexc
quelle