平时看到各种云平台提供的 Web 终端操作页面,觉得还挺有意思,恰好最近要实现一个类似的玩意。
由于前端不是我擅长的方向,所以我的前端并没有使用什么高大上的东西,也没有什么美观可言,仅仅使用了 WebSocket 进行命令的传输(可以用 xterm.js 来做前端,有空再玩玩吧)。终端的关键在于命令的处理,压力都来到 WebSocket 服务端这边。
最初的方案是打算在所有的远程服务器都部署专门处理命令的服务,而 WebSocket 服务端则将命令发送给该服务,这有点像 noVNC 了吧,不过这个方案实在是太繁琐了,而且远程服务器有增减时徒增工作。当然,远程服务器能被控制,必须需要向外提供服务,既然自己做的服务麻烦,何不使用服务器普遍都有的服务 SSH 呢?于是方案最终确定为”WebSocket+SSH”。以下就是整个服务的工作流程图。
其实最初的方案跟最终的方案相差并不大,主要是代理服务器和目标服务器之间的传输协议不同罢了,工作流程是一致的。
具体的工作流程:用户使用 SSH 密钥登录,成功之后代理服务端已经为用户提前准备好了 SSH 连接;接着使用 token 来建立 WebSocket 连接,这时代理服务端就可以通过 token 对 WebSocket 连接和 SSH 连接进行关联;假设用户输入的命令没有经过任何处理,WebSocket 服务端将协议消息解析得到命令之后就可以直接通过 SSH 连接转发给远程服务器;命令的执行结果沿着反方向传输到用户的页面上。