如何在React中实现可交互SSH终端,支持基于密钥自动连接指定服务器
现成方案说明
目前没有开箱即用、可纯前端集成的一站式WebSSH npm包,核心原因是浏览器JavaScript受沙箱限制,无法直接发起原生TCP连接,而SSH协议基于TCP传输,所以所有WebSSH方案都需要后端代理层做协议转发,你之前看到的独立server实例本质就是承担这个TCP代理的作用,你不需要用第三方的完整独立服务,自己实现轻量的代理层即可,前端可以完全集成进现有React项目。
你提到的两个库刚好可以配合完成实现,完全可以作为npm依赖引入:
xterm.js负责终端交互渲染,是绝大多数Web终端产品的底层依赖,支持全功能的终端交互、快捷键、颜色渲染、自定义样式,有官方封装的React绑定可以直接用ssh2负责SSH协议处理,原生支持密钥认证、shell流管理,和xterm.js做流绑定即可实现交互能力
具体实现步骤
前端React端实现
- 安装所需依赖:
npm install @xterm/xterm @xterm/react @xterm/addon-fit
- 初始化xterm终端实例,挂载到React组件中,监听用户的输入事件
- 建立和后端接口的WebSocket连接,把xterm监听到的用户输入实时发送到后端
- 监听WebSocket的返回消息,把SSH服务端返回的内容写入xterm实例,渲染到页面上
后端代理层实现(可复用现有项目的后端服务,无需独立部署)
- 安装ssh2依赖:
npm install ssh2
- 新增WebSocket接口,接收前端传的目标服务器地址、端口、私钥等认证信息
- 调用ssh2的Client实例发起SSH连接,配置密钥认证参数,连接成功后创建交互式shell会话
- 监听shell的
data事件,把SSH服务端返回的输出通过WebSocket推送给前端 - 监听WebSocket收到的前端输入消息,写入shell的输入流即可完成双向交互
密钥认证适配
ssh2原生支持密钥认证,只需要在创建SSH连接时把privateKey参数配置为用户的私钥内容即可,也支持传入passphrase参数解密受保护的私钥,无需额外开发适配。
简化方案
如果不想自己从零实现代理层逻辑,也可以把第三方WebSSH项目的代理层代码单独抽离出来复用,前端还是用你自己的xterm实现和React项目集成,不需要用iframe嵌入完整服务。
内容的提问来源于stack exchange,提问作者Felixkruemel
相关产品推荐
相关产品推荐

