Codex 规则技巧:用 .rules 文件决定哪些命令放行、询问或禁止
不想 Codex 每次运行常用命令都弹窗,又想把危险命令彻底拦住,可以写一个 .rules 文件。本文按官方文档讲清 prefix_rule 各字段的含义、多条规则的优先级、连写命令的拆分方式,以及用 codex execpolicy check 测试规则的方法。
用 Codex 时,每次它要在沙箱外运行 gh pr view 这类命令都弹窗确认,时间长了很打断节奏;反过来,有些危险命令你希望它永远不要碰。Codex 的 规则(rules) 就是用来解决这件事的:用一个 .rules 文件,按命令前缀决定「直接放行」「每次问我」还是「一律禁止」。本文按 OpenAI 官方文档讲清规则文件怎么写、怎么测、有哪些容易踩的坑。官方文档目前把规则标为实验功能。
规则文件放在哪里
在某个生效的配置层旁边建一个 rules/ 文件夹,里面放 .rules 文件。最常用的是用户层:
~/.codex/rules/default.rules
几点要知道:
- Codex 启动时会扫描每个生效配置层下的
rules/,包括团队配置的位置和用户层~/.codex/rules/; - 项目里的
<仓库>/.codex/rules/只有在项目的.codex/层被信任后才会加载; - 在终端界面里把某个命令加入允许列表时,Codex 会自动写进
~/.codex/rules/default.rules,以后运行就不再询问; - 改完规则文件要重启 Codex 才生效。
写第一条规则
规则用 prefix_rule() 来写。下面这条的意思是:在沙箱外运行以 gh pr view 开头的命令前,先问我。
prefix_rule(
pattern = ["gh", "pr", "view"],
decision = "prompt",
justification = "查看 PR 需要确认",
match = [
"gh pr view 7888",
"gh pr view 7888 --json title,body,comments",
],
not_match = [
"gh pr --repo openai/codex view 7888",
],
)
各字段的含义:
- pattern(必填):要匹配的命令前缀,是一个非空列表。每一项可以是一个固定字符串,比如
"pr";也可以是几个候选词组成的列表,比如["view", "list"],表示这个位置上任意一个都算匹配。 - decision:匹配后怎么处理,不写时默认是
allow。 allow:在沙箱外直接运行,不询问;prompt:每次运行前都询问;forbidden:直接拦下,不询问。- justification(可选):写给人看的理由,Codex 会在审批提示或拒绝信息里显示它。用
forbidden时,官方建议在这里写上推荐的替代做法,例如「用 rg 代替 grep」。 - match / not_match(可选):相当于规则自带的小测试。Codex 加载规则时会用这些例子检查,规则写错了能马上发现。上面
not_match里的例子不匹配,是因为 pattern 必须是严格的前缀,参数顺序变了就不算。
多条规则同时命中时
如果一条命令同时匹配好几条规则,Codex 取最严格的结果:forbidden 高于 prompt,prompt 高于 allow。所以可以放心地先写宽一点的 allow,再对其中危险的子命令单独写 forbidden。
连在一起的命令怎么判断
有些工具会把几条命令塞进一个 bash -lc "..." 里执行,比如:
bash -lc "git add . && rm -rf /"
Codex 对 bash -lc、bash -c 以及 zsh、sh 的同类写法做了特殊处理:
- 能安全拆开时就拆开:如果脚本只是普通的词,用
&&、||、;、|连起来,没有变量、通配符这些,Codex 会把它拆成单独的命令逐条套用规则,再取最严格的结果。上面的例子会被拆成git add .和rm -rf /两条,就算你允许了git add,整条命令也不会被自动放行。 - 复杂脚本整体判断:如果用到了重定向(
>、<)、命令替换$(...)、环境变量赋值、通配符*、if/for之类的控制结构,Codex 不去解析,而是把整条bash -lc "<完整脚本>"当作一条命令来套规则。
这样既能逐条检查简单的命令串,又不会因为猜错复杂脚本而放过危险操作。
上线前先测一测
用 codex execpolicy check 看某条命令会得到什么结果:
codex execpolicy check --pretty \
--rules ~/.codex/rules/default.rules \
-- gh pr view 7888 --json title,body,comments
输出是 JSON,包含最严格的决定、命中了哪些规则以及它们的 justification。可以写多个 --rules 把几个文件合起来测,--pretty 让输出更好读。
智能审批会帮你起草规则
智能审批(Smart approvals)默认是打开的。Codex 请求提升权限时,会顺带建议一条 prefix_rule。接受之前一定要看清前缀:前缀太短,放行的范围就会比你想的大。团队管理员还可以在 requirements.toml 里强制加上限制性的规则。
规则文件的语言
.rules 文件用的是 Starlark 语言,写法和 Python 很像,但设计上是安全的:规则引擎执行它时不会产生副作用,比如不会去读写文件。
上手建议
- 先从最常被打断的命令开始,给
git status、gh pr view这类只读命令写allow; - 给不想让它碰的命令写
forbidden,并在 justification 里写上替代做法; - 每条规则都带上
match和not_match例子,改完用codex execpolicy check测一遍再重启。
还没有会员的,可以在 BuyBuy代充(buybuytopup.cn) 开通 ChatGPT Plus,登录 Codex 后就能按上面的方法配好自己的规则。