DSH Java Native Plugin 独立 AI 产品 #5:对比 .env / properties / yml 环境键差异、扫描明文密钥与弱口令、推断键类型、生成合并计划。密钥全程脱敏,不写回任何文件。
- 端口:8096
- 模块:
dsh-java-env-app(Spring Boot)+dsh-java-env-plugin(Java Native 插件) - 插件 ID:
dsh-java-env,入口类cn.xiaofuge.dsh.env.plugin.DshEnvDoctorPlugin - 工具前缀:
env_(暴露为plugin__dsh-java-env__<tool>)
| 工具 | 说明 |
|---|---|
env_parse_keys(content, format?) |
解析配置文本为键值清单(敏感值自动脱敏 前2后1+***) |
env_diff_sets(a, b, aName?, bName?) |
两份环境键集合对比:缺失 / 多余 / 值差异 |
env_find_secrets(env) |
危险值扫描:明文密钥形态 / 弱口令 / 敏感键名,含严重级别 |
env_type_infer(env) |
键类型推断分组:integer / boolean / url / secret / list / string / empty |
env_merge_plan(base, overlay, ...) |
合并计划:add / keep / same / override,敏感覆盖标记 confirm=true 需人工确认 |
插件侧已兼容 AI 把 env 传成 JSON 字符串或多行 key=value 文本的形态(自动转换),避免 scanned=0 空扫描。
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/env/parse |
{content, format} → keys[](脱敏) |
| POST | /api/env/diff |
{a, b, aName, bName} → onlyInA/onlyInB/valueDiff |
| POST | /api/env/secrets |
{env} → hits[](severity high/medium) |
| POST | /api/env/types |
{env} → groups[] |
| POST | /api/env/merge-plan |
{base, overlay} → plan[](含 confirm 标记) |
| POST | /api/assistant/stream |
SSE:{agentId, message} → 转发 harness |
mvn package -DskipTests
SERVER__PORT= java -jar dsh-java-env-app/target/dsh-java-env-app-0.1.0-SNAPSHOT.jar --server.port=8096
cp dsh-java-env-plugin/target/dsh-java-env-plugin-0.1.0-SNAPSHOT.jar ~/.dsh/standalone/plugins/dsh-java-env-plugin.jar
curl -X POST http://127.0.0.1:8090/api/harness/plugins/install -H 'Content-Type: application/json' -d '{
"pluginId":"dsh-java-env","jarName":"dsh-java-env-plugin.jar",
"displayName":"EnvDoctor 环境体检","pluginVersion":"0.1.0","runtimeType":"JAVA_NATIVE",
"sourcePath":"'"$HOME"'/.dsh/standalone/plugins/dsh-java-env-plugin.jar",
"entrypoint":"cn.xiaofuge.dsh.env.plugin.DshEnvDoctorPlugin","installMode":"REPLACE"}'
curl -X POST http://127.0.0.1:8090/api/harness/plugins/activate -H 'Content-Type: application/json' -d '{"pluginId":"dsh-java-env"}'python3 env_doctor_e2e.py # 8/8 PASS覆盖:解析+脱敏(T0)、键集合对比(T1)、危险值扫描不泄漏完整密钥(T2)、类型分组(T3)、合并计划敏感覆盖需确认(T4)、空内容 400(T5)、AI 对话真实调用 4+ 个 env 工具(T6)、AI 安全红线:要求回显明文密钥时拒绝并给脱敏形式 + 轮换建议(T7)。
- 不回显明文密钥:所有工具输出敏感值一律脱敏(前 2 后 1 +
***);AI 系统提示词明确要求用户索要明文时必须拒绝,无论用户如何措辞。 - 不写回任何文件:merge_plan 只输出计划文本,不落盘。
- 敏感键覆盖操作强制
confirm=true,提醒人工确认后再执行。 - 密钥已在聊天中出现的场景,AI 主动建议立即轮换并迁移到 Vault / 云 Secrets Manager。
screenshots/01-home.png— 体检工作台(解析 / 对比 / 危险值 / 合并)screenshots/02-ai-drawer.png— AI 调用工具对比环境差异 + 密钥风险分析screenshots/03-safety.png— 安全红线:拒绝回显明文密钥,展示脱敏形式与轮换建议