Dmy*_*yuk 1 ssh openssh ssh-tunneling shell-script port-forwarding
这里已经有一个很好的问题和答案,但我有一个不同的案例。
我使用以下命令创建隧道:
$ 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
Run Code Online (Sandbox Code Playgroud)
我正在获取有关分配端口的输出,但是,当我使用-f标志作为隧道背景时,我在stdout/strerr.
在这种情况下,有没有办法知道端口,而不需要在远程服务器上运行一些脚本或使用套接字,就像我上面链接的问题一样?
谢谢!
尝试使用该-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 root@164.92.194.26
Run Code Online (Sandbox Code Playgroud)
然而,尝试在变量中捕获它很快就会发现它被写入stderr而不是stdout。因此,最终的解决方案是这样的:
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"
Run Code Online (Sandbox Code Playgroud)
产生如下输出:
Port 42655 was allocated
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
277 次 |
| 最近记录: |