Codex:一条命令为何会执行、询问或停下?
固定研究版本:官方仓库
openai/codex@c44deff7b1083e9660ac55d02122481f1cdf139b,核对日期 2026-09-23。本篇只讨论 Rust core 中exec_command的局部路径;证据是源码静态阅读,不是运行实测,也不代表所有 Codex 宿主、工具或配置都走同一路径。
30 秒读懂
模型提出 exec_command 并不等于命令立即在宿主机运行。Handler 先解析参数、解析当前执行环境和权限请求;Unified Exec 随后让 exec policy 对命令给出 Skip、NeedsApproval 或 Forbidden。只有未被禁止且必要审批通过的请求,才进入沙箱选择与第一次执行。第一次被沙箱拒绝也不等于自动无沙箱重试:策略、拒绝类型、文件系统 deny-read 限制和审批状态会继续决定能否重试。Handler · 策略映射 · 执行编排
可编辑图源 · PNG 预览 · 不看图的说明
这篇刻意缩窄了什么
本图不是“Codex 整体架构图”,也没有把“审批”和“沙箱”画成同一个开关。审批决定是否允许某次行动;沙箱决定一次执行可触及的资源边界。Skip 表示该次执行无须普通审批,并不必然表示无沙箱;只在源码规定的例外条件下才可能绕过第一次沙箱。第一次沙箱覆盖条件
它还不是“危险命令检测器”的完整说明:未匹配规则时的回退判定受审批策略、沙箱配置、命令分类和平台条件影响;本篇只展示决策结果如何影响这条工具路径。未匹配命令回退
下一步
跟读关键代码路径,再对照 Pi 的“小核心”理解两种系统的权限边界。后续章节应单独研究 Codex 的 turn 状态、上下文压缩、Skill 发现与加载,而不是在本图里塞进全部概念。
图的文字说明 · codex-exec-approval
从左到右看第一行:模型提交 exec_command(cmd);Handler 验证环境、参数与权限;exec policy 产出三种决策。Forbidden 在执行前终止,NeedsApproval 要求审核并可能被拒绝,Skip 不要求普通审批,但不等于无沙箱。允许继续的请求汇合到沙箱选择与第一次执行;这里的路径是 ToolOrchestrator → UnifiedExecRuntime。第一次执行成功直接返回输出或进程会话;若出现沙箱拒绝,还须检查具体重试条件。不满足条件时返回拒绝;满足条件时可能追加审批,再进行第二次尝试。图中虚线表示有条件而非必经路径。网络审批、平台后端和 apply_patch 拦截不在图内展开。
本图只映射 openai/codex@c44deff7b1083e9660ac55d02122481f1cdf139b 的 Rust core 局部源码。代码路径及停止条件详见关键代码路径。它不是运行轨迹;不包含 apply_patch 拦截分支、平台沙箱实现和网络审批细节。
在线预览稿:书稿仍在校稿,系统篇以文内固定源码版本为准;静态阅读不等于运行验收。