Repository navigation
Releases: YunoSeng/dsh-ensp
Release list
v0.2.3
实机跑「实训任务1 ARP攻击防范」时暴露的三个问题:纯截图版还得手写脚本、S5700 的 save 卡在文件名提问、模板里的空文本框占位填不进去。
Added
ensp_doc新增template_path:直接拿老师发的原始题目.docx当「纯截图版」的底,原文、题号、排版一个字不动,每个 section 的截图依次填进对应步骤N标题下面的空位。section.heading写步骤3这种短标识即可,也能用anchor指定任意行首文字;找不到锚点会报错并列出缺哪些。- 实测任务4:模板 9 个非空文字段落 → 输出仍是 9 段,图片 1 → 10;任务1:267 段 / 3 图 → 267 段 / 11 图,正文逐段比对
True。 - 以前这步要临时写 python-docx 脚本,半小时起步;现在是一次工具调用的参数。
Fixed
save在 S5700 上卡死:[Y/N]之后它还会问Please input the file name ( *.cfg, *.zip ) [vrpcfg.zip]:,旧逻辑等提示符等到超时、saved.ok一直是 false——本次实测就因此让交换机没存盘。现在识别到这个提问就补一个回车用默认文件名,回显Save the configuration successfully.。ensp_doc的截图相对路径失效:python 子进程的工作目录不是 DSH 工作区,传工作区/截图/x.png会报missing image。现在图片路径进 manifest 之前统一按工作区解析。- 模板里的「空文本框」被当成非空行:老师给的模板常用无图片的文本框当照片框,旧判定见
w:drawing/w:pict就跳过,截图会滑到下一个标题下面。现在只有真正带图片关系的段落才算已占用,图片放进文本框内部并按框宽收窄。
Docs
- SKILL 交付清单补「纯截图版用
template_path填原题文档」,并说明空文本框占位的处理。
v0.2.2
真机测试踩到的三个坑:防火墙首次登录会强制改密、AR2220 上 save 必然失败、以及只做设备 save 不「保存拓扑」会让重开的配置全部复位。
Added
ensp_cli新增new_password:USG6000V 用出厂口令首次登录会强制改密(The password needs to be changed. Change now? [Y/N]:)。传new_password后工具按Y → 旧口令 → 新口令 → 确认新口令走完再登录,实测admin/Admin@123→Huawei@123,改完拿到<USG6000V1>提示符。
Fixed
- 防火墙控制台登录判定失效:
waitFor()返回文本后会清空缓冲区,loginIfNeeded()再读this.buffer就是空的,用户名和口令被当成命令打进Username:提示符。改为把waitFor()的返回文本传进登录流程;顺带处理Please Press ENTER.和「又出现一次Username:即口令错误」,报错从超时变成console authentication failed for user "admin" (wrong password?)。 save在 AR2220 上必然失败:旧实现等确认提示再发y,而 AR 已经把提示符弹回来了,这个y就成了Error: Unrecognized command found at '^' position.,saved.ok恒为 false。改成一次写save\ny\n(LF 换行),S3700 / AR2220 / USG6000V 三型设备实测都能拿到Save the configuration successfully/Configuration file had been saved successfully。
Docs
- SKILL / README / 插件提示词补上
save之后还要按 Ctrl+S 保存拓扑:设备save只写设备 flash,eNSP 只在保存拓扑时把设备文件回写.topo目录。实测不按 Ctrl+S 重开拓扑会回到初始配置;按了之后vrpcfg.cfg0 → 4,913 B、flash.efz9,348 → 11,188 B,重开设备名、接口地址、NAT 策略、改过的口令都在,ping 8.8.8.8 仍 5/5。 - 明确「纯截图版」交付规范:以用户给的原始题目文档为底,原文字、原题号、原排版一律不动,只在对应题号下面的空白处插图。
v0.2.1
真机测试发现并修复一个会让实验截图交不出去的 bug。
Fixed
ensp_cli的echo_to_window从来不提交命令:回显把每行结尾写成\r,而lib/bridge.py的type_text明确跳过\r、只把\n映射成 VK_RETURN。于是命令被逐字打进设备窗口后一直躺在输入缓冲里,截图里只有命令行、没有回显输出。改成\n后实测正常执行并截到完整输出。- 回显默认停顿加大:
echo_gap_ms600 → 900,echo_settle_ms1200 → 1800,避免长回显还没打印完就截图。
Docs
- SKILL 错误目录补两条实测记录:首条命令超时且 partial output 只有
##(设备没就绪,加大command_timeout_ms重试即可)、回显截图缺输出(旧版\r问题)。
真机验证(MCP 通道,eNSP 1.3.00.100 已开启)
| 动作 | 结果 |
|---|---|
ensp_status(含 telnet 探测) |
618 ms,识别到 pid 19896、eNSP 1.2.0.500、11 台设备、4 个控制台端口 |
ensp_shot target=main |
578 ms,1440×810 PNG |
ensp_gui {op:open} 打开拓扑 |
4.5 s(含 4 s 等待) |
ensp_gui start_all |
12.9 s,4 个端口全部开放,鼠标已还原 |
ensp_cli SW1 display clock / version |
213 ms,回显正确 |
ensp_cli R1(首次) |
20 s 超时、partial ##:设备冷启动未就绪;加大超时重试 269 ms 成功 |
ensp_cli SW1 + echo_to_window + 截图 |
4.5 s,截图里命令与输出都在(修复后) |
ensp_gui open_console R1 / ensp_shot device / close_console |
图标点击 1206,437 命中;截图 693 ms;关闭 1.1 s |
ensp_cli 改配置自动 save |
533 ms,saved.performed=true / ok=true,回显 Save the configuration successfully. |
ensp_gui stop_all |
2.6 s,端口全部关闭(恢复测试前状态) |
v0.2.0
在 DSH 插件之外增加一个 MCP 服务器:同一套六个工具,Claude Desktop / Claude Code / Cursor / Trae / Cline 等客户端可直接用。
怎么做的
mcp/server.js调apply()用替身上下文注册工具,拿到的是 DSH 插件用的同一批工具对象(同名、同 schema、同 handler)——不复制代码,两边行为不会漂移mcp/protocol.js手写 newline-delimited JSON-RPC 传输,插件保持零运行时依赖mcp/instructions.js把SKILL.md的硬规则搬成 MCP serverinstructions(换客户端也不丢实测经验)bin/dsh-ensp-mcp.mjs入口,支持--workspace、--no-restrict、--mode job|serve、--python、--version、--help
启动
node bin/dsh-ensp-mcp.mjs --workspace E:/labs{
"mcpServers": {
"ensp": {
"command": "node",
"args": [
"E:/dsh-plugins/dsh-ensp/bin/dsh-ensp-mcp.mjs",
"--workspace",
"E:/labs"
]
}
}
}--workspace 决定相对路径基准与沙箱边界;--no-restrict 关闭边界检查。
能力
| 能力 | 状态 |
|---|---|
| tools(6 个,JSON Schema + 必填项) | ✅ |
| initialize / notifications / ping / 错误码 | ✅ |
| server instructions | ✅ |
| resources / prompts / 进度通知 | ⏳ 最小可用版暂未实现 |
验证
新增离线冒烟测试 npm test:24 项断言(协议握手与版本回落、schema 映射与必填项、拓扑解析、工作区边界、未知工具/方法错误码),不需要 eNSP、Python 或管理员权限。
真机端到端也验过:真实 stdio 会话下 initialize → tools/list → tools/call,ensp_status 返回 bridge.available=true / elevated=true,ensp_shot target=screen 输出 1920×1080 PNG,工作区外路径与死端口都按 isError 正确回传。
说明
MCP 不改变速度(瓶颈仍在 GUI 驱动),改变的是谁能用。只想搭拓扑的话社区项目 Heaxu/ensp-mcp 更专业,两者可在同一客户端并存。
v0.1.0
首个可用版本:让 AI 更好地使用华为 eNSP 做网络实验。
六个工具
ensp_status开工前探明:提权桥状态、已打开的实例、本机安装的版本、已打开的设备窗口、.topo设备清单与控制台端口ensp_gui一次调用跑完整套界面动作(start_all/stop_all/open_console/close_console+ 全部底层 op),一整套点击只付一次提权进程启动成本ensp_shot窗口 DC 截图,主窗口被遮挡也能截,不抢焦点;设备窗口自动确保真可见(隐藏/最小化的窗口会返回旧画面)ensp_clitelnet 下发 VRP 命令,自动处理分屏、提示符、AAA 登录;改配置后自动save(答[Y/N]);可选真实键盘回显 + 截图ensp_topo纯文件读写.topo:改名、改 PC/Server IP、重排控制台端口(永不原地改源文件)ensp_doc生成说明版 + 纯截图版两份 docx 实验报告
稳定性
- 真实点击带
expect归属校验:用户开着全屏窗口盖住 eNSP 时拒绝点击而不是乱点 - 激活链
SwitchToThisWindow→SetForegroundWindow→ 置顶 → 点标题栏,抢不到前台就拒绝打字 - 设备窗口只走双击画布图标这条人类路径(外部
ShowWindow会被 eNSP 立刻撤销) - 主窗口/控制台被最小化时自动
SW_RESTORE再操作(最小化窗口坐标是 -32000 废值) - 点完工具栏自动轮询
com_port,不用猜设备启动要几秒
安装
{
"dependencies": {
"dsh-ensp": "link:E:/dsh-plugins/dsh-ensp"
},
"dsh": {
"profile": {
"bundles": ["dsh-ensp"]
}
}
}或 pnpm add github:YunoSeng/dsh-ensp#v0.1.0。重启 DSH 后技能目录出现 ensp-automation。
实测环境:Windows 10/11 + eNSP 1.3.00.100(client 1.2.0.500)。详细坐标、坑与耗时见 README 与 skills/ensp-automation/SKILL.md。