![如何正確地為程式開啟 SSH 隧道並隨後將其關閉?](https://rvso.com/image/1388801/%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A2%BA%E5%9C%B0%E7%82%BA%E7%A8%8B%E5%BC%8F%E9%96%8B%E5%95%9F%20SSH%20%E9%9A%A7%E9%81%93%E4%B8%A6%E9%9A%A8%E5%BE%8C%E5%B0%87%E5%85%B6%E9%97%9C%E9%96%89%EF%BC%9F.png)
我想執行一個需要 SSH 隧道才能執行的命令(重複開啟 TCP 連線)。隧道存在後,需要再次關閉。我遇到的問題是:
我可以立即在後台運行該命令,但是我沒有可靠的方法來確保隧道已設定:
#!/bin/bash set -e ssh -N -L lport:server:port host & trap "kill $!" EXIT sleep 1 my program that connects to localhost:lport
常會出現開啟隧道時間超過1秒的情況。我也可以多花點時間,但是用戶體驗不是很好,而且仍然不可靠。
我可以在連接開啟時讓 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包含 Control Socket 和 ExitOnForwardFailure 的答案。