前言¶
在 DeepSeek Harness(DSH)里跑智能体时,常见两类「写在技能里、运行时却没人遵守」的规则:大文件下载应走本机 aria2 引擎,按路径找文件应走 Everything 而不是内置 glob。提示词只是建议,模型仍可能用 curl -o、wget -O 或内置 glob,速度和可观测性都会差一截。下面介绍社区插件 dsh-ops-guard(维护者 BeiWay1145,分类 admin-security),它把上述建议变成 tools/pre-execute 上的运行时裁决。
这是什么¶
dsh-ops-guard 是 DSH 插件,监听 cordis 的 tools/pre-execute 钩子(waterfall 模式),在 shell 与 glob 真正执行前拦截并处置:
| 守卫 | 规则 | 替代通道 |
|---|---|---|
| 下载守卫 | 大文件下载必须走 aria2 | 随包脚本 aria2-dl.cjs → aria2-next(Motrix Next) |
| 搜索守卫 | 按路径找文件必须走 Everything | Everything 常驻 IPC(\\.\PIPE\Everything IPC) |
两者拦截点相同,拦截后的处理不同,这是插件设计的核心:
- 下载守卫:拒绝执行,并在拒绝理由里给出可复制的 aria2 命令(下载有副作用,守卫不能替模型执行)。
- 搜索守卫:拒绝执行内置 glob,但在拒绝理由里直接返回 Everything 的查询结果(只读查询,守卫在 DSH 进程内走 IPC 算完再返回)。
仓库:https://github.com/BeiWay1145/dsh-ops-guard
社区目录页:https://www.skillhub.cn/plugins/BeiWay1145/dsh-ops-guard
为什么需要运行时守卫¶
下载:shell 命令与 aria2 脚本在形态上无法区分¶
README 记载:同一条约 4.76 GB 镜像,aria2-next 通道实测约 11.78 MB/s,而用 node 单连接 https 的绕过通道约 0.13 MB/s,断点续传能力也不一致。agent 只要手边有 download.cjs,在 shell 里执行 node download.cjs 与走 aria2-dl.js 看起来一样,没有机制在提示词层区分,因此需要在 pre-execute 拒绝 curl -o、wget -O 等落盘下载。
搜索:内置 glob 能用,模型没有动力换 Everything¶
内核 glob 可用时,模型没有理由主动用 Everything。规则必须落到运行时;守卫在 IPC 可用时用索引回答,成本主要是 IPC 往返(Everything 进程已常驻),而不是每次启动 ripgrep/glob 遍历目录树。README 中的 bench/scope-latency.mjs 数据表明:在多种搜索范围下,守卫相对内置 glob 的中位延迟更低(例如整盘级路径 D:\VibeCoding 量级差异 README 记为约 68 倍)。Everything 是文件名索引,不是内容索引;刚创建的文件可能有约数秒索引延迟,且内容搜索需用户显式开启——因此守卫只拦 glob,不拦 grep。
拦截规则与放行边界¶
会拦截的情况¶
| 规则 | 触发 | 处置 |
|---|---|---|
curl-output |
curl -o / -O |
拒绝 + aria2 命令 |
wget-output |
wget -O |
拒绝 + aria2 命令 |
invoke-webrequest-outfile |
Invoke-WebRequest -OutFile |
拒绝 + aria2 命令 |
bits-transfer |
Start-BitsTransfer |
拒绝 + aria2 命令 |
glob |
内置 glob 工具 | 拒绝 + 实际搜索结果 |
必须放行的例子¶
curl https://api.x/data:输出到 stdout,不落盘。Invoke-RestMethod等不落盘请求。- 非 shell 工具、grep(内容搜索仍走内置工具)。
- 拒绝理由中会说明 grep 未被拦截,避免模型误绕路。
管道或 Everything 不可用时,搜索守卫会回落为「给命令」模式(searchDenialMessage),避免因守卫本身让搜索完全失效。
安装与启用¶
官方安装命令(来自 README):
cd ~/.dsh && dsh plugin --profile <your-profile> add "dsh-ops-guard@github:BeiWay1145/dsh-ops-guard"
安装后重启 DSH 生效。搜索守卫要求本机运行 Everything(含 es.exe);下载守卫要求本机运行 aria2-next 引擎(Motrix Next 内置),随包脚本通过 JSON-RPC 与之通信,不依赖 aria2c.exe。
插件以当前 DSH 进程权限运行;安装前请自行查看仓库源码与 MIT 许可证(package.json 版本 0.1.0,要求 Node >= 20)。
典型用法¶
被拦截的下载:按拒绝理由改用 aria2-dl¶
拦截后模型会看到类似说明:下载必须走本机 aria2,并给出随包脚本的绝对路径(由 import.meta.url 解析),URL 会从被拦命令中自动提取。可直接在终端使用:
node scripts/aria2-dl.cjs <url> --out=<文件名> [--dir=<目录>] [--no-wait]
node scripts/aria2-dl.cjs --status <gid>
node scripts/aria2-dl.cjs --list
环境变量(README 记载):
| 变量 | 默认 | 说明 |
|---|---|---|
ARIA2_RPC_PORT |
16800 |
引擎 RPC 端口 |
ARIA2_RPC_TIMEOUT_MS |
15000 |
RPC 超时 |
ARIA2_DOWNLOAD_DIR |
用户 Downloads 目录 | 默认落盘目录 |
引擎未启动时脚本会明确报错,而不是静默失败。
被拦截的 glob:结果已在拒绝理由中¶
搜索守卫不会让模型再跑一次 glob;拒绝文本中包含匹配数量、路径列表、IPC 耗时,以及必要时 es.exe 的示例命令。若需不同查询,可按提示使用与 Everything 相同的模式语言。
工作原理(简述)¶
模型请求 glob("**/*.md", path: "D:/proj")
↓
tools/pre-execute 钩子触发
↓
搜索守卫经 Everything IPC 查询 → 拿到结果
↓
返回 { kind: 'deny', reason: '<拒绝说明 + 实际结果>' }
↓
内置 glob 未执行,模型直接读到结果
下载路径同理:pre-execute 只能 allow/deny/ask/cancel,无法改写调用,故下载侧采用「拒绝 + 完整替代命令」。
适用场景与已知边界¶
适合:希望在 DSH 会话内统一大文件下载到 Motrix Next / aria2-next,并强制文件名搜索走 Everything IPC 的团队或个人;与「一切皆插件」的 DSH 生态一致,插件来自社区目录 SkillHub,与 DeepSeek / 幻方无官方从属关系。
注意:
- 拦不住命令内部的下载(例如
python script.py内 urllib);DSH 外终端里的curl -o不受影响。 - Everything IPC 协议未公开,版本变更可能导致守卫回落为「给命令」模式。
- 新写入磁盘的文件可能短暂查不到;内容搜索请继续使用 grep。
结尾¶
dsh-ops-guard 把 aria2 下载与 Everything 文件搜索从「技能建议」收束为 pre-execute 上的强制策略,并用「拒绝 + 命令」与「拒绝 + 结果」两种处置区分副作用操作与只读查询。如需安装或 issue,见 GitHub 仓库 与 SkillHub 目录页。