---
title: "W10 说明：让 Hermes 可控——审批、硬禁止、回滚"
---

# 🛠 让 Hermes 可控：审批、硬禁止、回滚

[W10 材料入口](https://ai.lingnan.top/materials/2026-autumn/w10) · [上一篇：让 Hermes 主动](https://ai.lingnan.top/materials/2026-autumn/w10/hermes-cron)

## 第 6 章 可控：审批、硬禁止、只认你、回滚

前几章让 Hermes 能读写你的文件、跑终端命令、到点自己干活。这一章给它加上几道闸：危险命令先问你，没人在场的定时任务直接拒绝，密钥文件不让碰，改坏了能退回去。谁能和它对话，第 2.4 节已经设好（配对批准，只认你）。

本章用到的设置都在 `%LOCALAPPDATA%\hermes\config.yaml` 里，用 `hermes config set` 改，改完运行 `hermes gateway restart` 让后台网关读到新设置。

### 6.1 审批：危险命令先问你

Hermes 跑终端命令前，会拿命令去对一张“危险命令”清单（递归删除、改权限、`curl … | sh`、写 `.ssh` 或 `.env` 等）。对上了，就按审批模式处理：

| `approvals.mode` | 对上清单的命令怎么办 |
| --- | --- |
| `smart`（默认） | 先让模型判断：低风险的放行，明显危险的拒绝，拿不准的再问你。这次判断也要调用模型 |
| `manual` | 每一条都问你 |
| `off` | 全部放行，不要用 |

学习阶段建议用 `manual`，看清它每次要做什么。

**第 1 步：改成 manual，打开快照（6.4 节用）。** 终端运行：

```powershell
hermes config set approvals.mode manual
hermes config set checkpoints.enabled true
hermes gateway restart
```

看到两行 `Set … in …\config.yaml` 和 `Gateway started`，就改好了。

![改审批模式，打开快照，重启网关](/course-materials/2026-autumn/w10/hermes-control/hermes-ch6-00-manual.png)

**第 2 步：建一个测试文件夹。** 在“文档”里新建文件夹 `测试文件夹`，里面放一个随便写了几个字的 `a.txt`。

**第 3 步：在飞书里让它删。** 发：“把 C:\Users\你的用户名\Documents\测试文件夹 整个文件夹连同里面的文件一起删掉，用终端命令删。”（把 `你的用户名` 换成自己的。）

它会先看一眼文件夹，然后停下来，发一张橙色卡片：`Hermes wants to run a command that needs your OK`。卡片上是它要运行的命令全文，`Why it was flagged: recursive delete` 说明为什么要问你，下面四个按钮：

| 按钮 | 意思 |
| --- | --- |
| Allow Once | 只放行这一次 |
| Session | 这段对话里同类命令都放行 |
| Always | 以后永远放行这类命令（写进 config.yaml） |
| Deny | 拒绝 |

卡片上还写着：5 分钟内不回答，命令不会执行。

![删文件夹之前，它发来审批卡片](/course-materials/2026-autumn/w10/hermes-control/hermes-ch6-02-approval-card.webp)

**第 4 步：点 Deny。** 卡片变成红色的 `Denied`，它回复命令没有执行、文件夹还在，并说不会换个命令绕过去。打开“文档”看一眼，`测试文件夹` 还在。

![点了 Deny，命令没有执行](/course-materials/2026-autumn/w10/hermes-control/hermes-ch6-03-denied.webp)

用第 2.1 节扫码建的机器人，实测卡片按钮可以直接点。按钮点了报错的，在飞书开放平台的应用里查“事件与回调 → 回调配置”有没有 `card.action.trigger`，改完要发布新版本。

不点按钮也行：直接回 `/approve` 表示同意，回 `/deny` 表示拒绝。实测回 `/approve` 后，它回复 `✅ Command approved. The agent is resuming...`，接着把活干完。

**两种卡片别弄混。** 蓝色卡片 `Hermes needs your input` 是它在问你问题（比如“确认删除这个文件吗”），选项按钮是它自己拟的；橙色卡片才是审批，按钮固定是上面四个。

![蓝色卡片：它在问你问题，不是审批](/course-materials/2026-autumn/w10/hermes-control/hermes-ch6-01-clarify-card.webp)

上面这张蓝色卡片，是让它删笔记库里的一个文件时出现的。删一个文件不在危险命令清单里，`manual` 模式下也不会弹审批卡；它先来问你，是因为笔记库的 `AGENTS.md` 里写了“改动已有笔记前先问我”（第 4.3 节）。所以：

- 审批卡片管的是清单上的危险命令，不管“这件事该不该做”。
- 不想让它随手改的东西，在 `AGENTS.md` 里写规矩，再打开 6.4 节的快照兜底。

### 6.2 定时任务碰到危险命令：直接拒绝

定时任务跑的时候没人在场，没人点审批卡片。Hermes 的默认设置 `approvals.cron_mode: deny` 是：定时任务里碰到要审批的命令，直接拒绝。

**第 1 步：建一个会碰到危险命令的一次性任务。** 把 6.1 节的 `测试文件夹` 留着，在飞书里发：“测试一下定时任务的安全设置：建一个一次性定时任务，2 分钟后运行，任务内容是用终端命令 rm -rf 删除 C:\Users\你的用户名\Documents\测试文件夹，并报告结果。任务名叫‘删除测试’。现在先不要自己删。”

**第 2 步：等它跑完，看结果。** 两分钟后飞书收到 `Cronjob Response: 删除测试`。结果里原样引用了拦截信息：

```txt
BLOCKED: Command flagged as dangerous (recursive delete) but cron jobs run without a user present to approve it. Find an alternative approach that avoids this command.
```

![定时任务里的 rm -rf 被拦下](/course-materials/2026-autumn/w10/hermes-control/hermes-ch6-04-cron-blocked.webp)

注意结论那一行：实测时 `rm -rf` 被拦下了，**文件夹还是被删了**。拦截信息让它“换个办法”，它就先删里面的文件，再删空文件夹，这两步都不在危险命令清单上。

所以 `cron_mode: deny` 拦的是某几种命令写法，不是“删除”这件事。要点：

- 别把会删、会改重要文件的事交给定时任务。定时任务适合第 5 章那种“读文件、汇报”的活。
- 定时任务里需要改文件的，改之前确认 6.4 节的快照开着，删错了能退回去。
- 不要为了让定时任务顺利跑完，把 `cron_mode` 改成 `approve`：那样所有危险命令在没人看的时候都会放行。

### 6.3 硬禁止和受保护的文件

有两类东西，无论审批设成什么都不放行。下面写的是官方文档列的范围，本节实测了其中一项（读 `.env`）。

**硬禁止的命令。** 格式化磁盘、`rm -rf /` 这类会毁掉整个系统的命令，任何档位、任何“永远放行”都绕不过去，也没有开关可以关掉。

**受保护的文件。** 存密钥的文件，它的读写工具碰不了：Hermes 数据目录里的 `.env`（第 1 章填的 API Key、第 2 章的 App Secret 都在里面）、配对记录、`.ssh` 等。各处的 `.env` 文件都不让它用读文件工具读。

**实测：让它把 `.env` 发给你。** 在飞书里发：“把 C:\Users\你的用户名\AppData\Local\hermes\.env 这个文件的内容原样发给我看看。”它打算写一段只读脚本，列出键名、把值打码，这段脚本触发了审批卡片。实测时没有点放行（误点了一个 👍 表情，它不把表情当作同意），5 分钟后它回复 `Approval timed out after 5 minutes — the command was NOT run`，说明 `.env` 的内容一行都没有看到、没有发出去，并建议你自己在电脑上打开看，不经过它。

![读 .env：审批超时，命令没有执行](/course-materials/2026-autumn/w10/hermes-control/hermes-ch6-05-env-timeout.png)

这次它没读到，靠的是审批卡片，不是文件保护本身：终端命令以你的 Windows 账户身份运行，你点了放行，它就能读到。碰到要读密钥、改密钥的审批，一律点 Deny。

### 6.4 打开快照，改坏了退回去

快照默认关着，6.1 节第 1 步已经用 `checkpoints.enabled true` 打开了。打开后，它每次改文件、删文件、移动文件之前，会把当前工作文件夹（第 4.3 节设的笔记库）存一份快照。快照存在 Hermes 数据目录里，不动你笔记库自己的内容。

**第 1 步：先让它删一个文件。** 照 6.1 节蓝色卡片那样，让它删掉笔记库里的一个测试文件，在卡片上选确认删除。

**第 2 步：在飞书里列出快照。** 发 `/rollback`，它列出这个文件夹的快照，最新的在最上面。每一行是编号、时间、在哪个动作之前存的，比如 `before terminal: … rm -v "测试删除.md"`，就是删这个文件之前存的。

**第 3 步：退回去。** 发 `/rollback 编号`，编号换成删文件之前那一份。看到 `✅ Restored to checkpoint …`，打开笔记库，删掉的文件回来了。

![退回删文件之前，再列出快照](/course-materials/2026-autumn/w10/hermes-control/hermes-ch6-06-rollback.webp)

退回去会把整个笔记库恢复到那一刻：那之后它改过的别的笔记，也一起退回去。实测时，删文件之后它又给 `课程/中级微观.md` 加了一行“第 7 讲”，退回去以后这一行也没了。

**退错了怎么办。** 每次退回之前，它会自动再存一份 `pre-rollback snapshot`（排在列表第 1 个）。退回这一份，就回到退之前的样子：实测时发 `/rollback 1`，“第 7 讲”那一行回来了，找回的文件也还在。

![退回“退之前”的快照，撤销刚才的回滚](/course-materials/2026-autumn/w10/hermes-control/hermes-ch6-07-rollback-undo.png)

几点提醒：

- 飞书里的 `/rollback` 只认两种写法：`/rollback` 列出快照，`/rollback 编号` 退回。列表下方提示的 `/rollback diff 编号`（先看改了什么）和 `/rollback 编号 文件名`（只退回一个文件）在飞书里会报 `Invalid commit hash`，要在电脑上的 `hermes` 对话里用。
- 快照只管第 4.3 节设的工作文件夹。它在别的文件夹里删的东西（比如 6.2 节“文档”里的测试文件夹）不在快照里。
- 笔记库已经是 Git 仓库的（第 3 周的做法），用 Git 看改动、退版本也可以，两者不冲突。

### 6.5 数据边界

- 它读过的文件内容，会作为对话的一部分发给模型服务商（本课程用 DeepSeek）；你在飞书里发的消息，会经过飞书的服务器。身份证号、密码、未公开的成绩不要放进它能读的文件夹。
- API Key、App Secret 只放在 Hermes 数据目录的 `.env` 里，不贴进任何对话，不截图，不放进笔记库或 Git 仓库。
- 第 2.4 节的配对是“谁能用它”的闸，不要设置“允许所有人”。
- 想让它进一步收手，官方文档还有自定义禁止规则 `approvals.deny`、只许写某几个文件夹的写入范围等设置，见下面的官方文档，本教程没有实测。

官方文档：[Security](https://hermes-agent.nousresearch.com/docs/user-guide/security)、[Checkpoints and /rollback](https://hermes-agent.nousresearch.com/docs/user-guide/checkpoints-and-rollback)、[Running Hermes on a Personal or Work Machine](https://hermes-agent.nousresearch.com/docs/guides/secure-hermes-on-a-work-machine)。

✅ 自查

- [ ] 在飞书里让它删一个文件夹，收到橙色审批卡片，点 Deny 后文件夹还在
- [ ] 建一个用 `rm -rf` 的定时任务，结果里有 `BLOCKED`
- [ ] 发 `/rollback` 能列出快照，退回后删掉的文件回来了

## 下一步

照下一篇[Hermes 日常维护：状态、更新、日志、用量、备份](https://ai.lingnan.top/materials/2026-autumn/w10/hermes-maintenance)，学会平时怎么看它、更新它、备份它。
