防止 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 加一道防误删保险。几分钟的事,可能帮你省掉几天的恢复时间。

相关推荐
小马92615 小时前
GPT-6 Swarm 架构深度解析:从单体模型到 Agent 集群协同的范式跃迁
gpt·架构·大模型·openai·agent·分布式ai·swarm架构
utmhikari16 小时前
【AI原生】用AI-Native的方式编写SRE告警诊断Agent和Skill
人工智能·agent·稳定性·ai-native·sre·skill·rca
元Y亨H16 小时前
LangChain API 调用语言模型
langchain·llm
元Y亨H16 小时前
大模型技术 LangChain 概述
langchain·llm
元Y亨H16 小时前
大模型技术 提示词模板 概述
langchain·llm
元Y亨H1 天前
大模型技术 模型调用结果解析 概述
google·langchain·llm
元Y亨H1 天前
大模型技术 Ollama 概述
llm·ollama
chaors1 天前
DeepResearchSystem 0x06:LLM as Judge
llm·agent·ai编程
武子康1 天前
GPT-5.6 Luna 降价 80%:Agent 真正该重算的是单次成功成本
人工智能·chatgpt·llm
冬奇Lab1 天前
开源项目第172期:agentOS — 以库的形式给 AI Agent 一个操作系统,冷启动 92x 更快、内存 47x 更少
人工智能·开源·agent