权限与审批模式
本教程共 32 篇 · 第 13 篇 · 更新于 2026-07-26 · 约 10 分钟阅读
13. 权限与审批模式
本节目标:搞懂沙箱和审批是两个独立旋钮,学会三档预设怎么选、怎么配,知道 Full access 这条红线划在哪。
先理清:你要拧的是两个独立旋钮
新手最容易绕晕一件事:沙箱和审批不是一个东西的两档,是两个互相独立的旋钮,各管各的。
打个比方,沙箱像你开车挂的档位—挂 P 档车根本不动(只读),挂 D 档能在路上跑(工作区可写),挂越野档连沟里都能下(完全访问)。审批像你给自己设的限速提醒—可以见生人就响(最谨慎),可以超速才响(出圈才问),也可以关掉提醒闷头开(不问)。档位决定车能去哪,限速决定啥时候提醒你,两套互不替代。
| 旋钮 | 管什么 | 配置键 | 命令行参数 |
|---|---|---|---|
| 沙箱模式(Sandbox) | 能动多大 | sandbox_mode | --sandbox(-s) |
| 审批策略(Approval) | 问不问你 | approval_policy | --ask-for-approval(-a) |
Note很多人以为「开了完全访问就不弹窗了」—不是。完全访问(沙箱拧到底)和不弹窗(审批拧到底)是两件事。你完全可以「能动整台机器、但每步都问你」,也可以「只能读、但闷头读不打扰」。
三种沙箱模式:能动多大
沙箱旋钮一共三档,用「能不能改文件 / 能不能联网 / 配哪种活」三栏列清楚:
| 沙箱模式 | 能改文件吗 | 能联网吗 | 最适合的活 |
|---|---|---|---|
read-only(只读) | 不能(要改得先批) | 不能 | 审代码、出方案,「别动我东西」 |
workspace-write(工作区可写) | 仅限工作区内 | 默认关,得手动开 | 日常开发的默认档 |
danger-full-access(完全访问) | 整台机器 | 能 | 隔离容器 / VM |
几个最容易想当然写错的细节:
workspace-write 模式下网络默认是关着的。 你以为能写文件了应该也能联网装依赖,但不是。想开网络,在 config.toml 里加:
[sandbox_workspace_write]
network_access = true
Tip我第一次让 Codex 在
workspace-write下npm install,它卡住报了一堆网络错,还以为是代理问题,折腾半天才想起—是沙箱默认没给它联网权限。记住这条,能省你一晚上。
就算开了 workspace-write,有几个目录依然是只读保护的。 Codex 特意设了安全网:
| 受保护路径 | 为什么保护 |
|---|---|
<工作区>/.git | 防止误改 Git 历史 |
<工作区>/.agents | 防止偷偷改智能体配置 |
<工作区>/.codex | Codex 自己的配置目录 |
这个保护是递归的,底下所有东西都跟着只读。所以你不用担心「开了可写它就能改我的 .git」。
三种审批策略:问不问你
沙箱画好了圈,圈边上「该不该停下来问你」就归审批管:
| 审批策略 | Codex 的行为 | 大白话 |
|---|---|---|
untrusted | 只自动跑已知安全的只读操作,其余先问 | 防一切陌生命令,最谨慎 |
on-request | 默认在沙箱圈里自己干,出圈才问 | 最常用的平衡档 |
never | 不弹审批,闷头干 | 自动化常用;权限仍由沙箱决定 |
Note
never(不问)不等于「放飞」。你完全可以read-only+never,意思是「只让它读、而且读的时候一句都别问我」,这是 CI 里只读分析的标准配法。「不问」和「放权」是两码事。
三档预设:Ask for approval / Approve for me / Full access
在桌面 App 和 IDE 里,你看到的不是「沙箱 + 审批」两个旋钮,而是三个打包好的预设档。它们本质就是两个旋钮的组合:
Ask for approval(请求审批)
最安全的平衡档。Codex 可以读和编辑当前工作区文件、跑常规命令,但要联网或越过工作区边界时会停下来问你。
对应底层组合:
sandbox_mode = "workspace-write"
approval_policy = "on-request"
适合日常开发—它在工作区里放手干,出了圈才喊你。
Tip接手陌生项目时,我习惯先用
/permissions切到只读,让它通读出方案,看完心里有底了再切回 Ask for approval 放手。这个习惯避免它一上来就瞎改我还没看懂的代码。
Approve for me(替我审批 / 自动审查)
效率模式。Codex 自己先判断风险—低风险操作(改几个代码文件、跑 lint、跑测试)直接执行,高风险操作(删文件、网络访问、系统目录操作)才停下来问你。
对应底层组合还是 workspace-write,只是审批环节多了个自动审查 agent 替你先过一遍。工作区边界没变,变的只是「谁来审批」。
适合高频开发、大量重复修改、长时间 Agent 工作流—不想一直点「允许」。
Full access(完全访问)
最猛的模式。Codex 基本获得全文件系统访问、网络访问、任意命令执行,基本不再频繁询问。
对应底层组合:
sandbox_mode = "danger-full-access"
approval_policy = "never"
Warning这个模式接近「给 AI sudo 权限」。已经有人删错目录、清空磁盘、误操作丢了几 TB 数据。它只适合 Docker、虚拟机、临时环境、CI/CD 这类删了也不心疼的隔离环境。主力工作电脑、有重要数据的机器—绝对不开。
怎么设:临时改和永久写死
临时改:命令行参数(只管这一次)
启动时把两个参数一带:
codex --sandbox workspace-write --ask-for-approval on-request
简写更短:
codex -s read-only -a on-request "只帮我审一下这段代码,别动手"
进了会话还能当场切,不用退出:
/permissions
弹出选择器,挑你要的档,即时生效。
永久改:写进 config.toml
每次都敲参数太烦,把常用组合写进 ~/.codex/config.toml:
approval_policy = "on-request"
sandbox_mode = "workspace-write"
想要「最谨慎」的兜底配法,用这组:
approval_policy = "untrusted"
sandbox_mode = "read-only"
等于每次启动都从最严开始,需要放权时再手动切。生产项目、共享机器适合这么兜底。
Note自 v0.142 起,官方推出 permission profiles(权限配置档,Beta)替代旧预设。你的
/permissions菜单可能显示为Ask for approval/Approve for me/Full access这类审批策略档。要切只读时改走启动参数codex --sandbox read-only,或在config.toml写sandbox_mode = "read-only"。
Codex 启动时默认给你哪一档
Codex 启动时其实已经替你智能选了一档默认值—而且它选哪档,跟你这文件夹有没有 Git 有关:
| 你启动的文件夹 | 默认推荐 |
|---|---|
| 有 Git 管着 | Auto 档(workspace-write + on-request) |
| 没有 Git | read-only(只读) |
这设计戳中要害:有 Git 兜底,改砸了能 git diff 看、能回滚,所以敢放它在工作区写;没 Git 的目录改了就改了、没法回退,所以默认只读保平安。
Full access 的红线
--yolo(完全放开)是那道红线。它既拆掉沙箱、又关掉审批,等于让 Codex 在你整台机器上为所欲为、还一句都不问。命令行一把梭的写法:
codex --dangerously-bypass-approvals-and-sandbox
# 简短别名:
codex --yolo
该不该开,照这张表对号:
| 场景 | 敢不敢开 |
|---|---|
| 隔离容器 / VM / dev container | 敢,删的也是一次性环境 |
| CI 里跑一次性任务(容器内) | 敢,但环境本身得是隔离的 |
| 自己日常开发的本机 | 不开,宁可慢点也留着审批 |
| 装着生产代码、有重要数据的机器 | 绝对不开,这是炸弹 |
Warning就算在 devcontainer 里开完全访问,也不是绝对安全—一个恶意项目能把容器内能拿到的东西(包括你的 Codex 登录凭据)全偷走。所以哪怕在容器里,也只对可信的代码仓库这么干。
正确姿势是用 Docker / dev container 把外层隔离做好,再在容器里跑 --yolo—让容器当那道安全边界,而不是裸着在本机上拆缰绳。
动手:5 分钟把三档松紧切一遍
- 建个空目录,进去启动:
mkdir -p ~/perm-demo && cd ~/perm-demo
codex
注意:这个目录没初始化 Git。按默认逻辑,Codex 很可能一进来就给你
read-only起步。
- 确认当前档位:
/status
能看到当前的沙箱模式、审批策略,以及工作区包含哪些目录。
- 在只读档下,让它干一件「要写文件」的事:
帮我新建一个文件 hello.txt,里面写一行 hello codex
它不会默默建好,而是停下来请求批准—因为「写文件」突破了 read-only 的边界。
- 切到工作区可写,对比放行的顺滑:
/permissions
切到 Auto / Workspace Write 那一档,再让它建一次 hello.txt。这回它直接建好、不再问你。
- 感受网络默认是关的:
帮我用 curl 访问一下 https://example.com
它要么停下来请求联网批准、要么直接报访问失败—印证「能写文件 ≠ 能联网」。
小结
| 你要做的事 | 用什么 | 关键点 |
|---|---|---|
| 调「能动多大」 | 沙箱 --sandbox | read-only / workspace-write / danger-full-access |
| 调「问不问你」 | 审批 --ask-for-approval | untrusted / on-request / never,和沙箱独立 |
| 临时改这一次 | 命令行参数 / /permissions | 进会话能当场切档 |
| 永久写死默认 | config.toml | sandbox_mode + approval_policy |
| 完全放开 | --yolo | 只在隔离容器里碰,本机生产机免谈 |
权限缰绳攥在手里了。很多人现在的习惯是:平时 Ask for approval 或 Approve for me,需要时临时切 Full access,做完再切回来。这是目前最合理的工作流—弹窗烦不是理由,烦,也比后背发凉强。
下一章咱们深入沙箱的底层实现—Linux 上怎么用 bwrap 隔离、Windows 上怎么做原生沙箱,以及危险命令检测是怎么拦住 rm -rf / 这种要命操作的。