ssh不仅仅可以用来登录远程主机,而且可以搭建本机到远端机的加密的信息通道,从而实现在本地调试外网php代码和nodejs代码。
一、ssh的基本用法:
- ssh user@88.88.88.88 登录到远端主机
- ssh user@88.88.88.88 xxxCmd 登录到远端主机并执行xxxCmd命令
- ssh -R localhost:9001:localhost:9001 user@88.88.88.88 通过ssh登录到远端主机,并在远端主机上面监听9001端口,任何流入远端主机9001的信息都将通过ssh隧道传输到本机上的9001端口
- ssh -L localhost:9229:192.168.2.10:9229 user@88.88.88.88 通过ssh登录到远端主机,并在本地主机上面监听9229端口,任何流入本机9002端口的信息都将通过ssh隧道传输到远端机上,并再转发给192.168.2.10的9229端口
二、利用ssh隧道开启远程php-xdebug调试
- 修改远端机ssh配置,在/etc/ssh/sshd_config中添加GatewayPorts yes,并重启ssh服务。
sudo systemctl restart ssh
- 远端机上php安装xdebug扩展,并开启调试。不清楚的话,可以看我写的另一篇文章PHP开启Xdebug调试指南。
- 本地机器上安装好Phpstorm,并配置好xdebug调试选项。不清楚的话,可以看我写的另一篇文章PHP开启Xdebug调试指南。
- 搭建本地到远端机器的ssh隧道。
ssh -p 2222 -R localhost:9001:localhost:9001 user@88.88.88.88
- 最后在本机IDE上开启调试监听,就可以了。
原理其实也很简单,就是利用ssh建立的隧道,将远端的9001端口和本地的9001端口打通。远端的xdebug向它所在机器的9001端口发送的dbpg协议消息都被转发到了本机的9001端口,本机收到消息后,再通过ssh隧道向远端机xdebug回消息。整个过程就好像本机调试一样的,xdebug扩展和本机的IDE都以为进行的是本机调试。
三、利用ssh隧道开启远程nodejs调试
-
在远端机执行node --inspect-brk=0.0.0.0:9229 test.js
test.js的内容如下 :
test.js.png
-
在本机chrome上访问http://remote.example.com:9229/json/list,出现类似如下响应的json,则表明正常。
[ {
"description": "node.js instance",
"devtoolsFrontendUrl": "chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=xx.xx.xx.xx:9229/c230d667-3733-42dc-9293-a5e657f15a9a",
"faviconUrl": "https://nodejs.org/static/favicon.ico",
"id": "c230d667-3733-42dc-9293-a5e657f15a9a",
"title": "test.js",
"type": "node",
"url": "file:///data1/www/tmp/test.js",
"webSocketDebuggerUrl": "ws://xx.xx.xx.xx:9229/c230d667-3733-42dc-9293-a5e657f15a9a"
} ]
- 搭建远端机器到本地的ssh隧道
ssh -L localhost:9229:localhost:9229 user@remote.example.com
- 本机上打开chrome,访问chrome://inspect,发现
Remote Target
下面多出来test.js标签。如下图所示:
chrome-inspect.png
点击蓝色inspect
,会出现源代码调试窗口,打上断点就可以调试了。

原理同上

网友评论