假设远程服务器上有个网页http://localhost:8890/conductor/
。我想在本地计算机上浏览。
本地计算机和远程服务器都在一个局域网下(校园网)。
本地计算机是windows系统。
方法1:ssh端口转发
前文提到的假设情况,需要使用远程转发。假如我想把远程服务器上的端口8081转发到本地计算机的端口8082,则需要如下:
ssh -R 8082:localhost:8081 -N user_name@user_ip
则前文的假设需要的代码是:
ssh -R 8890:localhost:8890 -N user_name@user_ip
然后本地计算机可以直接访问到:http://localhost:8890/conductor/
注意点
- 需要远程计算机可以ssh访问本地计算机。
因此本地计算机需要安装openssh。win10离线安装openssh。已测有效。我用的离线是因为我电脑里直接通过应用搜索安装搜不到openssh服务器,如果能搜到就直接安。
- ssh不知道密码是什么。
注意密码是电脑账号密码,密码不能为空!微软官网有解答自动拒绝空密码的账户登录或连接。
其他服务器问题
本地可以ping远程的服务器,但服务器不能ping本地。已测有效。
win10安装telnet。已测有效。
方法2:借助包ngrok
目前了解的可以端口转发或者快速构建web并支持端口转发的包有ngrok、flask、uvicorn、gradio。
其中gradio用的ngrok。我主要查了下ngrok的用法。
ngrok安装
ngrok包可以绕过ssh。官网教程
ngrok的使用需要NGROK_AUTHTOKEN。可以在官网注册获得。
安装:wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.tgz
官网是直接在管理员账号下安装的。
但是我在远程服务器上没有管理员账号,所以我在个人账户下安装了ngrok。
个人账户下如果没有bin
目录可以手动创建。即~/bin
。以及把这个路径~/bin
放到环境变量path里。
tar xvzf ./ngrok-v3-stable-linux-amd64.tgz -C ~/bin
ngrok authtoken NGROK_AUTHTOKEN
NGROK_AUTHTOKEN是前文在官网注册后获得的token。
ngrok diagnose
可以诊断ngrok运行bug。
ngrok转发
直接远程服务器上运行:
ngrok http http://localhost:8890
可能报错:Running the agent with an http/s proxy is an enterprise feature. If this is unexpected, verify that there is no proxy_url value in your ngrok configuration file and that the http_proxy environment variable is not set.
这是因为设置了代理。这种情况下ngrok的运行需要付费。可以如下取消代理:
unset http_proxy
unset https_proxy
存在的问题:免费使用需要绕过代理
但是ngrok需要联网使用。我使用的远程服务器上是没有网的,需要用我本地计算机的代理。
报错9009
因此陷入了一个死循环:
ngrok不能用代理->关闭远程服务器的代理设置->远程服务器没网->ngrok需要有网->远程服务器需要设置代理->ngrok不能用代理。。。
stackflow上的相同情况
stackflow上说需要设置配置文件。官方文档
配置文件在~/.config/ngrok/ngrok.yml
。安装的时候就会自动生成。但是实际上配置里的proxy_url
是设置代理,可以被环境变量中的http_proxy
和https_proxy
覆盖。目前我没有找到能绕过代理的方式。ngrok官网的说法也是如果要基于代理就使用非免费版。
因此我最后没有用ngrok来转发。但是如果远程服务器上本来能联网不需要代理,可能可以正常使用ngrok。