Codex CLI 怎么用
一个住在你终端里的 AI 编程代理:你说人话下指令,它读代码、改文件、跑命令——装完到用顺,一条能跑通的路。
📅 更新于 2026-09-13
本文校对于 OpenAI Codex CLI @ 0.154.0 · 官方源:learn.chatgpt.com/docs/codex/cli
0030 秒速览:三句话、一张处境表、一条上手路径
读完这一篇,你能自己判断三件事:这个工具能不能替你干活、它干活时会被什么卡住、以及你什么时候必须自己看一眼再放行。它不教你怎么写代码,教的是怎么指挥一个会写代码的代理。
① 它不是"你问我答给你一段代码",而是直接在你的项目里动手——读文件、改文件、跑命令,改完汇报给你(01)。② 管住它靠两个互相独立的开关:沙箱决定它技术上"能碰到哪",审批决定它什么时候"必须停下来问你";默认是"工作区内自己干、越界先敲门"(08)。③ 它没有"撤销键",回退能力来自你的 git——开工前 git commit 一次,比任何安全设置都管用(12)。
按你的处境,直接用这个
| 你现在的状态 | 直接用这个 | 为什么 / 看完你会知道 |
|---|---|---|
| 我只是想问几个问题,不想装东西 | 用网页版 ChatGPT | 为一个小问题起一个带沙箱的本地代理不划算(04) |
| 我有 ChatGPT 订阅,想在终端里干活 | codex login(用订阅登录) | 订阅额度直接复用,不用另外付 API 钱(05) |
| 我要把它塞进脚本 / CI | codex exec + CODEX_API_KEY | 一次性跑完就退出,不等人按按钮(11) |
| 我刚进一个陌生的开源仓库 | codex --sandbox read-only | 先让它只读侦察:它看得见、碰不动,翻车概率最低(10) |
| 我要改一个重要文件,怕它乱动 | 开工前 git commit,改完看 /diff | 沙箱不是撤销键;git 才是你的后悔药(12) |
| 它老是不按我的项目规矩来 | 在项目根写一份 AGENTS.md | 它每次开工前都会自动读这份说明书(09) |
| 它每次改完我都得自己去跑测试 | 把验证命令写进指令或 AGENTS.md | 让它"自证",而不是嘴上说改好了(10) |
| 公司网络走内网证书 / 服务器没有浏览器 | codex login --device-auth | 设备码登录:终端给一个网址加一次性代码(05) |
| 我想让它用别的模型(含本地模型) | 配置 [model_providers.xxx] | 把"干活的大脑"换成 OpenAI 兼容的后端(13) |
| 我在只看不练,想一次读完 | 按侧边栏顺序读,跳过 08 与 11 也只影响完整性 | 08 与 11 是"边界"和"自动化",可以回头补 |
一条可执行的上手路径
curl -fsSL https://chatgpt.com/codex/install.sh | sh,然后 codex --version 确认装上了。登录直接 codex login,有订阅就用订阅;没有桌面浏览器就 codex login --device-auth。
mkdir ~/codex-practice && cd ~/codex-practice && git init,放一个几行的小文件,然后 codex --sandbox read-only,只让它解释这个目录里有什么。先建立"它看得见、碰不动"的体感。
默认档位下让它给那个小文件加一个函数并跑一次验证。在每个"等你批"的节点停下来读一眼,不要一路按 y。
在这个练习目录敲 /init 生成一份 AGENTS.md 草稿,补上"怎么跑测试、哪些目录别碰、提交前先给我看 diff",然后继续用它干活——你会发现它开始主动遵守你的约定。
用自己的话说清它和"网页聊天框"的区别;独立完成安装、登录、第一次带验证的改动;说得出沙箱与审批这两个开关分别管什么、默认档位是什么;并且知道什么时候该切到只读档、什么时候绝对不该开 --yolo。
本文讲的是跑在你自己终端里的 Codex CLI(0.154.0),不是网页里的云端 Codex,也不是编辑器插件。它迭代很快,命令与默认值以你本机 codex --help 输出为准。
01它到底是什么:一个会动手的代理,不是一块更长的聊天框
它是什么
Codex CLI 是 OpenAI 官方开源的一个"终端里的 AI 编程代理"。"代理(agent)"这个词的意思是:你说目标,它自己规划并按步骤执行——不是每步都等你说,而是在你给的边界内自己往前走。它的官方描述是一句话:a coding agent from OpenAI that runs locally on your computer(一个跑在你电脑本地的编程代理)。你在终端敲 codex 打开它,用自然语言说"把 src/login.js 里空密码抛错的 bug 修掉,改完跑 npm test 确认",它就会读文件、改文件、跑命令,最后把结果说给你听。
代码是开源的,用 Apache-2.0 协议发布,仓库在 github.com/openai/codex。新版主体是 Rust 写的原生程序,所以你看到的 npm、Homebrew、安装脚本这些入口,本质都在给你装同一个可执行文件。
它不像什么(先破四个错想)
以为它像编辑器里的自动补全那样,只负责把这一行补完。
补全(如 Copilot 那类)只预测"下一行写什么";代理是"理解这个任务 → 读相关文件 → 规划 → 改多处 → 跑命令验证"。它动的是你的文件,不只是你的光标位置。
以为拿到的是代码片段,装不装、跑不跑、对不对,全得你自己来。
它写进文件、跑你的测试、把输出贴回来。你负责的是审阅和批准,而不是搬运。
以为开一个开关就从头跑到尾,中间不用管。
默认档位下它改文件、跑命令前会停下给你看,你点头它才继续。
以为开源软件就等于不要钱。
它开源的是客户端程序;写代码的"脑子"是云端模型,要么走你的 ChatGPT 订阅额度,要么走 API 按用量计费(03)。
它和网页版、IDE 插件是不是一回事
不是。OpenAI 的 Codex 有好几种形态,能力相近,但"跑在哪、钱给谁、怎么控制"完全不同。本文只讲第一行那个 CLI。
| 形态 | 跑在哪 | 你怎么用它 | 什么时候选它 |
|---|---|---|---|
| Codex CLI(本文) | 你自己的电脑,本地终端 | 敲 codex,操作本地文件与命令 | 深度改码、要看清每一步、要接脚本 |
| IDE 扩展 | VS Code / Cursor / Windsurf 里 | 在编辑器里对选区或打开的文件下指令 | 你本来就在编辑器里,想让代理看得见你选中的代码 |
| Codex 桌面应用 | macOS / Windows 图形界面 | 终端敲 codex app 打开 | 想要图形界面与会话管理,不想背命令 |
| Codex Web / 云端 | OpenAI 托管的远程环境 | 在 chatgpt.com/codex 里提交任务 | 本机没环境、想临时用、想去开个 PR |
CLI 与编辑器扩展共用同一份本地登录缓存(同一个账号,登一次两边都算登了),所以你可以"终端干重活、编辑器里随手问"。但它们是不同的程序、不同的边界:"我在网页版里用过 Codex"不等于"我会用 CLI"。本文所有命令只适用于本地 CLI。
它帮你干的是哪几类活
改代码 / 修 Bug(最主要的用途:你描述需求,它规划、跨文件修改、跑验证)· 读懂陌生项目(问它"这项目是干嘛的、模块怎么分工",适合刚接手别人代码的第一天)· 跑命令 / 自动化(跑测试、批处理、审 diff,还能用 codex exec 接进脚本和 CI)· 写文档 / 注释(几十个文件的重复文本劳动,它不改逻辑,风险最低、性价比最高)。
02没有它会怎样:一条断掉的链路
传统"用 AI 写代码"卡在哪
不用代理的时候,你大概是这样干的:在网页聊天框问 AI → 拿到一段代码 → 手动复制进编辑器 → 手动装依赖、跑测试 → 报错再贴回去问……问题不在"AI 写得不好",而在每一步之间都要你人工搬运一遍,而且 AI 看不见搬运后的结果。
1. 在网页问 AI
2. 复制代码贴进编辑器
3. 自己装包、跑测试
4. 报错复制回去重新问
5. 自己 git add / git commit
链路是断的:AI 看不到第 3 步的结果,也管不了第 5 步。
1. 在终端说"修这个 bug,改完跑测试确认"
2. 它读库、改文件、跑测试
3. 改动前把 diff 给你看、征求同意
4. 你审阅后说"好",它汇报结果
你只剩两件事:下指令、审阅。
它把哪些环节收进去
它收进去的是"看代码、改代码、验证、交给版本库"这一整条链路。注意最后一个环节:它并不替你决定"要不要提交",而是把"现在改了哪些文件"变成一份随时可查的 diff(改动差异,一行行告诉你加了什么、删了什么)。
为什么它要装"沙箱"这么重的东西
因为一个能自己跑命令的程序,风险也是自己跑出来的:它可能删掉你的文件、可能把密钥发到网络、可能在你不知情时改了别处的配置。官方的说法是——安全由两层共同构成:沙箱管"技术上能碰到哪",审批管"什么时候必须问你";两层配合带来的那句关键陈述是:你信任的不是代理的意图,而是它运行在被强制执行的边界之内(原文:You aren't just trusting the agent's intentions; you are trusting that the agent is operating inside enforced limits.)。这句话值得记住,它是理解后半篇文章的钥匙。
把它想成你雇来的装修工:沙箱 = "只许在这套房子里动",审批 = "动承重墙之前先问你"。这个类比到这里失效:装修工不会因为你不在就忘记你交代过的话,而这东西的记忆只有当前这次会话——换一次会话它就可能忘掉你早先说过的偏好。所以项目级的约定要写进文件(09),不能靠嘴说一次。
03钱、模型和"能不能离网":六个现实问题
它收费吗
程序本身免费(开源),但"写代码的脑子"在云端,所以一定有成本,两条路选一条:
| 维度 | ChatGPT 订阅登录(日常推荐) | API Key 登录 | 什么时候选哪条 |
|---|---|---|---|
| 计费方式 | 走你的 ChatGPT 套餐额度(Plus / Pro / Business / Edu / Enterprise 等) | 按用量计费,走 OpenAI 平台标准费率 | 天天在电脑前写代码 → 订阅;要在 CI 里跑 → API Key |
| 登录命令 | codex login(浏览器) | printenv OPENAI_API_KEY | codex login --with-api-key | 服务器无浏览器 → 加 --device-auth |
| 团队 / 云端功能 | 可用(部分工作区功能依赖订阅身份) | 部分受限或不可用 | 要团队功能就老实用订阅登录 |
| 额度控制 | 受套餐额度约束 | 按密钥用量,可精确控成本 | 给自动化单独发一把 Key,别用你的个人号 |
没有"完全免费无限用"这回事。官方原话是:用 API Key 登录时,按标准 API 价格计费,而不是用你套餐里包含的额度。
我的代码会被发到 OpenAI 吗
会,这是它"懂你项目"的前提:你让它读的文件内容、它跑出来的命令输出,都会送到云端模型做推理。官方在安全文档里也把这一点当成默认前提在写。所以:含密钥、含客户数据的文件,不要放它去读;确有合规要求的项目,先确认你们的数据处理条款再决定用不用。
断网能用吗
默认不能。有一个例外:你自己把模型供应方换成本地跑的模型(见 13 的 provider 配置),那才能离线干活——代价是本地模型能力普遍弱于云端旗舰模型,复杂改码更容易翻车。
它能连别的模型吗
能。默认连 OpenAI 自己的模型,也允许你配 OpenAI 兼容的后端(社区常用 Ollama、LM Studio 跑本地模型)。具体键名以你的版本与官方配置参考为准,别照抄网上某个旧版本的写法。
支持 Windows 吗
官方完整支持是 macOS 与 Linux;Windows 推荐走 WSL2(在 WSL2 里按 Linux 方式装)。原生 Windows 现在也有自己的沙箱实现,但需要额外设置,不是默认路径。Linux 侧还有一个前置条件:需要 bubblewrap(一个让程序在受限环境里运行的小工具),Ubuntu/Debian 用 sudo apt install bubblewrap,Fedora 用 sudo dnf install bubblewrap。
它和隔壁的 Claude Code / OpenCode 选哪个
| 维度 | Codex CLI | Claude Code | OpenCode |
|---|---|---|---|
| 出品方 | OpenAI 官方 | Anthropic 官方 | 开源社区 |
| 默认模型 | OpenAI 模型(可自配后端) | Claude 模型 | 供应商可配 |
| 开源性 | Apache-2.0 | 部分开源 | 开源 |
| 招牌能力 | 系统级沙箱 + 审批的双层边界 | 生态丰富、指令文件约定深入人心 | 自由、社区驱动 |
| 给你的选择信号 | 已有 ChatGPT 订阅或 API 用量,几乎零额外成本 | 本来就常用 Claude | 想自己接各种模型 |
三者玩法大同小异,方法论通用——学会一个,另外两个上手都很快。真要选,最靠谱的办法是拿同一个练习项目跑同一个任务,比手感,而不是比参数表。
04什么时候不该用它:四种诚实的例外
这一节不是客套。前面讲的是它擅长什么,这里讲它会让你后悔的四种情况。
| 你的情况 | 为什么不该用它 | 换个什么做法 |
|---|---|---|
| 只想问一句话,拿到一段现成代码 | 为一个小问题起一个带沙箱的本地代理,又慢又贵 | 直接用网页聊天 |
| 你打算完全不看改动,就让它大改 | 它的价值来自你的审阅;不看 diff 的用法,只会不断给你留烂摊子 | 先用只读档让它讲方案,确认方向再放权 |
| 代码属于高度敏感数据,不能出本机 | 推理在云端,你让它读的内容就会传输 | 用本地模型跑只读分析,或走你们合规的数据处理渠道 |
| 你完全不想碰终端,只想点鼠标 | 它毕竟是命令行程序 | 用它的桌面应用或编辑器扩展,那些是同一个代理的图形入口 |
一句话:它最适合"愿意下指令 + 愿意审阅"的人。它替你搬的是体力活(读库、改码、跑验证),判断力还得你自己出。
05从零到第一次改动:装、登、验
它要求什么环境
| 项目 | 要求 | 为什么是这条线 |
|---|---|---|
| 操作系统 | macOS 或 Linux(含 WSL2,即 Windows 里的 Linux 子系统);Windows 在 WSL2 内按 Linux 方式装;原生 Windows 有自己的沙箱但需额外设置 | 沙箱依赖各系统的本地机制,官方支持范围跟着它走 |
| 终端 | 会用"打开终端、粘贴、回车"就够 | 你不需要会编程,只需要会下指令 |
| 网络 | 需要能连上模型端点 | 推理在云端,这是硬依赖 |
| Linux 附加 | bubblewrap | Linux 上的沙箱靠它实现;缺了会启动告警 |
| Git | 建议提前装好 | codex exec 默认要求在 git 仓库里跑;回退也靠它 |
| 账号 | ChatGPT 订阅,或 OpenAI API Key | 二选一,见 03 |
装它的四种方式,选一种就好
下面每种都核对过官方文档。新手直接用第一种。
# 方式一:官方安装脚本(macOS / Linux,推荐)
curl -fsSL https://chatgpt.com/codex/install.sh | sh
# 方式二:Homebrew(macOS,你已经装了 brew 的话)
brew install --cask codex
# 方式三:npm(系统里已有 Node.js)
npm install -g @openai/codex
# 方式四:Windows(在 PowerShell 里)
powershell -ExecutionPolicy ByPass -c "irm https://chatgpt.com/codex/install.ps1 | iex"
安装脚本默认从 releases.openai.com/codex 下载;如果那边拿不到元数据或资源,会自动退回 GitHub Releases。想强制走 GitHub Releases,在命令前设一个环境变量:
curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_INSTALLER_USE_RELEASES_OPENAI_COM=false sh
也可以直接去 GitHub Releases 下压缩包,解压后把里面那个程序改名为 codex,放进 PATH(系统查找命令时依次搜索的那串目录清单)里的某个目录。Apple Silicon Mac 对应的文件名里带 aarch64-apple-darwin,Linux x86_64 对应 x86_64-unknown-linux-musl。
以后不想要了,怎么卸干净
按你当初的安装方式选一行:brew uninstall --cask codex(Homebrew 装的)或 npm uninstall -g @openai/codex(npm 装的)。如果连配置和登录态也不要了,再删掉主目录:rm -rf ~/.codex——这一步会一并删掉你的配置、AGENTS.md 与登录状态,只在确定不再用时执行。
装完先做三件事
codex --version。能打印出版本号(本文校对时是 0.154.0)就说明装上了。
codex --help。这一步别省:Codex 迭代很快,网上旧教程里的子命令名可能已经变了,你本机的输出才是唯一权威。
codex login 会打开浏览器让你用 ChatGPT 账号登录。登录信息会缓存在本地,CLI 和编辑器扩展共用这一份。
登录:三种情况分别怎么做
| 你的情况 | 命令 | 注意 |
|---|---|---|
| 有桌面浏览器 | codex login | 浏览器走完流程后凭据会回到终端 |
| 服务器上、没有图形界面 | codex login --device-auth | 设备码登录(beta):终端给你一个网址和一次性代码,在任意浏览器里输进去授权 |
| 要用 API Key(自动化 / 按量付费) | printenv OPENAI_API_KEY | codex login --with-api-key | 用管道把 Key 喂进去,别让 Key 出现在终端历史里 |
| 企业自动化用 access token | printenv CODEX_ACCESS_TOKEN | codex login --with-access-token | 需要管理员在 ChatGPT Enterprise 工作区里授权 |
| 查看当前登录状态 | codex login status | 有凭据时退出码为 0,脚本里可以直接判断 |
| 退出登录 | codex logout | 清掉本地保存的凭据 |
公司环境要走内网证书的,在登录前设 CODEX_CA_CERTIFICATE 指向你们的根证书文件(没设时它会退回读 SSL_CERT_FILE):
export CODEX_CA_CERTIFICATE=/path/to/corporate-root-ca.pem
codex login
登录凭据存在哪
默认它是明文存在 ~/.codex/auth.json 这个文件里的——里面装的是你的访问令牌(access token,证明"你是你"的一串凭证)。官方给的建议原话级别就是:把它当密码对待。所以:不要提交进 git、不要贴进工单、不要在聊天里发给别人。
想不落明文,改配置用一个键就能切到系统钥匙串:cli_auth_credentials_store = "keyring"(写在 ~/.codex/config.toml 里)。四个取值的区别:file 写进 auth.json;keyring 存进系统凭据库(拿不到就直接报错);auto 能用系统凭据库就用、否则退回文件;ephemeral 只放在内存里、进程结束就没了(适合一次性环境)。
企业 / 受管环境才需要的开关
个人用户可以跳过这一小节,遇到公司 IT 提要求时再回来查:强制只用某一种登录方式用 forced_login_method = "chatgpt" 或 "api"(不匹配就登出并退出);限定只能登录某个工作区用 forced_chatgpt_workspace_id;凭据存储方式可以被管理员强制锁死,用户改不动。
06最小例子:从空目录到一段能跑的代码
下面这个练习大约三分钟,能一次验证四件事:装上了、登上了、它能读写你的文件、它能跑命令并把结果告诉你。全程只碰一个你自己建的练习目录。
第一步:准备一个能随便折腾的目录
# 建一个练习目录并进去
mkdir ~/codex-practice && cd ~/codex-practice
# 先变成一个 git 仓库 —— 这是你的后悔药,别跳
git init
# 放一个很小的起始文件
echo "console.log('hello')" > app.js
# 启动交互会话
codex
第一次启动它会让你登录。登录完你就看到交互界面了:下方是输入框,状态栏会显示当前模型、审批档位等信息。
第二步:下一条"能验证结果"的指令
关键是让它自己证明结果,而不是你手动去跑:
# 在 codex> 提示符后输入(这是你说的话,不是 shell 命令)
给 app.js 加一个 add(a, b) 函数并调用它打印结果,然后运行 node app.js 验证一下
你会看到一串动作:读 app.js → 给出打算怎么改 → 让你确认 → 写入文件 → 运行 node app.js → 把输出贴给你。如果这台机器没有 node,它会告诉你并且换个方式验证——观察它怎么面对失败,本身就是很好的第一次体验。
第三步:体验"不进会话、一句话出结果"
# 一次性问答,执行完自动退出(适合脚本化)
codex exec "app.js 是干什么的?逐行解释一下"
到这一步,最小闭环就走通了:听懂指令 → 读代码 → 动手改 → 跑验证 → 汇报。
① 装成功了(不然没有 codex 命令);② 登录成功了(没登录会卡在认证);③ 它能读、能改你的文件,而且改之前会问你;④ 它能执行命令并把结果汇报给你。四条都通,它就能正式干活了。
如果它第一次就答非所问、越改越乱
这很正常,第一次跑偏不代表你装错了。用对指令把它扳回来,顺序别搞反:
- 立刻喊停,别等它改完再抱怨:"停。撤销刚才所有改动,回到我上一条指令之前的状态。"
- 重讲需求,这次带上"范围 + 不做清单":"我只重新说一遍:只改
src/app.js的 add 函数,不要动其它文件,不要装新依赖,改完先给我看 diff,等我确认再继续。" - 还是不行就退出重开,起一个更小的会话,只让它做其中一步。
它被你的指令引导,而不是你情绪的输出对象。模糊的需求 → 它自由发挥 → 你觉得离谱,这是这条链路的正常反应;把需求讲窄,它通常就回到正轨。
08安全边界:两个各自独立的开关
这一节是全文最该慢下来看的地方。新手最容易搞混的一点是:"它会问我"和"它碰得到"是两件不同的事,由两个不同的开关控制。
沙箱(sandbox):Codex 执行"模型生成的命令"时,技术上被允许做什么——比如能写哪些目录、能不能联网。
审批(approval policy):Codex 什么时候必须停下来问你——比如要越出沙箱、要联网、要跑一条不在可信清单里的命令。
先纠一个最常见的误解:沙箱不是"看不见你的代码"
不是。沙箱限制的是"它在你机器上能做什么",不是"你允许它读的内容会不会离开本机"。你让它读的文件、它跑出来的输出,都会送到云端模型。这两件事必须分开想:沙箱防的是"它在本地乱动",不防"数据出境"。敏感文件不要放它去读,这是唯一有效的做法。
"工作区"这个词指的是什么
工作区就是你启动 Codex 时所在的那个项目目录。默认档位下,这个目录里它可以自由读写,出了这个目录就要"敲门"。你可以用 -C 指定别的目录作为它的工作根,也可以额外放行几个目录:
# 指定工作根
codex -C ~/projects/myapp
# 除了工作区,再给某个目录写权限(推荐用这个,而不是直接开全权)
codex --add-dir ~/shared/lib
它管的命令比你想象的多
沙箱作用在它拉起的每一条子命令上——包括 git、包管理器、测试运行器,都继承同一套边界,不只是它内置的文件操作。这一点很多人没意识到:你让它跑 npm test,那条 npm 也一起被关进了同一个笼子里。
三档沙箱,一张表选完
沙箱档位(--sandbox) | 它技术上能干什么 | 什么时候用 | 别当什么用 |
|---|---|---|---|
read-only | 能读文件、能在只读沙箱里跑命令;不能改文件 | 想先搞懂项目、让它讲方案;跑不熟的开源仓库 | 别当成"它什么都不会做"——它仍然会读、会跑只读命令 |
workspace-write | 能在工作区内改文件、跑常规本地命令;默认不开网络 | 日常开发(这是默认档) | 别以为工作区外它就碰不到——它只是会先问你 |
danger-full-access | 去掉沙箱限制,文件和网络全放开 | 只在你确实需要全权、且环境隔离时 | 别在真实本机上随手用 |
为什么工作区里也有"只读区"
因为有些文件一旦被代理改掉,你的回退能力就没了。所以即使在 workspace-write 下,下面这些路径仍然被强制只读(递归生效,它们下面的一切都只读):
工作区里的 .git(无论它是目录还是一个指向别处的指针文件,解析出来的真实路径也保护)、.agents 目录、.codex 目录——这三处在 workspace-write 下也是只读的,递归生效。这就是为什么你有时会看到"git commit 仍然需要审批":它在保护你的撤销能力,不是在找麻烦。
那谁来保护"文件内容"
沙箱只保护"能写哪些文件",不保护"文件里的内容对不对"。能回退你的东西只有 git。所以规矩很简单:让它在哪个目录干活,就先在那个目录 git init + git commit 一次干净基线;改坏了 git checkout . 一句话还原。你会在这篇里看到这句话重复出现,因为它比任何一个安全设置都实在。
审批档位有哪几种
审批档位(--ask-for-approval) | 含义 | 什么时候用 | 注意 |
|---|---|---|---|
on-request | 默认边界内它自己干,越界或需要问你的时候停下来问 | 交互式使用(日常推荐) | 这是"低摩擦默认档",不是"什么都不问" |
never | 从不弹窗,从头跑到尾 | 非交互 / CI 等你已经控场的环境 | 它不问你,不代表它不会做危险的事 |
{ granular = { ... } } | 按类别细调:沙箱升级、规则、MCP 提问、权限请求、技能脚本,各自可单独设 | 想保留一部分提问、让另一部分直接失败关闭 | 这是"中间档"的正规做法,比一刀切 never 安全得多 |
untrusted | 已停止支持——留着这个值可能导致客户端起不来 | 不要再用。要同样的严格效果,改成项目信任设置(见下) | 这是旧版本写法,网上老教程里还有 |
on-failure | 已废弃,官方建议换成 on-request 或 never | 不要再用 | 同上,属于过期写法 |
如果你想要的是"这个项目里的命令都要我批准"的那种严格效果,官方给的迁移做法是:不写 approval_policy,而是在用户级配置里把这个项目标成不可信:
# ~/.codex/config.toml
[projects."/path/to/project"]
trust_level = "untrusted"
这样这个项目里的命令默认都要批准,并且项目级的配置文件、hooks、规则也不会被加载。如果同时显式写了 on-request,它会覆盖这个"项目推导出来的策略"。
两个开关的推荐组合
| 场景 | 命令 | 它的实际行为 |
|---|---|---|
| 日常开发(默认档,官方叫 Auto 预设) | 不加参数,或 codex --sandbox workspace-write --ask-for-approval on-request | 工作区内自由读改跑;要改工作区外、要联网时来问你 |
| 只读侦察 | codex --sandbox read-only --ask-for-approval on-request | 能读、能在只读沙箱里跑命令,越界会问 |
| 无人值守、只读(CI) | codex --sandbox read-only --ask-for-approval never | 只读沙箱内跑,全程不弹窗 |
| 自动审批(新的中间档) | --approve-for-me,或配置 approvals_reviewer = "auto_review" | 沙箱边界不变,但"要不要批"交给自动审查来判,你少被打断 |
| 全权 | --dangerously-bypass-approvals-and-sandbox(别名 --yolo) | 无沙箱、无审批。官方标注"不推荐" |
--yolo 是最后手段,不是"省事选项"
--dangerously-bypass-approvals-and-sandbox 会同时绕过审批和沙箱——官方对它的定位是"只应该用在外部已经隔离好的环境里"。在本机真实项目里随手用它,等于把家门钥匙交给一个会手滑的代理:它一旦跑出 rm、或者把密钥发到网络,没有任何兜底。顺带一个容易被忽略的连带后果:全权模式下网页搜索会默认切到"实时"档,它会真的去抓外网内容,而不只是查缓存。
联网默认是关的,要开怎么开
默认档位下 workspace-write 不开网络。需要联网(装依赖、抓接口文档)时显式打开:
# ~/.codex/config.toml
[sandbox_workspace_write]
network_access = true
只想给一次会话开:
codex -c 'sandbox_workspace_write.network_access=true'
再往后还有一层"网络白名单"([features.network_proxy]):只有当命令网络已经打开时它才起作用,可以按域名放行或拦截。这不属于新手必学,知道有这个东西就行。
网页搜索有四种档位
| 取值 | 行为 | 什么时候用 |
|---|---|---|
"cached"(默认) | 查 OpenAI 维护的网页索引缓存,不会真的去抓实时网页 | 平时用它就够,且能降低被网页内容里藏着的恶意指令带偏的风险 |
"indexed" | 只有当请求被搜索索引放行时,才允许访问外部网页 | 需要一点实时性、又想要闸门 |
"live" | 抓最新网页(等价于启动时加 --search) | 任务确实依赖最新发布、最新文档时 |
"disabled" | 关掉这个工具 | 完全不需要它联网查资料 |
顺带一句:全权模式(--yolo 等)下,网页搜索默认就是 live。
13配置:把默认值固定下来
配置文件放哪、谁覆盖谁
两个最常临时改的参数:换模型、发截图
模型和图片这两件事通常不用写进配置,临时在命令行上给就行。直接抄这两条:
codex --model gpt-5.6 "把这个函数的命名统一一下" # 只这一次用这个模型
codex --image "~/Desktop/报错截图.png" "这张报错是什么意思" # 把一张图片一起交给它看
想固定下来就别每次敲——写进下面那张表里的用户级配置,或者在会话里用 /model 换。可用模型列表以 /model 弹出的为准,官方文档里给的只是示例。
想不用每次敲参数,就写进配置文件。Codex 会从多个位置读配置,优先级从高到低是这样:
| 层级 | 路径 | 说明 |
|---|---|---|
| 命令行参数(最高) | codex -c key=value、启动时带的 flag | 只影响这一次运行 |
| 项目配置 | .codex/config.toml | 只在你信任该项目时才加载;从项目根往当前目录走,越近越优先 |
| Profile 文件 | ~/.codex/<名字>.config.toml | 用 --profile 名字 叠加的一整套预设 |
| 用户配置 | ~/.codex/config.toml | 平时主要改这里(受 CODEX_HOME 影响) |
| 云端下发的默认值 | 随登录工作区下发 | 公司统一配置 |
| 系统配置 | /etc/codex/config.toml(Unix) | 管理员统一配置 |
| 内置默认(最低) | — | 出厂设置 |
项目级配置有一个安全前提:只有你信任的项目,它的 .codex/ 才会被加载——不信任时,项目里的配置、hooks、规则一起被跳过。所以别在随便 clone 来的仓库里无脑点"信任"。
最常改的那几个键
# ~/.codex/config.toml —— 按需增删,别照抄全量
model = "gpt-5.6" # 默认模型;官方示例用 gpt-5.6,以你的可用列表为准
model_provider = "openai" # 用哪家供应商
approval_policy = "on-request" # 何时停下来问你
sandbox_mode = "workspace-write" # 文件/网络边界
web_search = "cached" # 联网搜索档位
model_reasoning_effort = "high" # 推理努力程度:minimal | low | medium | high | xhigh
# 想用系统钥匙串存凭据,而不是明文文件
cli_auth_credentials_store = "keyring"
# 想给工作区多放行一个可写目录(不需要就别加)
# [sandbox_workspace_write]
# writable_roots = ["~/tools"]
不同账号、不同套餐、不同时期可用的模型不一样。把 model 写死成某个名字,可能某天突然失效。保险做法:先在会话里用 /model 看当前可用项,再把选中的落进配置。
一张表查常见配置键
| 键 | 作用 | 常见取值 | 什么时候动它 |
|---|---|---|---|
model | 默认模型 | 如 "gpt-5.6" | 你有明确偏好或某任务要用特定模型 |
model_provider | 用哪家供应商 | "openai" 或你自定义的名字 | 要接本地模型时改 |
model_providers.<名> | 自定义供应商(OpenAI 兼容后端) | 见下一小节 | 换大脑时 |
approval_policy | 何时停下来问你 | "on-request" / "never" / { granular = {...} } | 被审批打断太频繁、或要跑无人值守 |
sandbox_mode | 命令的文件/网络访问边界 | "read-only" / "workspace-write" / "danger-full-access" | 要收紧或放开权限时 |
default_permissions | 指定命名权限方案 | ":read-only" / ":workspace" / ":danger-full-access" 或自定义名 | 想复用一套配置好的方案时 |
sandbox_workspace_write.network_access | 工作区内是否允许联网 | true / false(默认 false) | 任务要装依赖、访问接口 |
web_search | 联网搜索档位 | "cached" / "indexed" / "live" / "disabled" | 需要最新资料,或想彻底关掉 |
model_reasoning_effort | 默认推理努力程度 | "minimal" / "low" / "medium" / "high" / "xhigh" | 任务变难时提高;简单活提高只是多花钱 |
cli_auth_credentials_store | 登录凭据存哪 | "file" / "keyring" / "auto" / "ephemeral" | 不想留明文凭据 |
project_doc_max_bytes | 指令文件最多读多少字节 | 默认 32768(32 KiB) | 指令被截断时调大 |
project_doc_fallback_filenames | 除了 AGENTS.md 还认哪些文件名 | 如 ["TEAM_GUIDE.md"] | 团队已有别的约定文件名 |
personality | 它说话的默认风格 | "friendly" / "pragmatic" / "none" | 嫌它太啰嗦或太冷,会话里也能用 /personality 临时改 |
review_model | 跑 /review 时单独用的模型 | 不设则用当前会话模型 | 想用更强(或更便宜)的模型专门做审查 |
trust_level(写在 [projects."路径"] 下) | 把这个项目标成可信 / 不可信 | "untrusted" 表示更严格 | 不可信时项目级配置、hooks、规则全都不加载 |
log_dir | 日志写到哪(设了它才会生成明文 TUI 日志;TUI 就是你在终端里看到的那个交互界面) | 绝对路径 | 要排查它到底读了哪些指令文件 |
命名权限方案不是"额外的沙箱"
较新的文档把文件与网络边界进一步抽象成可命名、可复用的权限方案,内置三档::read-only、:workspace、:danger-full-access,用 default_permissions 指过去。自定义方案写在 [permissions.<名>] 里,还可以 extends 内置档再叠加规则。同一个方案内部有一条让人安心的优先级:禁止 > 写 > 读,同优先级时更具体的路径压过更宽的路径——也就是说,禁止永远压过允许。
官方明确提醒:default_permissions 不要和 sandbox_mode 或 [sandbox_workspace_write] 混用。一次会话选一套体系配置,两套都写只会让你自己搞不清哪条生效。
换模型供应商(含本地模型)
Codex 允许把"干活的大脑"换成别的 OpenAI 兼容后端,通过 [model_providers.<名>] 定义。想试本地模型,最省事的路径是:先在本地把 Ollama 跑起来并拉一个模型,再在配置里加一段并切过去。
# ~/.codex/config.toml
model_provider = "ollama" # 全局切到本地供应商
[model_providers.ollama]
name = "Ollama"
base_url = "http://localhost:11434/v1"
wire_api = "chat"
| 认证方式 | 配置 | 什么时候用 |
|---|---|---|
| 走 OpenAI 认证 | requires_openai_auth = true | 你通过一个代理服务器访问 OpenAI 模型 |
| 环境变量里的 Key | env_key = "某个环境变量名" | 供应商有自己的 API Key |
| 不需要认证 | 两个都不设 | 本地模型,通常不需要 Key |
好处:代码数据不出本机、可离线、没有 API 计费。代价:能力普遍弱于云端旗舰模型,复杂改码的翻车率更高。比较务实的用法是把它当"第二大脑"做只读分析、简单生成,重活仍交回默认供应商。
临时改一次,不动配置文件
-c 是所有配置里优先级最高的,用完即走:
# 单次用某个模型跑一趟(模型名以你的可用列表为准)
codex -c model="gpt-5.6"
# 单次收紧审批 + 只读
codex -c approval_policy=never --sandbox read-only "只分析,不要改"
# 单次换供应商
codex -c model_provider=ollama -c model=qwen2.5-coder
Profile:给不同项目配不同默认值
Profile 就是"一整套配置的命名预设"。注意这是新版写法:--profile 不再从 config.toml 里读 [profiles.名字],而是读一个独立文件。
# 建一个 ~/.codex/deep-review.config.toml,里面写顶层键(不要嵌套在 [profiles.X] 下)
codex --profile deep-review
codex exec --profile deep-review "审查这个改动"
如果你是从老版本升上来的,官方给的迁移做法是:把原来 [profiles.名字] 里的设置搬到 ~/.codex/<名字>.config.toml,然后删掉 config.toml 里的那一段和顶层的 profile = "名字"。
09AGENTS.md:给它一本项目说明书
AGENTS.md 是一个纯文本的指令文件,Codex 在动手干活之前会自动读它。你想让它"一进项目就知道怎么装依赖、怎么跑测试、哪些目录不许碰",靠的就是这个文件——而不是每次重新叮嘱一遍。
它会去找哪些文件、按什么顺序
- 全局层:在你的 Codex 主目录(默认
~/.codex,除非你设了CODEX_HOME)里找。有AGENTS.override.md就只读它,否则读AGENTS.md;这一层只取第一个非空文件。 - 项目层:从项目根(通常是 git 根)一路走到你当前所在目录,每个目录里按
AGENTS.override.md→AGENTS.md→ 备选文件名的顺序找,每个目录最多取一个。 - 合并顺序:从根往下拼接,用空行隔开;越靠近你当前目录的内容越靠后,也越优先。
两个边界要知道:空文件会被跳过;拼起来的总大小超过 project_doc_max_bytes(默认 32 KiB)就截断——所以别把它写成百科全书。
AGENTS.override.md
同一个目录里如果存在 AGENTS.override.md,同目录的 AGENTS.md 就被整个忽略。适合"临时加严":比如支付服务子目录要额外规定"绝不真发支付请求",写进 override 文件,与仓库级规则分开维护。
一份够用的 AGENTS.md 长什么样
# AGENTS.md —— 放在项目根目录
## 这个项目是干嘛的
这是一个用 Node.js 写的命令行小工具,主入口是 bin/cli.js,代码在 src/ 下。
## 常用命令(改完要靠这些验证)
- 跑测试:npm test
- 跑类型检查:npm run typecheck
- 本地启动:npm start
## 代码约定
- 变量和函数名用英文,注释用中文
- 新逻辑尽量放进 src/lib/ 下的小模块,别都堆在主入口
## 边界
- 绝对不要动 .env 或任何含密钥的文件
- 提交前先给我看 git diff,不要直接 commit
这就是它最实用的形态:把"怎么验证"和"别碰什么"写死。前者让它可以自证,后者替你挡掉最危险的操作。
它什么时候生效
Codex 在每次运行开始时(TUI 里通常就是每个会话开头)重新构建这份指令链,没有需要你手动清的缓存。所以:改完 AGENTS.md 之后,在目标目录里重启一次 Codex 就生效;别指望正在进行的会话立刻用上你刚写的内容。这一点是新手上当最多的地方——改了没反应,往往只是没重启。
多目录布局:一个真实的 monorepo 例子
my-repo/
├── AGENTS.md # 仓库通用:跑 lint、改动要写文档、提交前过目
├── apps/
│ └── web/AGENTS.md # 前端约定:用 pnpm、样式走 Tailwind
└── services/
└── payments/
├── AGENTS.md # 支付模块通用(同目录无 override 时生效)
└── AGENTS.override.md # 支付专项:跑 make test-payments;严禁碰密钥
从 services/payments/ 启动 Codex,它会拼出三层:全局文件 → 仓库根 AGENTS.md → 支付专项 override。这样团队能把规范写进代码树,每个新成员、每次 Codex 都自动遵守,而不是靠口头叮嘱。
我不想写,能自动生成吗
能。在会话里敲 /init,它会基于当前项目生成一份 AGENTS.md 草稿,你审一遍、改成符合你们约定的样子再提交。这是最快建立起点的方式。
个人也值得建一个全局文件
# ~/.codex/AGENTS.md —— 我个人的通用偏好
- 注释、commit message 用中文;变量/函数名用英文
- 每次改动前先说明计划,改动后给出 git diff 摘要
- 涉及删除文件、改配置、动密钥前必须征求我同意
不会出现"全局把项目规矩盖掉"的问题:同一目录下项目文件仍然优先,而全局文件只在没有更局部文件的层级上起替代作用。
10日常使用:怎么问才不跑偏
一次会话长什么样
先把心理预期建立起来。它不是一次性把整段"答案"甩给你,而是"提出 → 等你批 → 动手 → 汇报"的循环。示意(左边是你看到的,注释解释它在干什么):
$ codex # 在项目目录里启动
# 状态栏会显示当前模型、审批档位等(用 /status 可看全部)
codex> 给 src/add.js 的 add 函数补中文注释,并写 3 个测试用例,然后跑测试验证
# 它先读文件、思考,然后给出"打算怎么做"
# 接着贴出将要写入的 diff,类似:
# + /** 两数相加 */
# + export function add(a, b) { ... }
# 然后停下来问你:是否应用这些改动?
codex> 你同意就确认;不同意就直接打字纠正它
# 应用后它继续:跑测试、贴结果、总结改动与验证情况
codex> /quit # 退出(输入 / 会弹出命令面板)
你要做的就是在每个"等你批"的节点看一眼、点个头或说"改一下"。一路按 y 等于把沙箱和审批两层都浪费了。
说"先别改"是安全咒语
想让 Codex 只出方案不动手,就在指令末尾加一句"先别改任何文件"。习惯性地先让它给方案、你点头后再让它执行——这一句话能挡掉绝大多数"它理解偏了还一路改到底"的情况。
会话内的斜杠命令:一个表看懂
在输入框里以 / 开头就能调出命令。下面是新手最常用的几个(不同小版本会有差异,以你本地弹出的清单为准):
| 命令 | 作用 | 什么时候用 |
|---|---|---|
/permissions | 改"不问我就能做什么"(切换 Auto / Read Only 等预设) | 一个会话里想临时收敛或放开权限 |
/model | 换模型和推理努力程度 | 任务变难 / 变简单时 |
/plan | 切到计划模式,先出执行计划再动手 | 改动面大、你想先看方案 |
/diff | 看当前的 git diff(含还没被 git 跟踪的新文件) | 提交前自己扫一遍 |
/review | 让它审查你的工作区改动 | 它改完之后找问题 |
/status | 看当前会话配置与用量(模型、审批、可写目录、剩余上下文) | 不确定现在是什么档位时 |
/compact | 把可见对话压缩一下,释放上下文 | 长会话快撑不住时 |
/init | 生成 AGENTS.md 草稿 | 第一次给一个项目立规矩 |
/new / /clear | 开一段新对话(/clear 同时清屏) | 换任务时,别把上个任务的上下文带着 |
/resume / /fork | 恢复已保存的会话 / 从当前会话分叉出一支 | 接着上次干 / 想试另一条路又不想丢现在的 |
/quit 或 /exit | 退出 | 先把该提交的提交了再退 |
Codex 迭代很快:早先版本把权限拆成 /approval 和 /sandbox 分别管,后来统一收敛到 /permissions。如果你照着网上的老教程找不到某个斜杠命令,别慌——以你自己版本里 / 弹出来的清单为准,功能一般还在,只是换了入口。快捷键同理。
几个键盘上就能用的动作
| 按键 / 输入 | 做什么 | 什么时候用 |
|---|---|---|
@ | 搜索工作区里的文件,把路径加进这次提问 | 你想把它的注意力钉在某几个文件上 |
行首 ! | 在当前审批和沙箱规则下跑一条本地命令 | 你想自己查一下状态,又不想走出沙箱 |
Ctrl+O | 复制它最近一次完成的输出(等价 /copy) | 要把结果贴到别处 |
Esc | 打断它当前这一轮 | 发现它跑偏了,立刻停 |
Ctrl+C | 关掉会话 | 收工 |
指令的固定四件套
规律只有一句话:范围(哪里)+ 期望(做什么/不做什么)+ 验证(怎么算成功)+ 节奏(先方案还是直接改)。四件越明确,它越少自由发挥。
"修一下登录的 bug"
"优化性能"
"帮我写点东西"
结果:它只能靠猜,然后你会觉得它离谱。
"修复 src/login.js 中,当密码为空时抛 TypeError 的问题:先复现,再修,最后跑 npm test 里 login 相关用例确认通过。每一步给我看 diff。"
范围、期望、验证、节奏都在里面了。
五条能直接套用的提问模板
| 模板 | 什么时候用 | 它替你挡住什么 |
|---|---|---|
| 先别改文件:解释【某文件/某函数】是做什么的,哪里最容易出 bug? | 想先理解再动手 | 在你还没看懂代码时被它改掉 |
| 只改【路径】,让它【期望行为】,改完跑【验证命令】确认通过,每一步给我看 diff | 明确的一次小改动 | 顺手改了别的文件 |
| 跑【验证命令】把失败信息贴出来,定位根因后给出两种修法及各自风险,先别改 | 出错先诊断 | 它一上来就改,把线索改没了 |
| 按照 AGENTS.md 里的约定,把【目录】下的代码统一成【风格】,做完用【验证】检查 | 批量统一 / 重构 | 风格改一半、验证又没跑 |
| 给【任务】写一份可执行的 TODO 清单(细到文件级),我批准一项你执行一项 | 大任务拆小步、步步审 | 一次性大改之后你无从审起 |
怎么把它的"验证"变成真的
它说"改好了"和它证明"改好了"是两件事。差距就来自你有没有在指令里给出可执行的验证手段:把验证命令写进需求("改完跑 npm test 确认通过"远比"改一下"强)、要求它贴原始输出(不要接受"测试通过了"这句话)、给出可判定的成功标准("这个函数对空数组返回 0"比"让它更健壮"强一百倍)。
① 宁可让它说,别让它一次全干:每步小改 + 汇报,你看得懂再放行下一步。② 重要文件先备份:拿不准它会动什么时,先把那个文件复制成 xxx.bak,或者先 commit。③ 看不懂输出就原样贴回去问它:加一句"解释这个报错,并给出两种修法及各自风险",但不要让它直接改。
11codex exec:无人值守的那一半
交互会话适合"一边聊一边干"。可重复、要接进脚本或 CI 的任务,用非交互模式 codex exec(简写 codex e):一次执行、做完就退出,不需要人在旁边按按钮。它还有一个重要的默认差异——codex exec 默认在只读沙箱里跑,要它改文件必须显式加权限。
基本用法
# 一次性任务(先 cd 到项目目录再执行)
codex exec "检查仓库里未提交的改动,用中文总结风险点"
# 输出结构化 JSON,方便脚本解析
codex exec --json "把 todos.md 整理成清单"
# 要它改文件,显式给工作区写权限
codex exec --sandbox workspace-write "把仓库里的 console.log 调试语句删掉"
# 不要留下会话文件
codex exec --ephemeral "给这个仓库分级并给出下一步建议"
运行时进度走标准错误输出,只有最后那条消息走标准输出,所以你可以直接接管道:
codex exec "给最近 10 个提交写一段发布说明" | tee release-notes.md
它自己的子命令:resume 与 review
# 接着上一次非交互任务继续(两段式流水线常用)
codex exec "审查这个改动有没有竞态问题"
codex exec resume --last "把你找到的竞态问题修掉"
# 也可以按会话 ID 恢复
codex exec resume <会话ID>
# 专门做代码审查(不改你的工作区)
codex review --uncommitted
codex review --base main
codex review --commit <提交号>
让它产出机器能读的结果
两个 flag 是给下游自动化用的,值得记住:
| flag | 作用 | 什么时候用 |
|---|---|---|
--json | 把每个状态变化作为一行 JSON 输出(JSONL 事件流) | 脚本要解析过程而不只是最终结论 |
--output-schema <文件> | 用一个 JSON Schema 文件约束它最后回答的结构 | 下游程序需要稳定字段(风险报告、发布元数据) |
-o / --output-last-message <文件> | 把最后那条消息写进文件(同时仍打印到标准输出) | CI 里想同时拿到人和机器能读的版本 |
--sandbox <档> | 指定沙箱档位 | 自动化里常用只读或工作区写 |
--skip-git-repo-check | 允许在非 git 目录里运行 | 只在临时环境确实安全时用 |
--ignore-user-config | 不加载你的 ~/.codex/config.toml | CI 想要一套与个人偏好无关的干净环境 |
--full-auto | 已废弃的兼容 flag,会打印告警 | 新脚本请改用显式的 --sandbox workspace-write |
用一个 schema 的完整例子:codex exec "提取项目元数据" --output-schema ./schema.json -o ./project-metadata.json——它按 schema.json 描述的结构回答,并把最终 JSON 写进 project-metadata.json。
密钥怎么给才安全
把 Key 设成任务级 / 全局环境变量,然后在这个环境里跑仓库里的代码。
构建脚本、测试、依赖的安装钩子、任何一个被污染的动作,都能读到这个环境变量。
只在需要它的那一次调用前面临时给:
CODEX_API_KEY=<你的key> codex exec --json "对最近的改动做审查"
用完即消失。
官方在非交互模式文档里的原话就是:不要在会检出或运行仓库代码的工作流里,把 OPENAI_API_KEY 或 CODEX_API_KEY 设成 job 级环境变量。GitHub Actions 里的推荐做法是直接用官方的 Codex GitHub Action(github.com/openai/codex-action),它会在内部起一个代理来转发 Key,避免把 Key 交给你的 shell 步骤。
把 exec 串进日常脚本
下面这段脚本演示了"新手可以照抄"的姿势:任务只读、Key 只在这一次调用里出现、结果落盘、缺 Key 就直接失败而不是默默跑一半:
#!/usr/bin/env bash
# review_diff.sh —— 让 Codex 审一遍当前未提交改动,结果存盘
set -euo pipefail
if [ -z "${CODEX_API_KEY:-}" ]; then
echo "请在调用前临时提供 CODEX_API_KEY" >&2
exit 1
fi
CODEX_API_KEY="$CODEX_API_KEY" codex exec \
--sandbox read-only --json \
"审查当前未提交改动:列问题清单(含文件行号),先不要改任何文件" \
> review-$(date +%F).json
echo "审查结果已写入 review-$(date +%F).json"
什么时候别用 exec
需要多轮澄清、需要你边走边看结果、涉及多次危险操作的任务,别硬塞进 codex exec——它不等人,翻车率随复杂度上升。这类任务用交互会话 + 人工审批更稳。exec 擅长的是"一次性、可重复、结果能自动校验"的活。
Git 仓库这个前提
Codex 要求命令在 git 仓库里运行,这是为了防止破坏性改动。临时环境确实安全,才用 --skip-git-repo-check 放行。
12十个最常见的坑
| 坑 | 你会看到什么 | 为什么 / 怎么绕 |
|---|---|---|
| 不在 git 仓库里就开跑 | 改坏了想回退,却没有基线 | 至少 git init + 先 commit 一次;回退用 git checkout .(08) |
在本机真实项目里随手 --yolo | 命令一路执行、没人问你 | 那个 flag 只适合外部已隔离的环境。全权需求请放进一次性容器/虚拟机(08) |
| 指令太模糊 | 它自由发挥,你觉得离谱 | 补齐四件套:范围 + 期望 + 验证 + 节奏(10) |
| 把唯一那份密钥交给它 | 凭据可能被写进日志、被提交、被发到网上 | ~/.codex/auth.json 是明文;别提交、别贴工单、别在共享机器上用(05) |
| 照抄过期命令 | 某个斜杠命令/flag 找不到 | 认准 codex --help 和会话里 / 弹出的清单。老版本的 /approval、untrusted、--full-auto 都已经变了(08) |
改了 AGENTS.md 就说没生效 | 它还是不按你的规矩来 | 指令链是会话开始时读的,在目标目录重启一次(09) |
| 把长会话当聊天用 | 越聊越慢、越聊越贵 | 上下文越长越烧额度。长任务拆小、做完就收尾;要接着干用 codex resume 找回(10) |
| 在工作区里批量删文件,只靠沙箱兜底 | 沙箱保护不了"文件内容被删" | 沙箱管的是"能写哪里",不是"写的内容对不对"。批量任务前务必 commit,改完抽查 diff(08) |
| 以为工作区外它也碰不到 | 它停下来问你要不要放开 | 那是审批在按设计工作。要定向放权用 --add-dir,别一步跳到全权(08) |
| 在陌生/公开仓库里盲目放权 | 仓库里别人写的脚本被它执行 | 先读它打算跑什么命令,优先只读或工作区档位;项目级配置在未信任时不会自动加载(13) |
每种情况下"该多说哪一句"
| 你的担心 | 在指令里补这一句 | 它能换来什么 |
|---|---|---|
| 怕它改太多文件 | "只改 src/login.js,其它文件不要动" | 范围被钉死,越界你能一眼看出来 |
| 怕它自作主张装依赖 | "不要新增任何第三方依赖" | 避免包体积和供应链风险无声变大 |
| 怕它说"改好了"但没验证 | "改完跑 npm test,把原始输出贴给我" | 你拿到的是证据,不是承诺 |
| 怕它一次改太多、你审不过来 | "先给我方案,我说可以你再动手" | 审阅成本从"读一大段 diff"变成"读一段计划" |
| 怕它碰密钥和配置 | "不要修改 .env、.codex/ 或任何配置文件" | 把最危险的操作显式排除 |
| 怕它把调试代码留在里面 | "改完检查有没有遗留的调试输出,有就一并清掉" | 补上它自己不会主动做的收尾 |
14排错:出问题先查这张表
| 现象 | 原因 | 怎么办 |
|---|---|---|
command not found: codex | 装完了但没进 PATH | npm 装的用 npm prefix -g 查到前缀,把里面的 bin 加进 shell 配置后重开终端 |
| npm 安装报权限错误 | 全局目录没写权限 | 不要用 sudo;改用用户级前缀,或直接用官方安装脚本 / Homebrew |
| 下载慢或卡住 | 默认源不通 | 设 CODEX_INSTALLER_USE_RELEASES_OPENAI_COM=false 退回 GitHub Releases,或换个网络环境重试 |
| 首次运行要登录,但浏览器打不开 | 无图形界面 / 回调被挡 | 用 codex login --device-auth 设备码登录;或按官方文档把 auth.json 安全地复制过去 |
| 提示"需要在 git 仓库里" | 当前目录不是 git 仓库 | 先 git init;临时环境确实安全时 codex exec 可加 --skip-git-repo-check |
启动时告警说找不到 bwrap | Linux 上缺 bubblewrap | sudo apt install bubblewrap 或 sudo dnf install bubblewrap;Ubuntu 24.04 可能还需要加载一个 AppArmor 配置 |
改了 AGENTS.md 没反应 | 指令链是会话开始时构建的 | 在目标目录重启 Codex;用 codex -c log_dir=./.codex-log 可以看它到底读了哪些文件 |
| 报错说配置里有它不认识的字段 | 版本升级后老键被移除 | 加 --strict-config 可以提前把这类问题暴露出来;按官方配置参考逐个清理 |
客户端起不来,配置里有 untrusted | 这个审批档位已被停止支持 | 删掉 approval_policy = "untrusted";要严格效果改用项目信任设置(08) |
| 它明明能看到文件却改不了 | 档位是只读,或改的是被保护的 .git / .codex / .agents | 用 /status 确认当前档位;被保护路径本来就不允许写(08) |
15一页纸速查:装完到用顺
装 / 验证 / 更新
curl -fsSL https://chatgpt.com/codex/install.sh | sh # macOS/Linux 官方脚本
brew install --cask codex # Homebrew
npm install -g @openai/codex # npm
codex --version # 验证(本文校对时是 0.154.0)
codex --help # 本版命令总览(权威以这个为准)
codex update # 自更新(安装方式支持时)
codex doctor # 出问题时生成一份诊断报告
登录
codex login # ChatGPT 账号(浏览器)
codex login --device-auth # 无浏览器:设备码
printenv OPENAI_API_KEY | codex login --with-api-key # API Key(走管道,别进历史)
codex login status / codex logout # 状态 / 退出
日常使用
codex # 交互会话
codex --sandbox read-only # 只读侦察
codex --add-dir ~/shared/lib # 额外放行一个可写目录
codex -C ~/projects/app # 指定工作根
codex resume # 找回本仓库的旧对话
codex exec "一句话任务" # 非交互(一次性)
codex exec --json "任务" # 非交互 + JSON 事件流
codex exec resume --last # 继续上次 exec
codex review --uncommitted # 审查未提交的改动
安全相关
--sandbox workspace-write --ask-for-approval on-request # 日常推荐组合
--sandbox read-only --ask-for-approval on-request # 只读侦察
--sandbox read-only --ask-for-approval never # CI:只读且不问
--dangerously-bypass-approvals-and-sandbox / --yolo # 仅限隔离环境
/permissions # 会话里改允许范围
/model /plan /diff /review /status # 换模型/计划/看改动/审改动/看状态
其他常用子命令(都在你本机 codex --help 里能看到)
| 子命令 | 做什么 | 什么时候用 |
|---|---|---|
codex review | 非交互地做一次代码审查,不改你的工作区 | 提交前 / 开 PR 前想要第二双眼睛 |
codex resume | 按 ID 或"最近一次"恢复交互会话 | 上下文断了、想接着上次干 |
codex fork | 把一段旧会话分叉成新会话 | 想试另一条路又不想丢现在这条 |
codex apply | 把它产出的 diff 以 git apply 打到你本地工作区 | 在别处生成改动、想在本机应用 |
codex mcp | 管理 MCP 服务器(接外部工具) | 想让代理连数据库、浏览器等外部能力 |
codex completion | 生成 shell 补全脚本 | 想少敲几个字 |
codex app | 打开桌面应用形态 | 想要图形界面 |
codex cloud | 浏览云端任务并把结果应用到本地 | 本机没环境、把活交给云端跑 |
codex update / codex doctor | 自更新 / 生成一份诊断报告 | 升级、或出问题时交给支持 |
codex sandbox | 用同一套沙箱策略跑一条命令 | 你想让某条命令也享受同样的边界 |
文件都落在哪
~/.codex/config.toml # 用户级配置(最常改)
.codex/config.toml # 项目级配置(仅信任的项目生效)
~/.codex/<名字>.config.toml # Profile 文件(--profile 名字)
~/.codex/AGENTS.md # 全局指令
项目根/AGENTS.md # 项目指令
某目录/AGENTS.override.md # 同目录 AGENTS.md 被它整个忽略
~/.codex/auth.json # 登录凭据(明文,当密码保管)
每次放它动手前,过一遍这五条
- □ 有没有 git 干净基线?改坏了能不能一句话回退?
- □ 我是不是说清了范围(哪个文件/哪个函数)和成功标准(怎么验证)?
- □ 当前沙箱/审批档位符合这次任务的风险吗?敏感目录有没有收敛权限?
- □ 这次任务会不会碰到密钥、生产数据、或工作区外的写操作?
- □ 我打算在每个"等你批"的节点看 diff,而不是一路同意?
打勾的时间成本大约十秒,返工的成本可能是一下午。
一周上手路线(给完全零基础的人)
第 1 天:只装不干
装好、登录;只跑 codex --version 和 codex --help,打开一次交互界面看看长相,什么都不改就退出。
第 2 天:只读玩陌生项目
找一个不怕坏的练习目录,用 --sandbox read-only 让它"讲一遍这个项目",练"问得具体"。
第 3 天:改第一个文件
在练习目录里 git init 并 commit,然后做"加注释 / 补个小函数"的小改,全程盯着它的 diff 和审批请求。
第 4 天:体验验证闭环
找一个自带测试的练习,让它"修一个失败的测试"并跑测试自证。学会分辨它是真的全绿,还是只是嘴上说绿。
第 5 天:写 AGENTS.md
用 /init 生成草稿,补上你的验证命令与禁区,观察之后它的行为是否更贴合你的约定。
第 6–7 天:上真实的小项目
挑一个你自己维护的小脚本或小网站,按"先只读 → 小步改 → 每步审 diff"的流程接活;报错就原样贴回去让它调整。
16术语对照表(回头查用)
| 术语 | 一句话定义 | 为什么重要 / 何时用 · 别当什么用 |
|---|---|---|
| 代理(agent) | 你说目标、它自己规划并分步执行的程序,而不是每步都等你发话 | 这是它和"聊天框"的根本差别。别把它当成只会回话的问答机器人——它会动你的文件 |
| TUI(终端用户界面) | 在终端里用键盘操作的交互界面,敲 codex 就进这个界面 | 本文大多数斜杠命令都发生在这里。别把它和 shell 提示符搞混——在 TUI 里输的是给代理的话,不是系统命令 |
| 沙箱(sandbox) | 操作系统层面给它的活动范围:能写哪些目录、能不能联网 | 它决定"它在本地能碰到什么"。别当成数据保护——它管不了"内容被发到云端" |
| 审批(approval) | 它什么时候必须停下来问你 | 和沙箱是两个独立开关,要分开想。别以为"它没问"就等于"它没做" |
| 工作区(workspace) | 你启动 Codex 时所在的那个项目目录,默认可以被读写 | 选对工作根很关键:"出了工作区才要敲门"这句话的基准线就是它 |
| 可写根目录(writable roots) | 在工作区之外额外允许写入的目录清单 | 需要定向放权时用它,而不是直接开全权;比全权安全一个数量级 |
| 只读沙箱(read-only) | 能读、能在只读范围内跑命令,但不能改文件 | 接手陌生仓库、只想听讲解时的默认选择。别以为在这个档位它就什么都不能做 |
| 全权模式(danger-full-access) | 去掉沙箱限制,文件与网络全放开 | 官方标注"不推荐"。真要全权,去一次性容器或虚拟机 |
| 推理努力程度(reasoning effort) | 模型"想多久"的档位:minimal / low / medium / high / xhigh | 任务越难越值得开高;简单活开高档只是多花钱多等 |
| 上下文(context) | 这一次会话里它能"记得"的内容总量,有上限 | 上下文越长越烧额度、越慢。为什么长任务要拆、要 /compact,根源就在这里 |
| 指令链(instruction chain) | 它每次开工前,把全局与沿途各层的 AGENTS.md 拼成的一份说明 | 这是"项目规矩为什么能被自动遵守"的机制。每次运行重建,所以改完要重启会话才生效 |
AGENTS.override.md | 放在某目录里,用来覆盖同目录 AGENTS.md(不是叠加,是整个替换) | 适合"子目录要额外加严"。别以为它是合并——同目录那份会被完全忽略 |
| Profile(命名预设) | 一整套配置的命名集合,用 --profile 名字 叠加 | 给"这个项目偏保守、那个项目要快"做成可切换的档位。新版把它放在独立文件里,不再从 config.toml 读 |
| 权限方案(permission profile) | 把文件与网络边界命名并复用,内置 :read-only / :workspace / :danger-full-access | 想让一整套规则可复用时可上它。别和 sandbox_mode 混着写——一次会话只选一套体系 |
| provider(模型供应方) | 真正提供"大脑"的服务,默认是 OpenAI,也可以换成兼容后端 | 想用本地模型、或走代理服务器访问 OpenAI 时改它。换之前先想清楚本地模型的能力代价 |
| MCP | Model Context Protocol:让代理连接外部工具(数据库、浏览器等)的协议 | 接上它等于给代理发新工具。只加你信得过的来源,别为了好玩随便接陌生人的服务 |
| JSONL / JSON 事件流 | 一行一个 JSON 对象的输出格式,方便程序逐条读 | codex exec --json 就是它。脚本要解析过程时用它;人看最终结论别用它 |
| JSON Schema | 描述"一个 JSON 应该长什么样"的规范文件 | 用 --output-schema 约束它的最终回答结构,下游程序才有稳定字段可读 |
| 凭据(credential / API Key) | 能证明"你是你"的一串字符,例如 API Key、访问令牌 | ~/.codex/auth.json 里放的就是它,而且是明文。当密码保管:不提交、不粘贴、不在共享环境用 |
| PATH | 系统查找可执行程序时依次搜索的目录清单 | command not found 十有八九是它没配对。装完第一步先验证,别等出问题才查 |
| WSL2 | Windows 上的 Linux 子系统,让你在 Windows 里跑 Linux 环境 | Windows 用户的推荐路径:在 WSL2 里按 Linux 方式装,沙箱走 Linux 那套 |
bubblewrap(bwrap) | Linux 上让程序在受限环境里运行的小工具 | 它是 Linux 沙箱的实现基础;缺了会启动告警,所以它是 Linux 上的前置条件 |
| Seatbelt | macOS 自带的沙箱机制 | macOS 开箱即用的原因就是它。你不需要配它,但知道它存在就不会对"Mac 上不用装沙箱工具"感到奇怪 |
| diff(改动差异) | 逐行标出"加了什么、删了什么"的对照文本 | 这是你审阅它的主要材料。不看 diff 就等于放弃了这层保护 |
| 基线(baseline) | 动手前的一次干净提交,出问题能整块退回 | 它是你唯一可靠的撤销手段。开工前 commit 一次,成本十秒 |
99一句话总结
Codex CLI 是 OpenAI 官方开源的终端 AI 编程代理——你用自然语言下指令,它读代码、改文件、跑命令,默认被"沙箱(能碰到哪)+ 审批(什么时候问你)"两道边界夹着干活。用得好的关键只有四条:在 git 仓库里开工、把验证命令写进指令、批准前先看 diff、把约定沉淀进 AGENTS.md 与 config.toml;以及记住那条底线——--yolo 只属于隔离环境。
98参考来源与证据边界
一手来源(全部逐字读取)
- github.com/openai/codex — 官方仓库 README(定位、安装方式、系统支持、Apache-2.0 协议)
- learn.chatgpt.com/docs/codex/cli — Codex CLI 总览(安装、更新、第一步、能力清单)
- learn.chatgpt.com/docs/developer-commands — 命令与 flag 参考、内置斜杠命令表、快捷键
- learn.chatgpt.com/docs/agent-approvals-security — 沙箱与审批(三档定义、推荐组合、受保护路径、网络访问、
untrusted迁移说明) - learn.chatgpt.com/docs/sandboxing — 沙箱总览(Seatbelt / bubblewrap / WSL2 的平台差异)
- learn.chatgpt.com/docs/auth — 登录方式、凭据存储(
cli_auth_credentials_store四个取值)、设备码、内网 CA、受管环境强制项 - learn.chatgpt.com/docs/agent-configuration/agents-md — AGENTS.md 的发现顺序、override、体积上限、备选文件名
- learn.chatgpt.com/docs/config-file/config-basic — 配置分层与优先级、常见键、功能开关表
- learn.chatgpt.com/docs/config-file/config-reference — 完整配置键参考(
approval_policy/sandbox_mode/default_permissions/web_search) - learn.chatgpt.com/docs/config-file/config-advanced — Profile 文件写法变更、自定义 provider、审批与沙箱的高级组合
- learn.chatgpt.com/docs/non-interactive-mode —
codex exec(默认只读、JSONL 事件、schema 输出、CI 密钥纪律、GitHub Action 建议) - github.com/openai/codex/releases/latest — 版本锚点:本文校对时最新为
0.154.0(发布于 2026-09-09)
本文自己做的核对
除了读官方文档,本文还在本机实际跑了三条命令核实命令名与 flag:codex --version(→ codex-cli 0.154.0)、codex --help(核对子命令与全局 flag,如 --sandbox / --ask-for-approval / --add-dir / --worktree)、codex exec --help(核对 exec 专属 flag,如 --json / --output-schema / --ephemeral / --skip-git-repo-check)。
以上事实于 2026-09-13 对照 OpenAI 官方文档与仓库核对。Codex CLI 属于演进很快的工具:版本号、默认模型名、斜杠命令、flag 名称都可能变化。本文已在相关处标注"以你本机 codex --help 与 / 面板为准"。与旧版相比,本文改掉了三类已过期的说法:① 审批档位里的 untrusted 已停止支持(改用项目信任设置表达同样的严格效果);② on-failure 已废弃;③ 全局旧写法的 Profile([profiles.名字])与 codex exec --full-auto 都已不再推荐,本文按新写法给出。若文内命令与你的版本不一致,以官方文档与 codex --help 输出为最终依据。