从SSH连接的远程环境中在本地网页浏览器中打开URL,且URL是服务器的本机/内网地址。这是完全可以做到的,就像在本地进行软件开发一样。

这里介绍两种方法,一个是仅转发服务器本地端口,在本地浏览器打开运行。另一个是拦截服务器中打开浏览器相关命令,在本地浏览器中打开,且可以配合第一个方法实现本地浏览器打开服务器本地页面。

温馨提示,通过VScode的Remote-SSH插件可以像在本地开发一样编辑服务器上的代码(其它编辑器也有类似功能,例如neovim支持远程网络文件编辑),配合本文的方法可以做到本地调试服务器本地代码。

本地端口转发

ssh -L 8080:127.0.0.1:8080 root@192.168.1.1

SSH具有本地端口转发功能,可以将远程的指定端口的数据转发到发起SSH的计算机,直接调试服务器上的URL。

SSH的-L参数分别是本地端口:目标主机:目标主机端口

上述命令即将服务器的8080端口绑定到本地的8080端口,因此在执行了SSH命令后,可以在本地浏览器访问localhost:8080,访问的内容是远程服务器的内容。这里非常适合做WebRTC的调试,因为此类调用摄像头权限的页面必须通过localhost或SSL(https://)访问。

web.png

上面只执行了三条命令:

ssh -L 8000:127.0.0.1:8000 root@192.168.6.7绑定了本地8000端口到服务器8000端口并通过SSH进入服务器。

echo "Hello World" >> index.html创建了index.html文件,内容为Hello World

python3 -m http.server 8000 --bind 127.0.0.1,通过python3创建一个web静态资源服务器,监听8000端口。

然后在本地浏览器打开http://localhost:8000,我们发现浏览器可以访问到服务器中的内容但却不需要通过服务器的IP地址。

从SSH远程唤起本地浏览器打开URL

如果远程服务器某个命令是唤起图形桌面系统(GNOME、Xfce、KDE等可视化桌面环境,借助X11等桌面图形后端)浏览器才可以运行的程序,例如Tabnine这个AI辅助编程的插件,通过SSH在服务中用非图形编辑器(vim/neovim/emacs)调试代码,如果需要运行Tabnine的设置页面,默认情况下是无法打开的。

原因是Tabnine的设置需要通过本地浏览器打开带有随机URL参数的URL,因此是通过执行某个Tabnine设置的命令后自动唤起的服务器,用户实现并不知道设置界面的请求地址。

例如,在Neovim中执行:CmpTabnineHub的底层命令如下:

/root/.local/share/nvim/site/pack/packer/opt/cmp-tabnine/binaries/4.4.40/x86_64-unknown-linux-musl/TabNine-deep-local --settings /root/.config/TabNine/local.settingsSmall --settings-version 1 --client cmp.vim

Tabnine会启动对本地5050端口的监听并唤起本地浏览器打开一个带有随机参数的URL。

因此我们可以借助opener这个开源项目实现从SSH远程唤起本地浏览器打开URL。

需要注意的是,opener目前只支持MacOS,而远程SSH的服务器支持Linux和MacOS,如果是其它本地操作系统,可以参考拦截SSH远程服务器中open或者xdg-open命令的思路。因为程序唤起浏览器必定是调用了某个唤起浏览器的API或者命令。

Q: 在SSH已经连接上,重启程序的时候,或者尚未监听端口的时候,出现类似channel 5: open failed: connect failed: Connection refused的报错信息,影响开发调试,如何关闭?

A: 可以通过在SSH连接命令增加-q进入静默模式,或者-o LogLevel=ERROR屏蔽Fail类型报错。也可以修改.ssh/config文件,添加LogLevel=ERROR