Codex 执行策略(Execution Policy)实战指南:精准控制 AI 助手的命令执行权限

引言

当你让一个 AI 编程助手在你的终端里自由执行命令时,信任问题就会摆上台面。Codex CLI 作为 OpenAI 开源的终端 AI 编程代理,内置了一套灵活的执行策略(Execution Policy)系统,让用户和管理员能够精确控制哪些命令需要审批、哪些可以自动执行。本文将深入解析 Codex 执行策略的工作机制、配置方法和最佳实践,帮助你在安全和效率之间找到平衡点。

什么是执行策略

执行策略是 Codex CLI 内建的安全引擎,它在 Codex 准备执行 Shell 命令之前进行拦截和裁决。每当 AI 模型决定运行一个命令时,执行策略引擎会根据预先配置的规则判断该命令应该:

直接执行——无须用户确认,适用于完全安全的读取类操作

需要确认——弹出提示要求用户批准,是默认模式

直接拒绝——阻止执行,适用于被明确禁止的危险命令

这套机制的核心价值在于:你对 AI 的信任不需要是二元的(完全信任 vs 完全不信),而是可以根据命令类型、目录范围和上下文进行细粒度控制。

执行策略的层级结构

Codex 的配置系统采用分层设计,执行策略同样遵循这套层级:

┌─────────────────────────────────┐
│   requirements.toml(管理员层)   │  ← 最高优先级,不可被下级覆盖
├─────────────────────────────────┤
│   config.toml(用户全局层)       │  ← 用户的个人偏好
├─────────────────────────────────┤
│   .codex/config.toml(项目层)    │  ← 项目级共享配置
├─────────────────────────────────┤
│   Session 配置(会话层)          │  ← 仅当前会话有效
└─────────────────────────────────┘

requirements.toml——管理员管控

requirements.toml 是整个配置体系的顶层,主要用于团队或企业部署场景。管理员通过这个文件强制推行安全策略,确保开发人员不会因为个人效率偏好而绕过关键安全检查。

# requirements.toml —— 管理员强制配置
[exec_policy]
default_level = "confirm"      # 默认要求确认
auto_deny = [
    "rm -rf /",
    "git push --force origin main",
    "chmod 777 *"
]

[exec_policy.allowed_directories]
read = ["/home", "/workspace"]
write = ["/workspace"]

配置在 requirements.toml 中的规则不可被项目级或用户级配置覆盖,这是安全管控的最后一道防线。

config.toml——用户自定义

用户的个人配置文件通常位于 ~/.codex/config.toml(Linux/macOS)或 %USERPROFILE%\.codex\config.toml(Windows),用于设置个人偏好的执行策略:

# config.toml —— 用户全局配置
[exec_policy]
default_level = "ask_once"     # 每个命令只问一次

[exec_policy.rules]
# 读取类操作:自动放行
allow = [
    "ls",
    "cat",
    "head",
    "tail",
    "grep",
    "find . -name",
    "git status",
    "git log",
    "git diff",
    "docker ps",
    "npm list",
    "cargo check"
]

# 危险操作:永远拒绝
deny = [
    "rm -rf",
    "git push --force",
    "sudo",
    "chmod 777",
    "> /dev/sda"
]

项目级配置

在项目根目录创建 .codex/config.toml,可以为特定项目定义执行策略:

# .codex/config.toml —— 项目级配置
[exec_policy]
default_level = "confirm"

# 该项目常用的安全命令,减少审批打断
[exec_policy.rules]
allow = [
    "npm run dev",
    "npm run build",
    "npm test",
    "cargo build",
    "cargo test",
    "python -m pytest",
    "docker-compose up",
    "docker-compose down"
]

将此文件提交到 Git 仓库,团队所有成员就能共享一致的执行策略。

审批级别的三种模式

Codex 执行策略支持三个核心审批级别:

1. direct——自动执行

命令完全无需用户确认,直接发送到 Shell 执行。适合纯粹的信息查询命令:

[exec_policy]
default_level = "ask_once"

[exec_policy.rules]
allow = [
    # 所有 ls 变体自动执行
    "ls *",
    # git 读取操作自动执行
    "git status",
    "git diff",
    "git log *"
]

2. confirm——每次都确认

每一条命令都需要用户明确批准。这是最安全的模式,但频繁的确认提示会打断工作流:

[exec_policy]
default_level = "confirm"      # 默认所有命令都需要确认

适合:严格的安全环境、生产服务器操作、不熟悉的代码库。

3. ask_once——只问一次

每个唯一的命令在会话中首次出现时需要确认,后续相同命令自动放行。在安全性和流畅性之间取得了良好平衡:

[exec_policy]
default_level = "ask_once"

适合:日常开发场景,这是 Codex 的默认策略。

命令匹配规则详解

执行策略的核心是对命令字符串进行模式匹配。Codex 支持通配符规则,让你可以精确描述"哪些命令属于哪个类别"。

基础匹配

[exec_policy.rules]
allow = [
    "git status",           # 精确匹配
    "git log",              # 精确匹配
    "ls -la",               # 带参数的精确匹配
]

通配符匹配

[exec_policy.rules]
allow = [
    "ls *",                 # 匹配 ls 及其所有参数
    "git diff *",           # 匹配 git diff 及其所有参数
    "npm run *",            # 匹配所有 npm run 子命令
    "cargo * --check",      # 匹配任意 cargo 命令带 --check 参数
]

deny 优先级高于 allow

当一条命令同时匹配 allowdeny 规则时,deny 获胜:

[exec_policy.rules]
allow = ["git *"]           # 允许所有 git 命令
deny = ["git push --force"] # 但禁止强制推送

目录级控制

除了命令层面的控制,你还可以限制 Codex 能够读写的目录范围:

[exec_policy.allowed_directories]
read = [
    "/home/user/projects",
    "/tmp"
]
write = [
    "/home/user/projects",
    "/home/user/.config"
]

这个配置意味着:Codex 不能读取 /etc 下的配置文件,也不能写入 /home/user/Documents 之外的目录。当 AI 尝试访问受限目录时,执行策略引擎会直接拦截并拒绝。

实战场景配置

场景一:个人开发者日常使用

追求效率,信任 AI 处理常规操作:

# ~/.codex/config.toml
[exec_policy]
default_level = "ask_once"

[exec_policy.rules]
allow = [
    "ls *",
    "cat *",
    "head *",
    "tail *",
    "wc *",
    "find * -name *",
    "grep *",
    "git status",
    "git diff *",
    "git log *",
    "git branch *",
    "cargo check",
    "cargo build *",
    "npm list *",
    "npm outdated",
    "python --version",
    "node --version"
]

deny = [
    "rm -rf *",
    "git push --force *",
    "sudo *",
    "chmod 777 *",
    "shutdown *",
    "reboot"
]

场景二:团队项目 —— 混合策略

由管理员设定基础安全策略,开发者在此基础上进行个性化调整:

requirements.toml(管理员维护,提交到仓库):

[exec_policy]
default_level = "confirm"

[exec_policy.rules]
deny = [
    "rm -rf *",
    "git push --force origin main",
    "git push --force origin master",
    "sudo *",
    "chmod 777 *",
    "dropdb *",
    "DROP *",
    "> /dev/*"
]

[exec_policy.allowed_directories]
write = ["/workspace"]
read = ["/workspace", "/tmp"]

.codex/config.toml(项目级,提交到仓库):

[exec_policy.rules]
allow = [
    "npm run dev",
    "npm run build",
    "npm run test",
    "npm run lint",
    "cargo build",
    "cargo test",
    "cargo clippy",
    "docker compose up *",
    "docker compose down *",
    "docker compose logs *",
    "docker compose ps"
]

场景三:CI/CD 环境

在 CI 管道中运行 Codex 时(通过 codex exec),通常希望完全自动执行,因为 CI 环境本身是沙箱化的:

# CI 环境的 config.toml
[exec_policy]
default_level = "direct"          # CI 中自动执行所有命令

[exec_policy.rules]
deny = [
    "rm -rf /",
    "git push *",
    "aws * --force",
    "kubectl delete *"
]

[exec_policy.allowed_directories]
write = ["/workspace", "/tmp"]
read = ["/workspace", "/tmp"]

执行策略与 Sandbox 模式的协作

Codex 的 Sandbox 模式和执行策略是两套互补的安全机制:

| 维度 | Sandbox 模式 | 执行策略 |
|------|-------------|---------|
| 作用层面 | 操作系统级隔离 | 命令级审查 |
| 生效时机 | 命令开始执行后 | 命令执行之前 |
| 防护目标 | 限制文件/网络访问 | 控制命令类型 |
| 典型用途 | 运行不信任代码 | 审批高风险命令 |

建议同时启用两者:

[sandbox]
enabled = true
network_access = false
writable_directories = ["/workspace"]

[exec_policy]
default_level = "confirm"

这样,即使执行策略放行了一条命令,Sandbox 也会限制其实际影响范围,形成纵深防御。

执行策略的运行时行为

当 Codex 准备执行一条命令时,内部流程如下:

AI 生成命令
    │
    ▼
┌──────────────────┐
│ 执行策略引擎检查   │
│ 1. 匹配 deny 规则  │──→ 命中 → 拒绝执行,通知用户
│ 2. 匹配 allow 规则 │──→ 命中 → 直接执行
│ 3. 检查目录权限    │──→ 越界 → 拒绝执行
│ 4. 回退到默认级别   │──→ 弹出确认提示
└──────────────────┘
    │
    ▼
 用户确认 / 自动通过
    │
    ▼
┌──────────────────┐
│ Sandbox 沙箱包装   │ (如已启用)
└──────────────────┘
    │
    ▼
  命令实际执行

用户可以在命令确认提示时选择:

  • y —— 批准执行
  • n —— 拒绝执行
  • always —— 批准并加入本次会话的 allow 列表
  • never —— 拒绝并加入本次会话的 deny 列表

生命周期 Hooks 与执行策略

Codex 的生命周期 Hooks 也能干预命令执行。结合 Hooks 和执行策略可以实现更精密的控制链:

[hooks.pre_exec]
command = "security_pre_check.sh"

[exec_policy]
default_level = "confirm"

pre_exec Hook 在命令执行前触发,可以在执行策略判断之后、实际执行之前做二次校验。例如,security_pre_check.sh 可以调用外部安全扫描工具检查命令参数。

常见问题与排错

策略不生效?

检查配置优先级:requirements.toml 会覆盖 config.toml,管理员策略优先。

# 查看当前生效的配置
codex config show

命令被意外拒绝?

核对 deny 规则是否过于宽泛,例如 deny = ["rm *"] 会阻止所有包含 rm 的命令。

如何调试匹配规则?

config.toml 中临时开启调试模式:

[debug]
exec_policy_verbose = true

开启后,每次执行策略判断都会在日志中输出匹配过程,方便排查规则命中情况。

总结

执行策略是 Codex CLI 安全体系中最贴近用户日常操作的一环。它让你在享受 AI 编程效率的同时,始终保持对终端命令的可见性和控制力。配置得当的执行策略能够在"几乎无感"的前提下守住安全底线——该放行的自动放行,该拦截的绝不手软。

如果你是个人开发者,建议从 ask_once 模式起步,逐步将常用安全命令加入 allow 列表。如果你是团队 Leader,务必在 requirements.toml 中制定基础安全规则,再让成员在项目配置中扩展,这样既保证了安全基线,又保留了灵活性。