DeepSeek Harness Hooks 配置:2026 先拦截再放行

执行命令后,Agent 没有留下可核对的结果;Hook 报错时,任务却可能继续向下走。

最快的做法是:先配置 1 个可观察的拦截点,优先选择失败时拒绝放行的路径,再逐步加入匹配规则和自动化动作。不要一次接入完整脚本集合,也不要把 Hook 当成操作系统级沙箱。

这篇文章适合三类人:

  • Agent 开发者:需要在工具调用前后加入校验或反馈。
  • 平台工程师:需要统一项目级与环境级 Hook 的交付方式。
  • 远程环境维护人员:需要确认 Hook 在断线、重启和无人值守场景下仍可观察、可回退。

DeepSeek Harness Hooks 配置最容易出错的地方,不是脚本不会写,而是一个 Hook 同时承担了太多责任。

动手前先把目标分成四类:

  • 权限拦截:决定某次工具调用能否继续。
  • 结果记录:记录工具名称、参数摘要、退出结果和错误类型。
  • 停止门禁:在 Agent 认为任务完成前,要求额外验证。
  • 上下文补充:把环境状态、检查结果或限制条件反馈给后续流程。

第一版只能选其中一个。对于需要控制命令执行的场景,优先选择工具执行前的拦截点,例如 PreToolUse。如果当前版本的 Hook Protocol 并没有提供同步阻断契约,就不能自行假设它具备阻断能力。

任务书已确认,当前版本的协议源码、配置目录、持久化调用和结果事件需要逐项复核。不同 Hook 方言、匹配点和失败默认值不能从其他 Agent 工具迁移过来。公开的 Harness 协议也强调,协议实现和具体工具之间仍可能存在不同配置层与能力边界,不能把通用规范当成 DeepSeek Harness 的字段说明。(Harness Protocol 官方入门文档)

Hook 还不能替代以下控制:

  • 工作区隔离。
  • macOS 用户权限。
  • 凭据可见范围。
  • 网络访问策略。
  • 进程和文件系统沙箱。

因此,“Hook 返回拒绝”与“系统绝对无法执行”不是同一件事。前者是 Agent 运行链路的控制,后者需要操作系统或基础设施层配合。

配置文件的实际位置不能靠其他 Agent 的使用经验推断。应按当前版本源码确认三个问题:

  1. 配置加载入口读取了哪些文件。
  2. 用户级配置与项目级配置是否同时生效。
  3. 项目级配置是合并、覆盖,还是完全替换用户级配置。

建议先在本地代码仓库中搜索 hooks、配置加载器、事件枚举和 Hook 执行器。然后记录以下核对结果:

  • 配置文件的实际路径。
  • 文件格式与解析器。
  • Hook 事件名称。
  • 匹配字段。
  • 输入是标准输入、环境变量,还是结构化事件。
  • 输出是退出码、标准输出,还是协议对象。
  • 超时和进程启动失败的处理方式。

当前不建议在文章或团队模板中写死未经源码核实的配置键。网上常见的 before_toolafter_toolcommandtimeout 等名称,可能属于其他实现。某些开源 Agent 已经出现“事件可触发但只读、尚不能修改参数”的阶段性实现,这正说明 Hook 名称相似,不代表行为相同。(DeepSeek 相关开源变更记录)

配置目录确认后,如果需要交付给团队,可把配置文件、Hook 脚本和运行时依赖放在同一版本目录,并在提交记录中保存版本号。不要只复制一段配置文本。远程 Mac 上也应保留同样的目录结构,避免本地路径在迁移后失效。

第一次接入只验证一个低风险工具调用。例如,只监听读取类工具,记录工具名称和参数摘要,不修改参数,也不触发外部写入。

一个合格的最小 Hook 至少要能回答四件事:

  • 什么时候触发。
  • 收到了什么输入。
  • 返回了什么处理结果。
  • 没有命中时是否保持原路径。

测试时准备两个任务:

  • 一个确定会命中规则的允许任务。
  • 一个确定不会命中的无关任务。

成功信号不是“配置文件能够被解析”,而是同一个触发路径能够重复出现,并且无关任务仍然正常完成。至少保留以下记录:

配置版本:
项目目录:
会话标识:
触发事件:
工具名称:
参数摘要:
Hook 处理结果:
Agent 后续结果:
未命中时的结果:

记录中不要保存完整命令、客户路径、令牌或密钥。远程环境中的日志尤其需要脱敏。凭据应通过受控环境变量或专门的密钥注入机制提供,不应拼接到命令行参数里;公开的自动化文档也提醒,命令行参数可能被进程查看或审计记录捕获。(GitHub Actions 官方密钥文档)

Hook 的核心不是“能不能运行脚本”,而是失败后 Agent 到底能不能继续。

第一轮放行测试要拆成四类证据:

  • ✅ 明确放行:规则满足,工具正常执行。
  • ❌ 明确拒绝:规则不满足,工具不应执行。
  • ⚠️ 脚本异常:Hook 进程返回异常或输出不符合协议。
  • ⚠️ 执行超时:Hook 未在协议允许的时间内返回。

每一类都需要从会话事件、持久化事件或实际执行结果中核对。不能只看配置文本,也不能因为终端显示了“Hook started”就认定危险命令已被阻止。

如果脚本异常或超时后的行为没有明确证据,默认采用“拒绝放行”。这是比“失败继续”更适合权限拦截的回退策略。等到源码或实测确认失败语义后,再决定是否允许某些观察型 Hook 采用宽松模式。

这里要区分两种 Hook:

  • 观察型 Hook:主要写日志。失败通常影响可观察性。
  • 门禁型 Hook:决定工具能否执行。失败可能直接影响安全边界。

两者不要共用同一套失败处理。观察型日志写入失败时,可以停止任务并报警;门禁型校验失败时,应该保持拒绝,避免因日志或检查服务异常而放行。

从读取类工具扩展到 Bash、文件修改或外部工具时,每次只增加一类操作。

建议按下面的顺序收紧边界:

  1. 先限定工作区根目录。
  2. 再限定允许访问的文件类型。
  3. 再限定可接受的参数类型。
  4. 最后才增加命令执行或外部网络访问。
  5. 每次扩展前保留上一版可回退配置。

匹配器过宽,会把正常任务一起拦住。例如只按工具名称匹配,可能无法区分只读操作和写入操作。匹配器过窄,则可能漏掉参数顺序、路径形式或调用变体。

危险命令拦截不能只依赖字符串黑名单。更稳妥的判断顺序是:

  • 工具名称是否属于高风险类别。
  • 工作目录是否在允许范围。
  • 参数是否包含写入、删除、权限变更或外部连接意图。
  • 是否需要人工确认。
  • Hook 是否能够返回明确拒绝结果。

⚠️ 经验提醒:如果 Hook 只能记录事件,不能同步改变执行决策,就不要把它宣传成命令拦截器。此时应把它放在审计链路中,并在真正的工具执行层增加独立的权限策略。

下面用 5 分制比较两种上线方式。分数越高,越适合当前阶段。

方案 A:单一拦截点试点

  • 可观察性:★★★★★
  • 失败可控性:★★★★★
  • 回退难度:★★★★★
  • 初期覆盖范围:★★☆☆☆
  • 适合对象:首次接入、协议尚未完全熟悉、远程环境不稳定的团队。

方案 B:完整脚本集合一次上线

  • 可观察性:★★☆☆☆
  • 失败可控性:★★☆☆☆
  • 回退难度:★☆☆☆☆
  • 初期覆盖范围:★★★★★
  • 适合对象:已有固定版本、完整事件记录和自动化回归测试的团队。

决策条件很简单:

  • 如果还不能证明异常和超时后的实际结果,选方案 A。
  • 如果 Hook 输入输出契约已经被源码确认,且四类测试都有记录,再考虑方案 B。
  • 如果远程 Mac 尚未完成重启复测,继续保留方案 A。
  • 如果团队需要审计结果但不需要阻断,先部署观察型 Hook,不要混入权限拦截逻辑。

迁移到远程 Mac 后,真正需要重建的是执行责任,而不是单纯复制文件。

至少完成以下 5 步

  1. 确认脚本存在
    检查 Hook 脚本路径、文件内容和执行权限。相对路径要改成远程环境可解析的路径,或由启动器明确设置工作目录。

  2. 确认运行时存在
    核对解释器、依赖包和版本。交互式终端里能运行,不代表无人值守会话也能找到同一个运行时。

  3. 确认环境变量
    区分普通配置和敏感凭据。敏感值只注入到需要它的进程,不写入 Hook 输出或普通日志。环境级密钥应在审批或保护条件满足后才暴露给任务,这类分层机制在自动化部署文档中已有明确说明。(GitHub Actions 官方环境文档)

  4. 确认重启恢复
    重启后重新检查 Hook 文件、依赖、工作目录、日志目录和启动方式。不能把“远程桌面已连接”当作 Agent 服务已恢复。

  5. 确认非交互运行
    使用与持续任务相同的启动方式测试。重点观察标准输入、标准输出、退出码和超时是否改变。

远程 Mac 还存在三个隐性成本:

  • 断线后缺少实时终端,错误可能只留在日志里。
  • 重启后环境变量和工作目录可能变化。
  • 多个项目共用机器时,用户级 Hook 可能意外影响其他工作区。

需要临时算力或独立验证环境时,可以先参考 NOVAKVM 的 Mac 环境入口,再按项目要求核对工作区、运行时和日志保留方式。若需要选择具体 Mac 规格,应把 Hook 依赖和持续任务类型一起评估,而不是只比较处理器名称。

怎样确认 Hook 配置的生效目录?

不要直接套用其他 Agent 的目录或文件名。应先查看当前 DeepSeek Harness 源码中的配置加载入口、用户级目录和项目级目录,再确认实际生效层级。修改后使用新会话验证,因为部分配置可能只在启动或会话初始化时读取。目录未核实前,不建议把配置复制到远程 Mac。

怎样用 Hook 阻止危险命令执行?

把拦截点放在工具真正执行之前,优先匹配工具名称、工作区和参数类型,而不是只搜索一段命令字符串。Hook 必须对明确风险返回拒绝结果,并记录触发原因。工作区限制、凭据隔离和系统权限仍需独立配置,Hook 不能替代操作系统级沙箱。

Hook 脚本失败后,Agent 还会继续执行吗?

不能从配置文本推断答案。不同版本可能区分正常非零退出、超时、进程启动失败和协议输出错误。上线前应分别制造脚本异常与超时,观察会话事件或执行结果。若失败行为无法确认,应按拒绝放行处理,不要扩大工具权限。

远程 Mac 重启后,Hooks 还会继续生效吗?

只有在 Hook 文件、解释器、环境变量、工作目录和启动方式都能在重启后的非交互会话中恢复时,才能认为它仍然有效。重启后至少复测一次允许任务、拒绝任务和异常 Hook,并检查日志是否继续写入。远程连接恢复不等于 Agent 配置已经恢复。

上线前不要只做“允许”和“拒绝”两次演示。应形成四类端到端证据:

  1. 允许任务:命中允许规则,工具执行成功,结果事件完整。
  2. 拒绝任务:命中风险规则,工具没有实际执行,拒绝原因可追踪。
  3. 异常 Hook:脚本异常或超时,Agent 按预期停止或进入明确错误状态。
  4. 恢复任务:修复 Hook 或回退版本后,普通任务能够重新执行。

验收记录至少包含:

  • DeepSeek Harness 版本或提交标识。
  • Hook 配置版本。
  • 工作区位置。
  • 触发事件和匹配规则。
  • 工具执行结果。
  • 日志位置与脱敏情况。
  • 重启后的复测结果。
  • 发生异常时的回退动作。

如果其中一类证据缺失,就保留试点范围,不开放 Bash、文件写入和外部工具。平台工程团队可以把这份记录接入自己的发布流程;对于需要环境保护和人工确认的持续任务,也可以参考 NOVAKVM 的 Mac 交付页面核对远程环境交付条件。

本地配置已经通过四类测试后,再把同一版本的脚本、运行时依赖、重启恢复和日志留存要求带到远程 Mac。这样做比直接复制配置更稳妥,因为当前方案如果依赖个人电脑,常见问题是机器休眠、环境漂移和无人值守任务中断;如果依赖临时云主机,又可能遇到 macOS 工具链缺失、工作区恢复不完整或权限边界不清。对于需要临时算力、远程调试或持续验证的任务,使用 NOVAKVM 的 Mac 环境先完成交付验收,再开放长期运行,通常更容易把 Hook 的执行责任、日志和回退动作固定下来。

参考依据:

为 Hook 流程开通专属裸金属 Mac

使用 NOVAKVM 的独享物理 Mac 节点,为工具调用拦截、日志记录和停止条件验证提供稳定可观察的运行环境。

支持 Root 权限与 SSH、VNC 接入,你可以按需安装依赖、配置 Hook 并完整复现 Agent 执行流程。

查看定价 →