证据快照复核于 2026-09-16GitHub 数据核对日期: 2026-08-21
证据已验证Plugin Bundle安全与治理deepseek-harness Profile

DSH Download Guard

在 DeepSeek Harness 中拦截会落盘的常见 shell 下载命令,强制引导至本地 aria2。

快速了解

它能做什么

在 DeepSeek Harness 中拦截会落盘的常见 shell 下载命令,强制引导至本地 aria2。

本站提供的是中文说明,不代表该项目或 Plugin 自身提供中文界面;语言支持请以上游文档为准。

使用场景
安全与治理安全自动化配置
适配技术
deepseek-harnessaria2motrix
兼容性

deepseek-harness Profile
DSH 0.1.5-rc series reported tested; Node.js >=20

可信度与状态

证据已验证
核对日期 2026/9/13 UTC 14:29

有代码证据的贡献

它为 DSH 增加什么

下载命令拦截器

在命令执行前拒绝将文件下载到磁盘的 shell 命令,并返回可替代的 aria2 命令。

机制证据

选择前先看

该 DSH 插件通过 `tools/pre-execute` 钩子,在工具真正执行前拒绝部分会写入磁盘的 shell 下载命令,例如 `curl -o`、普通 `wget`、`Invoke-WebRequest -OutFile` 和 `Start-BitsTransfer`。拒绝信息会说明匹配原因,并附带包含已提取 URL 的 aria2 替代命令。

适合谁

希望把本地 aria2 下载规范变成运行时强制规则,而非仅依赖提示词的 DeepSeek Harness 用户。

常见任务

  • 阻止使用 `curl` 或 `wget` 直接下载并写入文件。
  • 引导智能体使用可续传、可在下载管理器中查看的 aria2 下载方式。
  • 让包管理器安装和 `git clone` 保持在本插件的拦截范围之外。

权限与数据

读取工具执行前的调用输入,并可拒绝匹配的 shell 命令。

权限
  • 注册 DSH 的 `tools/pre-execute` 钩子。
  • 在匹配的 shell 下载命令执行前阻止它们。
数据处理
  • 解析命令文本并提取 URL,以生成建议的 aria2 替代命令。
  • 项目说明中表示,拒绝信息会包含被拦截的命令。
外部服务
  • 使用本地 aria2 引擎,并提及 Motrix Next;未声明远程服务。
凭据
  • 提供的证据未声明需要凭据。

局限

  • 无法识别命令或脚本内部发起的下载,例如 Python 中通过 `urllib` 下载。
  • 不会影响 DSH 之外发起的下载。
  • 仅覆盖文档列出的 shell 模式,并刻意优先避免误拦截。
  • 依赖宿主提供 `tools/pre-execute` 钩子。

DSHub 已核对

  • 已验证固定 Git 源和 DSH Bundle 结构。
  • 清单声明要求 Node.js >=20。
  • README 声称已在 DSH 0.1.5-rc 系列测试。

DSHub 未核对

  • 本次策展未实际执行安装或运行时行为。
  • 未验证本地 aria2/Motrix 是否可用或已配置。

固定版本安装

安装 DSH Download Guard

这个Plugin Bundle没有 DSH Plugin 安装操作,请根据源码文档使用真实交付方式。

访问源码项目

维护者原文

项目 README

查看 commit 1aecbcf 对应的 README
维护者编写的上游内容原文于 2026/9/13README.md 获取,正文和仓库相对媒体固定到 commit 1aecbcfd7215,内容哈希为 4cf066e48eed。以下是未经 DSHub 翻译的上游原文,语言可能与当前页面不同;第三方托管的 badge 可能独立更新。

dsh-download-guard

把「下载必须走 aria2」从技能里的建议变成运行时的强制

为什么需要它

aria2-download 技能把规则写在提示词里,而提示词只是建议。实际发生的是:

aria2 通道 绕过通道
引擎 aria2-next (Motrix Next) node 单连接 https
实测速度 11.78 MB/s 0.13 MB/s
Motrix 可见
断点续传 部分

同一条 4.76 GB 的 Windows 11 镜像,两条路差了 约 90 倍。而 agent 手头只要有一个 download.cjs,就会顺手用它——因为在 shell 层面 node download.cjsaria2-dl.js 长得一模一样,没有任何机制能区分。

本插件把这条规则搬到运行时:拦截工具调用,拒绝并给出正确的 aria2 命令

工作原理

监听 cordis 的 tools/pre-execute 钩子(waterfall 模式),在工具真正执行之前裁决:

模型请求 pwsh("curl -o x.iso https://...")
    ↓
tools/pre-execute 钩子触发
    ↓
识别为下载 → 返回 { kind: 'deny', reason: '<改用 aria2 的完整命令>' }
    ↓
工具被拒绝,reason 原样呈现给模型(工具体从未执行)

为什么不用审批钩子

approval/request审批策略为 never 时会失效——ApprovalService.decide() 在派发 waterfall 之前return "rejected"

if (this.effectivePolicy(session) === "never") return "rejected";  // ← 在这里返回
const answer = ... this.ctx.waterfall(..., "approval/request", ...)   // ← 永远走不到

tools/pre-execute独立的 waterfall,没有这个短路,所以任何策略下都有效。

拦截规则

判据来自技能本身:是否需要把字节写到磁盘,而不是 URL 长什么样、文件多大。

拦截 放行
curl -o F / curl -O / curl --output F curl https://api.x/status(只输出到 stdout)
wget <url>(默认落盘) wget -O - <url>(显式输出到 stdout)
Invoke-WebRequest ... -OutFile F Invoke-WebRequest https://api.x/status
Invoke-RestMethod ... -OutFile F Invoke-RestMethod https://api.x/data
Start-BitsTransfer ...

明确不拦(按设计):

  • pip install / npm install 等包管理器——不在本插件职责内
  • git clone——git 自有传输层
  • 注释行里的命令(shell 不会执行)
  • 非 shell 工具(即使参数里含 curl -o 字样)
  • 仅仅是提到某文件名(例如日志里打印 download.cjs)——曾有一条按文件名匹配的规则,因误伤已删除

检测刻意偏向漏判而非误判:拦截一条正常命令是可见的体验倒退,而漏掉一次下载只是现状。

拦截后模型看到什么

BLOCKED by dsh-download-guard: this command downloads a file to disk
(matched: curl-output), and downloads must go through the local aria2 engine
(Motrix Next) so they are multithreaded, resumable and visible in the download manager.

Use instead:
  node "$env:USERPROFILE\.dsh\skills\aria2-download\scripts\aria2-dl.js" "<URL>" --out=<filename>

Options: --dir=<dir> for the destination, --header="K: V" for headers,
--no-wait to enqueue and return immediately (then query with --status <gid>).
A blocked command is never partially executed.

Blocked command: curl -o Win11.iso https://.../y.iso

URL 会被自动提取并填进建议命令——被拒绝的一方不需要猜该怎么改。

安装

cd ~/.dsh && dsh plugin --profile <your-profile> add "dsh-download-guard@github:BeiWay1145/dsh-download-guard"

安装后重启 DSH 生效。

已知边界

  • 拦不住「命令内部的下载」python script.py 里用 urllib 下载,钩子看到的是 python script.py,看不到它内部在做什么。彻底收口需要本地代理层,不在本插件范围。
  • 拦不住非 DSH 发起的下载:在 DSH 之外的终端里 curl -o 不受影响。
  • 依赖宿主提供 tools/pre-execute 钩子(已在 DSH 0.1.5-rc 系列上实测)。

开发

npm install
npm test          # 构建 + 检测器单测 + 真实 ToolRuntime 运行时测试
npm run typecheck

测试分两层:

  • tests/detect.test.mjs — 纯函数检测规则(38 项,含大量「必须放行」的反例)
  • tests/guard.runtime.mjs — 把构建产物装进真实 cordis + ToolRuntime,验证 deny 真的拦住了工具体

运行时测试会自行在本机寻找已安装的 DSH 树;找不到时跳过而非失败,这样裸克隆仓库也能通过。

许可

MIT

有意识地管理

安装与管理

前置条件与目标 Profile

目标 deepseek-harness Profile

交付方式 Git Bundle — BeiWay1145/dsh-download-guard#1aecbcfd72155c1c6526ebd2c703c42fa67b3f4d

验证、更新与移除

显示生命周期命令
验证
dsh plugin --profile deepseek-harness list

兼容性与访问范围

DSH hook plugin; Node.js 20+ required DSH 0.1.5-rc series reported tested; Node.js >=20

检查兼容性证据

风险事实

command-interception

Intercepts and denies selected shell download commands before they run.

证据
command-content-processing

Processes shell command text to identify downloads and construct a suggested aria2 command.

证据
证据与编辑审查Manifest、Bundle patch、分发与新鲜度

不可变证据

审查状态与源码活动

AI 已审查

应使用固定的 Git Bundle 路径;提供的证据不能证明 npm 注册表已发布该版本。

AI 审查于 2026/9/13 UTC 14:29GitHub 事实核对日期: 2026/9/13 UTC 14:29

自当前证据基线以来,没有记录到重要源码变化。

下一步

按 Plugin 安装流程操作

订阅重要变化: DSH Download Guard