防止 AI Agent 误删文件,最简单的办法就是加一个 Hook

AI Agent 真会删错文件吗?

会,而且已经发生过了。

2026 年 7 月,前 HyperWrite CEO Matt Shumer 发帖说,他用的 GPT-5.6 Sol 在清理文件时,一个子 Agent 搞错了 $HOME 这个变量,最后运行了:

bash 复制代码
rm -rf /Users/mattsdevbox

Shumer 发现后立刻终止了还在跑的进程,但文件已经被删掉不少了。

另一位开发者 @cremieuxrecueil 也遇到了类似的事。他用 PowerShell 命令过滤文件时,过滤条件没按预期生效,目标文件夹里的文件被批量删掉了。

OpenAI 官方在 GPT-5.6 的系统卡里也记录了:Agent 有时候会做出超出用户本意的操作。虽然概率不高,但只要 Agent 能操作你的文件,一次就够了。

简单来说:AI Agent 能帮你干活,也可能不小心删了你的东西。这不是吓唬人,是真有人中过招。

Codex 不是已经有保护了吗?

你可能想问:Codex 不是默认在沙箱里跑吗?为什么还要自己加保护?

Codex 确实自带几层保护:

  • 工作区隔离:Codex 默认只能在你的项目文件夹里操作,跑不到系统目录去
  • 危险操作提示:某些命令执行前会弹确认框
  • danger-full-access 开关:默认关着,打开后 Agent 才能碰项目外的文件

但这些保护有盲区。比如:

  • 你在自己的项目文件夹里,Agent 把 src/ 当临时文件清理了------这对你来说就是灾难
  • 某些批量操作(比如 find ... -delete)在你给的权限内完全合法,但结果不是你要的

打个比方:Codex 的保护像你家的大门锁,它防外人,但不防你自己在家不小心打翻花瓶。今天加这道保险,相当于在贵重东西旁边再放一层防护。

怎么防?先看看有几种选择

别急着动手,先搞清楚有哪些方法可选:

方法 怎么做 优点 缺点
黑名单(本文) 列一个"不能做"的清单,命中了就拦 简单,几分钟搞定 只能拦住你想到的
白名单 列一个"只能做"的清单,不在清单上的都拦 更安全 太严,正常工作经常被误拦
沙箱 把 Agent 关临时文件夹里,操作完再搬出来 物理隔离,最安全 配置复杂,影响效率
确认弹窗 每次危险操作弹窗问你 你自己把关 问多了你会麻木,习惯点"同意"

黑名单对新手最友好------不用改工作习惯,不用学新概念,配一次就在后台一直保护你。当然它不万能,但做第一道防线非常划算。

本文走黑名单路线,给你一个直接复制粘贴的脚本。

思路一句话:命令执行前,先检查

整个流程很简单:

text 复制代码
你对 Codex 说"帮我做 xxx"
        ↓
Codex 生成了一条命令
        ↓
我们的脚本(Hook)先检查一下
        ↓
  ┌─ 危险命令? → 拦住,不让执行
  │
  └─ 安全命令? → 正常放行

这个"先检查一下"的机制,Codex 叫 PreToolUse Hook。Hook 就是钩子的意思------你在命令执行的路上挂一个钩子,每条命令经过时都会被钩住看一眼。

我们要做的就两件事:

  1. 写一个检查脚本(下面会给,直接复制)
  2. 在 Codex 配置文件里告诉它"用这个脚本检查"

动手第一步:创建拦截脚本

这个脚本检查哪些危险命令?

主要分三类:

  • 递归删除类rm -rfgit clean -fdfind ... -delete 等------这些会删掉整个文件夹
  • 格式化/清磁盘类mkfswipefsdiskutil erasediskformat------这些会清空磁盘
  • 直接写设备类of=/dev/ 开头的命令------这些会往硬件里写数据

这几类命令的共同特点:执行后基本无法恢复,而且日常中很常用、一打错就出事。

打开终端,先创建一个放脚本的文件夹:

bash 复制代码
mkdir -p ~/.agent-hooks

然后创建脚本文件:

bash 复制代码
touch ~/.agent-hooks/block-dangerous-command.mjs

用你习惯的编辑器打开 ~/.agent-hooks/block-dangerous-command.mjs,把下面的代码完整复制进去

javascript 复制代码
let input = '';

process.stdin.on('data', (chunk) => {
  input += chunk;
});

process.stdin.on('end', () => {
  try {
    const payload = JSON.parse(input);
    const command = payload.tool_input?.command ?? '';
    const normalized = command.replace(/\s+/g, ' ').toLowerCase();

    const dangerous = [
      'rm -rf',
      'rm -fr',
      'rm -r -f',
      'git clean -fd',
      'mkfs',
      'wipefs',
      'diskutil erasedisk',
      'of=/dev/',
      'del /f /s /q',
      'rd /s /q',
      'rmdir /s /q',
      'format ',
    ];

    const matched = dangerous.find((pattern) => normalized.includes(pattern));
    const findDelete = normalized.includes('find ') && normalized.includes(' -delete');
    const powerShellDelete =
      normalized.includes('remove-item') && normalized.includes('-recurse');

    if (matched || findDelete || powerShellDelete) {
      console.error(`[安全拦截] 检测到危险命令:${matched ?? '批量删除'}`);
      process.exit(2);
    }
  } catch (error) {
    console.error(`[安全拦截] Hook 输入解析失败:${error.message}`);
    process.exit(2);
  }
});

保存文件。

这段代码做了什么? Codex 要执行命令前,先把命令发给这个脚本。脚本拿着黑名单一条条对,命中了就返回"不行"(退出码 2)。Codex 看到退出码 2 就懂了:这条命令不给执行。

动手第二步:让 Codex 用上这个脚本

打开 Codex 的配置文件。在终端里运行:

bash 复制代码
code ~/.codex/config.toml

如果提示文件不存在,说明 Codex 还没创建过配置文件。在终端里先运行一次 codex 让 Codex 初始化,然后再打开配置文件。

在文件里加上下面这段内容(如果已有 [features] 就只加 Hook 那部分):

toml 复制代码
[features]
hooks = true

[[hooks.PreToolUse]]
matcher = "^Bash$"

[[hooks.PreToolUse.hooks]]
type = "command"
command = "node ~/.agent-hooks/block-dangerous-command.mjs"
timeout = 5
statusMessage = "正在检查命令安全性..."

保存文件。

每行什么意思?

  • hooks = true → 打开 Hook 功能
  • matcher = "^Bash$" → 告诉 Codex:每次用 Bash 工具执行命令时,走这个 Hook
  • command = "node ~/..." → 用 Node.js 运行我们的检查脚本
  • timeout = 5 → 脚本超过 5 秒没返回就算失败,防止卡住
  • statusMessage → 检查时界面上显示的文字

配好之后,打开 Codex,在对话里输入 /hooks 查看刚加的 Hook。第一次配 Hook 的话,Codex 会让你确认"信不信任这个 Hook",点确认就行。

⚠️ 注意 :Codex 官方说,目前 Hook 还没覆盖所有的命令调用。平时还是建议保持工作区隔离,别随便打开 danger-full-access。Hook 是多一层保护,不是万能保险。

测试一下

先试拦截。在 Codex 里输入:

text 复制代码
帮我把 /tmp/agent-hook-test-do-not-create 这个文件夹删掉

正确结果:Codex 尝试执行 rm -rf 时被拦住,界面上先显示"正在检查命令安全性...",然后提示拦截。

这个路径本来就不存在,所以即使万一没拦住也不会删掉真东西,放心测。

再试放行:

text 复制代码
列出当前文件夹里的文件

这条正常命令应该直接通过,不会弹拦截。

两条都过一遍,说明配置成功了。

这道保险能防啥、防不了啥

能防住的:

  • Agent 不小心执行 rm -rf 这种毁灭性命令
  • Agent 自己生成的删除操作
  • 格式化、清空磁盘的命令
  • Windows 下的强制删除(del /f /s /qrd /s /q

防不住的:

  • 命令太绕,脚本没认出来(比如用变量拼出来的危险命令)
  • 通过脚本语言间接删东西(比如 python -c "import os; os.system('rm -rf ...')"
  • 不在黑名单里的破坏操作(比如 echo "" > 重要文件.txt 直接清空文件内容)

所以记住一句话:这道保险是第一层防线,不是唯一防线。

就像你家有门锁,但贵重东西还会放保险柜:

  • Hook 脚本 → 门锁,拦常见的
  • 工作区隔离(Codex 默认开着)→ 房间门,限制活动范围
  • Git / 定期备份 → 保险柜,删了也能找回
  • 重要操作前自己瞄一眼命令 → 你本人,最终决定权

四层加起来,才是一个完整的保护体系。本文教你的是第一层,几分钟就搞定,性价比最高。

一个脚本 + 几行配置 = 给你的 AI Agent 加一道防误删保险。几分钟的事,可能帮你省掉几天的恢复时间。

相关推荐
先吃饱再说2 小时前
组合多个远程 MCP Server:让 Agent 同时调用高德地图、Chrome DevTools 和文件系统
langchain·llm·mcp
码流怪侠2 小时前
StreamingBench:首个流式视频理解基准——多模态大模型离人类实时感知还有多远?
llm·github·音视频开发
先吃饱再说2 小时前
跨进程调用工具:MCP + LangChain 让 Agent 不再“锁死”在单一语言
langchain·llm·mcp
永远的沙雕网友2 小时前
写点粗浅的harness相关内容(1)
agent
为你学会写情书3 小时前
LangChain.js RAG 实战:爬取掘金文章,让 LLM 告别幻觉
agent
带刺的坐椅3 小时前
SolonCode v2026.7.13 发布:多工作区协同、推理水平可控、子代理任务分组、工程体验再进化
llm·agent·codex·solon-ai·claudecode·opencode
张彦峰ZYF3 小时前
大模型LLM ACA - ACP认证考试真题冲刺演练二答案参考
人工智能·lora·llm·embedding·rag·few-shot
掰头战士4 小时前
你本地的LLM有时会胡乱使用tools?不妨用MCP规范LLM工具调用!
node.js·llm·全栈