保存SSH隧道动态分配的端口

保存SSH隧道动态分配的端口

已经有一个很好的问题和答案在这里,但我有一个不同的情况。

我使用以下命令创建隧道:

$ ssh -N -R 0:192.168.0.16:80 [email protected]
Allocated port 35007 for remote forward to 192.168.0.16:80

我正在获取有关分配端口的输出,但是,当我使用-f标志作为隧道背景时,我没有输出stdout/strerr

在这种情况下,有没有办法知道端口,而无需在远程服务器上运行一些脚本或使用套接字(如我上面链接的问题

谢谢!

答案1

尝试使用-f标志确实可以阻止以其他方式给出的报告。查看文档(man ssh,搜索-f),我们可以看到

-f请求ssh在命令执行之前进入后台。

但在下一段中我们可以读到,

如果ExitOnForwardFailure配置选项设置为yes,则启动的客户端-f将等待所有远程端口转发成功建立,然后再将其置于后台。

这意味着如果没有此设置,该命令会立即将其自身置于后台,这就是它无法向您报告分配的端口的原因。

这导致了一个修改后的命令,它确实报告了一条消息,例如Allocated port 1234 for remote forward to 192.168.0.16:80

ssh -o ExitOnForwardFailure=yes -fN -R 0:192.168.0.16:80 [email protected]

然而,尝试在变量中捕获它可以快速识别出它正在被写入标准错误而不是标准输出。因此,最终的解决方案是这样的:

port=$(
    ssh -o ExitOnForwardFailure=yes -fN -R 0:192.168.0.16:80 [email protected] 2>&1 |
    awk '/Allocated/{print $3+0}'
)
[ -n "$port" ] && echo "Port $port was allocated"

产生如下输出:

Port 42655 was allocated

相关内容