Como abrir corretamente um túnel SSH para um programa e fechá-lo depois?

Como abrir corretamente um túnel SSH para um programa e fechá-lo depois?

Quero executar um comando que precisa de um túnel SSH para funcionar (abrindo conexões TCP repetidamente). Depois de existir, o túnel precisa ser fechado novamente. Os problemas que encontrei são:

  1. Posso executar o comando em segundo plano imediatamente, mas não tenho uma maneira confiável de ter certeza de que o túnel foi configurado:

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

    Muitas vezes acontece que a abertura do túnel demora mais de 1s. Eu também poderia dedicar mais tempo, mas a experiência do usuário não é muito boa e ainda não é confiável.

  2. Posso deixar o SSH entrar em segundo plano quando a conexão for aberta, mas não consigo encontrar uma maneira confiável de eliminá-lo depois, porque não conheço o PID do processo SSH em 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 uma maneira de detectar o PID do processo SSH?

Ou existe outra maneira melhor de resolver a tarefa?

Responder1

Verhttps://stackoverflow.com/questions/2241063/bash-script-to-setup-a-temporary-ssh-tunnelpara respostas contendo Control Socket e ExitOnForwardFailure.

informação relacionada