当你让一个 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 —— 管理员强制配置
[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 中的规则不可被项目级或用户级配置覆盖,这是安全管控的最后一道防线。
用户的个人配置文件通常位于 ~/.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 执行策略支持三个核心审批级别:
direct——自动执行命令完全无需用户确认,直接发送到 Shell 执行。适合纯粹的信息查询命令:
[exec_policy]
default_level = "ask_once"
[exec_policy.rules]
allow = [
# 所有 ls 变体自动执行
"ls *",
# git 读取操作自动执行
"git status",
"git diff",
"git log *"
]
confirm——每次都确认每一条命令都需要用户明确批准。这是最安全的模式,但频繁的确认提示会打断工作流:
[exec_policy] default_level = "confirm" # 默认所有命令都需要确认
适合:严格的安全环境、生产服务器操作、不熟悉的代码库。
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 参数
]
当一条命令同时匹配 allow 和 deny 规则时,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 管道中运行 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"]
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 沙箱包装 │ (如已启用)
└──────────────────┘
│
▼
命令实际执行
用户可以在命令确认提示时选择:
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 中制定基础安全规则,再让成员在项目配置中扩展,这样既保证了安全基线,又保留了灵活性。