Wie öffnet man einen SSH-Tunnel für ein Programm richtig und schließt ihn anschließend?

Wie öffnet man einen SSH-Tunnel für ein Programm richtig und schließt ihn anschließend?

Ich möchte einen Befehl ausführen, der für seinen Betrieb einen SSH-Tunnel benötigt (mehrmaliges Öffnen von TCP-Verbindungen). Nachdem der Tunnel existiert, muss er wieder geschlossen werden. Die Probleme, auf die ich gestoßen bin, sind:

  1. Ich kann den Befehl sofort im Hintergrund ausführen, habe dann aber keine zuverlässige Möglichkeit, sicherzugehen, dass der Tunnel eingerichtet wurde:

    #!/bin/bash
    set -e
    ssh -N -L lport:server:port host &
    trap "kill $!" EXIT
    sleep 1
    my program that connects to localhost:lport
    

    Es kommt häufig vor, dass das Öffnen des Tunnels länger als 1 Sekunde dauert. Ich könnte auch mehr Zeit einplanen, aber dann ist das Benutzererlebnis nicht besonders gut und es ist immer noch unzuverlässig.

  2. Ich kann SSH in den Hintergrund laufen lassen, wenn die Verbindung geöffnet wird, aber ich finde keine zuverlässige Möglichkeit, es anschließend zu beenden, weil ich die PID des SSH-Hintergrundprozesses nicht kenne:

    #!/bin/bash
    set -e
    ssh -f -N -L lport:server:port host
    # I'd set up a trap ??? EXIT, but for what?
    my program that connects to localhost:lport
    

    Gibt es eine Möglichkeit, die PID des SSH-Prozesses zu erkennen?

Oder gibt es eine andere, bessere Möglichkeit die Aufgabe zu lösen?

Antwort1

Sehenhttps://stackoverflow.com/questions/2241063/bash-script-to-setup-a-temporary-ssh-tunnelfür Antworten, die Control Socket und ExitOnForwardFailure enthalten.

verwandte Informationen