首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保存SSH隧道的动态分配端口

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

Unix & Linux用户
提问于 2023-01-05 14:51:24
回答 1查看 139关注 0票数 1

已经有了一个很好的问题和答案,但是我有一个不同的案例。

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

代码语言:javascript
复制
$ ssh -N -R 0:192.168.0.16:80 root@164.92.194.26
Allocated port 35007 for remote forward to 192.168.0.16:80

但是,当我使用-f标志作为隧道背景时,I在 stdout/strerr中没有输出。

在这种情况下,有没有一种方法可以知道端口,而不需要在远程服务器上运行一些脚本,或者使用类似于问题一:上文所述中的套接字?

谢谢!

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2023-01-05 17:18:43

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

-f请求ssh在执行命令之前转到后台。

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

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

这意味着如果没有这个设置,命令就会立即进入后台,这就是为什么它不能向您报告所分配的端口。

这将导致修改命令,该命令实际上报告了诸如Allocated port 1234 for remote forward to 192.168.0.16:80这样的消息:

代码语言:javascript
复制
ssh -o ExitOnForwardFailure=yes -fN -R 0:192.168.0.16:80 root@164.92.194.26

但是,试图在变量中快速捕获它,可以确定它是被写入stderr而不是stdout的。因此,最后的解决办法是:

代码语言:javascript
复制
port=$(
    ssh -o ExitOnForwardFailure=yes -fN -R 0:192.168.0.16:80 root@164.92.194.26 2>&1 |
    awk '/Allocated/{print $3+0}'
)
[ -n "$port" ] && echo "Port $port was allocated"

结果产生这样的输出:

代码语言:javascript
复制
Port 42655 was allocated
票数 5
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/730658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档