我想默认使用 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
经过一番搜索,我发现维基教科书测试可以通过以下方式完成:
- 使用 ControlMaster 文件创建端口转发
ssh -f -N -M -S /tmp/ssh_pf_%r-%h-%p -L 8080:127.0.0.1:8080 server
和,
- 使用 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
可能有更好的选择,但到目前为止这似乎有效。