如何正确地为程序打开 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:

    #!/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-tunnel包含控制套接字和 ExitOnForwardFailure 的答案。

相关内容