如何仅在地址/端口可用时进行 SSH 端口转发?

如何仅在地址/端口可用时进行 SSH 端口转发?

我想默认使用 ssh 和端口转发。因此,我将以下 ssh 命令添加到脚本中(使用虚构的服务器名称):

ssh -f -N user@server -L 8080:server:8080

server远程服务器在哪里。一切正常,除了如果脚本第二次运行,ssh 会抱怨

bind [127.0.0.1]:8080: Address already in use

有没有办法告诉ssh仅当端口/地址可用时才进行测试和进行端口转发?

答案1

经过一番搜索,我发现维基教科书测试可以通过以下方式完成:

  1. 使用 ControlMaster 文件创建端口转发

ssh -f -N -M -S /tmp/ssh_pf_%r-%h-%p -L 8080:127.0.0.1:8080 server

和,

  1. 使用 ControlMaster 文件测试是否已建立连接:

ssh -O check -S /tmp/ssh_pf_%r-%h-%p server

综上所述,仅当尚未建立连接时,以下内容才会建立连接(我猜,节省了第二次连接尝试):

if ! ssh -O check -S /tmp/ssh_pf_%r-%h-%p server ;
then ssh -f -N -M -S /tmp/ssh_pf_%r-%h-%p -L 8080:127.0.0.1:8080 server ; fi

正如指出的这个答案,使用 ControlMaster 文件还可以轻松关闭连接,如下所示:

ssh -O exit -S /tmp/ssh_pf_%r-%h-%p server

可能有更好的选择,但到目前为止这似乎有效。

相关内容