Codex 把我电脑文件删了怎么办?防止 Codex 误删文件的正确设置

先把结论放最前面:Codex 会删掉你不想删的文件,绝大多数情况不是它"抽风",而是你给它开了完全访问权限(full access),等于亲手把沙箱拆了。 把权限退回默认档、再配合 Git 和一条 agents.md 规则,这类事故基本可以杜绝。下面讲清楚为什么会删、怎么恢复、以及怎么设置才不会再发生。

我写了十几年代码,最近一年多主要在做 AI 工具链的接入和自动化脚本。Codex 这类能直接操作本地文件系统的 Agent,我在好几台机器上长期挂着跑批量任务。和传统的"问答式 AI"相比,它最大的风险点恰恰就是这个:它真的会动你的磁盘,而不只是给建议。我见过把工作目录之外的文件清掉的情况,触发逻辑几乎都一样——用户一句"帮我清理一下多余的垃圾",外加一个被打开的最高权限。

根本原因:完全访问权限把沙箱关掉了

Codex 默认是带沙箱跑的。它的安全模型由两个独立设置协同决定:一个是审批策略(approval policy,决定什么时候停下来问你),另一个是沙箱模式(sandbox mode,决定它能碰哪些文件、能不能联网)。官方文档把沙箱分成三档(参见 OpenAI 关于 Codex 沙箱的说明):

  • read-only(只读,默认):整个文件系统只读,网络禁用。最安全。
  • workspace-write(工作区可写):只能写当前项目目录,默认不联网。日常推荐。
  • danger-full-access(完全访问):无视沙箱,整台电脑都能改、能删、能联网。

桌面端那三个选项——"默认权限 / 自动审查 / 完全访问权限"——本质就是这套机制的图形化封装。问题就出在第三档:一旦切到完全访问,沙箱边界消失,AI 执行 rm -rf 或批量删除脚本时不会再停下来问你,它认为自己被授权这么做了。

更要命的是语义误解。你说"清理垃圾",你脑子里的"垃圾"是缓存和临时文件,但模型没有你的上下文,它可能把"看起来没用"的目录一并清掉。在受限沙箱里这顶多失败报错,在完全访问下就是真删。

值得一提的是,即便在可写模式下,Codex 也会把 .git.codex 这类目录设为受保护的只读路径(见 OpenAI 开发者文档的审批与安全章节),这也是为什么"退回默认档"能救命——很多保护是沙箱在兜底,而不是靠模型自觉。

已经删了,先试着恢复

如果事故已经发生,按损失范围分两种情况:

  • 项目文件、且项目在 Git 管理下:这是最好的情况。被删但已提交过的文件用 git restore <文件>git checkout -- <文件> 就能找回;如果整个提交被搞乱,git reflog 能找回几乎所有历史状态。这也是我反复强调"动手前先 commit"的原因。
  • 系统文件或未纳入版本控制的文件:立刻停止往该磁盘写入任何新数据(降低覆盖概率),用系统的回收站、时间机器(macOS Time Machine)或文件恢复工具尝试找回。系统盘被误删时,必要时进安全模式操作。

说实话,第二种情况能不能恢复全看运气。所以真正的解法是预防,不是事后。

防止再次误删的四步设置

第一步:把权限退回默认档。 新手不要开完全访问。日常用 workspace-write + 审批策略 on-request 就够了——它能在项目内自由干活,碰项目外的东西或要联网时会停下来问你。CLI 用户可以在 ~/.codex/config.toml 里写死:

approval_policy = "on-request"
sandbox_mode = "workspace-write"

桌面端则在权限菜单里选"默认权限"或"自动审查"。

第二步:给每个项目建 Git。 git init 之后养成习惯:每完成一个小步骤就提交一次。有了提交点,AI 改坏或删错都能一条命令退回。这是成本最低、收益最高的一道保险。

第三步:写一条全局防删规则到 agents.md。 Codex 每次启动会读取 agents.md 作为工作守则。在全局配置(~/.codex/AGENTS.md)里加上这样一段,能显著降低批量删除的概率:

## 文件删除规则
- 禁止使用任何批量删除命令(如 rm -rf、del /s、Remove-Item -Recurse)
- 只能逐个文件删除,且删除前必须先列出清单让我确认
- 涉及工作目录以外的任何路径,一律停下来询问,不得自行操作

这条规则不是万能的(它仍依赖模型遵守),但它和沙箱是两层独立防线,叠加起来才稳。

第四步:高危任务丢进隔离环境。 如果你确实需要让 AI 放开手脚跑(比如装一堆依赖、改系统配置),把它放进容器、虚拟机或一个可丢弃的分支里。官方提供的 --dangerously-bypass-approvals-and-sandbox 旗标,按其文档说明也只建议在容器、VM、CI 这类一次性环境里用,绝不要在你的主力机上对真实仓库这么干。

FAQ

Q:默认档会不会很碍事,老是弹窗问我? A:workspace-git 内的读写不会问,只有越界操作才问。真嫌烦可以开"自动审查",让一个小模型先判断风险,低风险放行、高风险才打断,平衡度最好。

Q:我已经开了完全访问跑了很久,怎么知道有没有被误删? A:如果项目在 Git 下,git statusgit log 能看出文件变动。系统盘层面没有简单的审计办法,这也是不建议长期挂完全访问的原因之一。

Q:agents.md 写了禁止删除,为什么还是删了? A:agents.md 是软约束,靠模型配合;沙箱是硬约束,靠操作系统强制。只写规则不退权限,等于只挂了一道软防线。两者必须一起上。

Q:Mac 和 Windows 的沙箱机制一样吗? A:底层实现不同——macOS 用 Seatbelt,Linux 用 Landlock + Bubblewrap,Windows 用进程隔离。但三档权限的逻辑对用户是一致的,按上面的设置走即可。

一句话收尾:Agent 越强,越要给它套上缰绳。 把权限默认值当成安全带——平时勒着点不舒服,出事时它救命。