¿Cómo abrir correctamente un túnel SSH para un programa y cerrarlo luego?

¿Cómo abrir correctamente un túnel SSH para un programa y cerrarlo luego?

Quiero ejecutar un comando que necesita un túnel SSH para su funcionamiento (abrir conexiones TCP repetidamente). Una vez que exista, el túnel deberá cerrarse nuevamente. Los problemas que encontré son:

  1. Puedo ejecutar el comando en segundo plano inmediatamente, pero no tengo una forma confiable de estar seguro de que el túnel se ha configurado:

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

    A menudo sucede que abrir el túnel tarda más de 1 segundo. También podría dedicar más tiempo, pero la experiencia del usuario no es muy buena y aún así no es confiable.

  2. Puedo dejar que SSH se ponga en segundo plano cuando se abre la conexión, pero luego no puedo encontrar una forma confiable de eliminarlo después, porque no conozco el PID del proceso SSH en segundo plano:

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

    ¿Existe alguna forma de detectar el PID del proceso SSH?

¿O hay otra forma mejor de resolver la tarea?

Respuesta1

Verhttps://stackoverflow.com/questions/2241063/bash-script-to-setup-a-temporary-ssh-tunnelpara obtener respuestas que contengan Control Socket y ExitOnForwardFailure.

información relacionada