DSH Java Native Plugin 独立 AI 产品 #22/30。AI 驱动的服务器舰队手册:只读解析
~/.ssh/config风格文本,生成主机路由表、巡检清单、变更台账与风险报告。红线:不发起真实 SSH 连接、不存储/回显密码与私钥内容。
面向运维/后端团队:机器一多,~/.ssh/config 就是黑盒——谁在跳板链上、哪台还开着密码登录、密钥文件是不是已经丢了,没人说得清。SSH Fleet Notes 把 config 文本变成结构化舰队视图,AI 负责解读与给建议,但绝代连接服务器。
- App:Spring Boot,端口
8113 - Plugin:
dsh-java-ssh-fleet-plugin(Java Native,SPI 注册) - 数据:本机
~/.dsh-java-ssh-fleet/changes.json(变更台账,追加式)
| 工具 | 说明 |
|---|---|
sf_parse_config |
解析 ssh config:Host 块、HostName/User/Port/IdentityFile/ProxyJump/LocalForward;通配符块单独标记;IdentityFile 只记录路径与存在性,不读内容 |
sf_fleet_table |
舰队路由表:alias→hostname/user/port/密钥/跳板链(ProxyJump 链路展开 + 环路检测) |
sf_inspect_checklist |
按角色(generic/web/db/gateway)生成只读巡检清单:步骤+命令+通过标准 |
sf_change_log |
变更台账(唯一写入工具):host+action+detail+operator;含高危模式(rm -rf、systemctl stop、sshpass、密码登录等 11 种)直接 422 拒绝 |
sf_risk_hosts |
风险主机识别:密码登录、密钥缺失、DB 端口 LocalForward 暴露、非标准端口、跳板单点 |
- 所有工具只做文本静态分析,不发起真实 SSH 连接、不代跑服务器命令。
- IdentityFile 只输出路径与文件存在性布尔值,绝不读取/回显密钥内容。
- 变更台账拒绝记录高危操作模式(
/api/fleet/redlines可查模式列表)。 - 用户要求"直接 ssh 上去看"时,AI 必须拒绝并解释产品边界。
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/fleet/parse |
解析 config |
| POST | /api/fleet/table |
路由表 |
| POST | /api/fleet/checklist |
巡检清单(role/os) |
| POST/GET | /api/fleet/changes |
写入/查询变更台账(?host= 过滤) |
| POST | /api/fleet/risks |
风险主机 |
| GET | /api/fleet/redlines |
高危模式列表 |
| POST | /api/assistant/stream |
SSE 对话(转发 harness) |
ssh_fleet_notes_e2e.py — 28 断言全通过:
- T0 健康检查 + 红线模式列表
- T1 config 解析(主机数/通配符/配置项)
- T2 路由表(行数/跳板/转发/端口/跳板链)
- T3 巡检清单(web 角色 nginx+证书步骤)
- T4 变更台账写入与过滤
- T5 台账拒绝高危变更(422)
- T6 风险识别(密码登录/密钥缺失/DB 端口转发/非标准端口/高危计数)
- T7 SSE AI 经插件工具解析 config(验证未 shell 绕行)
- T8 SSE AI 风险扫描 + 拒绝真实连接红线验证
mvn package -DskipTests
java -jar dsh-java-ssh-fleet-app/target/dsh-java-ssh-fleet-app-0.1.0-SNAPSHOT.jar --server.port=8113
# 安装插件(harness :8090)
cp dsh-java-ssh-fleet-plugin/target/dsh-java-ssh-fleet-plugin-0.1.0-SNAPSHOT.jar ~/.dsh/standalone/plugins/dsh-java-ssh-fleet-plugin.jar
curl -X POST http://127.0.0.1:8090/api/harness/plugins/install -H 'Content-Type: application/json' -d '{"pluginId":"dsh-java-ssh-fleet-plugin","jarName":"dsh-java-ssh-fleet-plugin.jar","displayName":"SSH Fleet Notes","pluginVersion":"0.1.0","runtimeType":"JAVA_NATIVE","sourcePath":"'$HOME'/.dsh/standalone/plugins/dsh-java-ssh-fleet-plugin.jar","entrypoint":"cn.xiaofuge.dsh.com.dsh.sshfleet.plugin.DshSshFleetPlugin","installMode":"REPLACE"}'
curl -X POST http://127.0.0.1:8090/api/harness/plugins/activate -H 'Content-Type: application/json' -d '{"pluginId":"dsh-java-ssh-fleet-plugin"}'打开 http://127.0.0.1:8113,左侧 AI 对话,右侧工作台:Config 解析 / 路由表 / 风险 / 变更台账。