规则
如需完整文档索引,请参阅 llms.txt。文档页面的 Markdown 版本可通过在页面后追加
.md来获取 URL。
使用规则控制 Codex 可以在沙箱外运行哪些命令。
规则处于实验阶段,可能会发生变化。
创建规则文件
Section titled “创建规则文件”- 创建一个
.rules文件,放在一个rules/文件夹下,该文件夹与一个活动配置层相邻(例如,~/.codex/rules/default.rules)。 - 添加一条规则。此示例会在允许
gh pr view在沙箱外运行前进行提示。
# Prompt before running commands with the prefix `gh pr view` outside the sandbox. prefix_rule( # The prefix to match. pattern = ["gh", "pr", "view"],
# The action to take when Codex requests to run a matching command. decision = "prompt",
# Optional rationale for why this rule exists. justification = "Viewing PRs is allowed with approval",
# `match` and `not_match` are optional "inline unit tests" where you can # provide examples of commands that should (or should not) match this rule. match = [ "gh pr view 7888", "gh pr view --repo openai/codex", "gh pr view 7888 --json title,body,comments", ], not_match = [ # Does not match because the `pattern` must be an exact prefix. "gh pr --repo openai/codex view 7888", ], )- 重启 Codex。
Codex 启动时会扫描每个活动配置层下的 rules/,包括 Team Config 位置,以及用户层中的 ~/.codex/rules/。项目本地的 <repo>/.codex/rules/ 规则仅在项目 .codex/ 层受信任时加载。
当你在 TUI 中将命令添加到允许列表时,Codex 会写入用户层中的 ~/.codex/rules/default.rules,这样未来运行时即可跳过提示。
启用智能审批(默认)时, Codex 可能会在升级请求期间为你建议一个
prefix_rule 。接受前请仔细检查建议的前缀
。
管理员也可以强制执行限制性的 prefix_rule 条目,这些条目来自
requirements.toml。
了解规则字段
Section titled “了解规则字段”prefix_rule() 支持以下字段:
pattern(必填):定义要匹配的命令前缀的非空列表。每个元素可以是:- 字面字符串(例如
"pr")。 - 字面值的联合(例如
["view", "list"]),用于匹配该参数位置的多个备选值。
- 字面字符串(例如
decision(默认为"allow"):规则匹配时采取的操作。当多条规则匹配时,Codex 会采用限制性最强的决定(forbidden>prompt>allow)。allow:在沙箱外运行命令,不提示用户。prompt:每次匹配的调用运行前进行提示。forbidden:不提示用户,直接阻止请求。
justification(可选):为规则提供非空且便于人类理解的理由。Codex 可能会在批准提示或拒绝消息中显示该理由。使用forbidden时,请在理由中适当包含推荐的替代方案(例如"Use \rg` instead of `grep`.“`)。match和not_match(默认为[]):Codex 加载规则时会验证的示例。使用这些示例可在规则生效前发现错误。
当 Codex 考虑运行某条命令时,会将命令的参数列表与 pattern 进行比较。在内部,Codex 会将命令视为参数列表(类似于 execvp(3) 接收的参数)。
Shell 包装器和复合命令
Section titled “Shell 包装器和复合命令”某些工具会将多个 Shell 命令包装到单次调用中,例如:
["bash", "-lc", "git add . && rm -rf /"]由于此类命令可能会在单个字符串中隐藏多个操作,Codex 会对 bash -lc、bash -c 及其 zsh / sh 等价形式进行特殊处理。
Codex 可以安全拆分脚本的情况
Section titled “Codex 可以安全拆分脚本的情况”如果 Shell 脚本是一个仅由以下内容组成的线性命令链:
- 普通单词(不包含变量展开、
VAR=...、$FOO、*等) - 使用安全运算符(
&&、||、;或|)连接
那么 Codex 会使用 tree-sitter 对其进行解析,并在应用你的规则前将其拆分为单独的命令。
上面的脚本会被视为两个单独的命令:
["git", "add", "."]["rm", "-rf", "/"]
然后,Codex 会根据你的规则评估每条命令,并采用限制性最强的结果。
即使你允许 pattern=["git", "add"],Codex 也不会自动允许 git add . && rm -rf /,因为 rm -rf / 部分会被单独评估,并阻止整个调用被自动允许。
这样可以防止危险命令与安全命令一起被偷偷带入。
Codex 不拆分脚本的情况
Section titled “Codex 不拆分脚本的情况”如果脚本使用了更高级的 Shell 功能,例如:
- 重定向(
>、>>、<) - 替换(
$(...)、...) - 环境变量(
FOO=bar) - 通配符模式(
*、?) - 控制流(
if、for、带赋值的&&等)
那么 Codex 不会尝试解释或拆分它。
在这些情况下,整个调用会被视为:
["bash", "-lc", "<full script>"]并且你的规则会应用于这一次单独的调用。
通过这种处理方式,在可以安全拆分时,你可以获得逐条命令评估的安全性;无法安全拆分时,则采用保守行为。
测试规则文件
Section titled “测试规则文件”使用 codex execpolicy check 测试规则如何应用于某条命令:
codex execpolicy check --pretty \ --rules ~/.codex/rules/default.rules \ -- gh pr view 7888 --json title,body,comments该命令会输出 JSON,其中显示限制性最强的决定和所有匹配的规则,包括匹配规则中的任何 justification 值。使用多个 --rules 标志可合并文件,并添加 --pretty 以格式化输出。
了解规则语言
Section titled “了解规则语言”.rules 文件格式使用 Starlark(参见语言规范)。其语法类似 Python,但专为安全运行而设计:规则引擎可以在没有副作用的情况下运行它(例如,不接触文件系统)。