SSH 插件是基于主站 CMDB 资产拓扑模型构建的内置微服务插件,提供在线终端(Web Shell)与文件管理(SFTP)的业务处理能力。
插件在主站中注册两个关联的资源动作(Action):
terminal(SSH 终端):基于 Web Socket 传输的在线终端。sftp(文件管理):提供文件预览、上传、下载、重命名、归档等文件管理功能。
插件的元数据声明(definition.go)向主站同步注册了以下拓扑模型与关联关系:
- 模型定义:
host(主机):包含 IP、端口、登录账号及加密存储的密码、私钥等基础信息。AuthGateway(登录网关/跳板机):包含网关地址、网关登录账号、加密密码和私钥等。
- 拓扑关系:
AuthGateway和host之间建立多对多(ManyToMany)的拓扑连接关系(一个主机可通过多个跳板机网关代理访问,一个跳板机网关可以服务多台主机)。
在执行 SSH/SFTP 连接前,插件后端本身不存储连接密码与私钥,也不执行复杂的拓扑解析。 具体流程如下:
- 插件后端接收到前端请求时,调用主站 gRPC 的
ResolveActionContext接口。 - 主站控制面在内存中对
host及关联的AuthGateway密码和私钥进行安全解密。 - 按照
Bind声明将解密后的字段拼装为ConnectionTarget(内含网关排序链与最终主机信息)以 JSON 格式投递回插件服务。 - 插件服务通过
define.ResolveGatewayChain解析数据,构建term.GatewayChain链路,调用sshconnector 建立真正的物理连接。
- 插件的前端组件(
plugins/ssh/frontend)被独立构建为 UMD 格式包(将基座中的vue等声明为 externals)。 - 前端打包的全局挂载名为
window.EcmdbPluginBuiltinSsh,入口组件为Index。 - 该挂载名来自主站按插件 ID
builtin.ssh推导出的global_name。新增插件时,前端vite.config.ts中的build.lib.name必须与主站推导结果一致,否则主站能加载 JS 文件,但无法从window[global_name].Index取到组件。 - 静态托管在 IoC 装配时由统一脚手架
bootstrap.NewPluginApp直接挂载:主站网关会自动将StaticDist: "./plugins/ssh/frontend/dist"/api/cmdb/plugin-runtime/builtin.ssh/static/index.umd.js的请求透明代理转发至本服务的/static/index.umd.js路径,从而完成前端动态渲染。
前端调用的业务 API 统一通过主站网关代理,去掉网关前缀并转发给插件服务:
- 外部请求地址:
/api/plugin-runtime/builtin.ssh/terminal/connect - 网关转发至插件服务路径:
/terminal/connect
在根目录下:
task run:ssh或者在 plugins/ssh/ 目录下直接运行:
go run ./cmd/main.go server --addr :18080 --upstream http://127.0.0.1:18080 --ecmdb-grpc-addr 127.0.0.1:9000支持以下环境变量,优先级高于配置文件:
SSH_PLUGIN_ADDR=:18080 # 插件监听的 HTTP/WS 端口
SSH_PLUGIN_UPSTREAM=http://127.0.0.1:18080 # 注册给主站网关的反代物理地址
SSH_PLUGIN_TIMEOUT_SECONDS=5 # SSH 拨号超时时间
ECMDB_GRPC_ADDR=127.0.0.1:9000 # 主站的 gRPC 注册中心端口go run ./cmd/main.go server --config ./config/config.yaml插件后端服务内部实现的核心路由包括:
POST /terminal/connect:创建连接会话。通过主站 gRPC 解析资产凭证,发起 SSH 物理连接并注入会话池中。GET /terminal/ws:WebSocket 会话隧道,与前端基于 Web Shell 协议(基于 Guacamole 原理)传输终端字符流。
GET /sftp/files:读取文件列表。GET /sftp/download:下载文件。GET /sftp/preview:预览文件。GET /sftp/search:搜索文件。GET /sftp/upload/ws:基于 Web Socket 的文件上传。POST /sftp/new_folder:新建目录。POST /sftp/new_file:新建文件。POST /sftp/rename:文件/目录重命名。POST /sftp/move:文件/目录移动。POST /sftp/archive:文件压缩归档。POST /sftp/unarchive:解压文件。POST /sftp/save:文件编辑保存。POST /sftp/delete:删除文件。