プログラムの SSH トンネルを適切に開き、その後閉じるにはどうすればよいでしょうか?

プログラムの SSH トンネルを適切に開き、その後閉じるにはどうすればよいでしょうか?

操作に SSH トンネルを必要とするコマンド (TCP 接続を繰り返し開く) を実行したいのですが、トンネルが存在した後、再び閉じる必要があります。私が遭遇した問題は次のとおりです。

  1. コマンドをすぐにバックグラウンドで実行することはできますが、トンネルが設定されていることを確認する信頼できる方法はありません。

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

    トンネルを開くのに 1 秒以上かかることがよくあります。さらに時間をかけることもできますが、ユーザー エクスペリエンスはあまり良くなく、信頼性も低くなります。

  2. 接続が開かれたときに SSH 自体をバックグラウンドにすることはできますが、バックグラウンド SSH プロセスの PID がわからないため、その後 SSH を強制終了する確実な方法が見つかりません。

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

    SSH プロセスの PID を検出する方法はありますか?

それとも、タスクを解決する別のより良い方法がありますか?

答え1

見るhttps://stackoverflow.com/questions/2241063/bash-script-to-setup-a-temporary-ssh-tunnelControl Socket および ExitOnForwardFailure を含む回答の場合。

関連情報