沙箱模式详解 —— `--full-auto`、`--yolo`、安全边界与文件权限
简介
在前文中,我们已经学习了
exec命令的基本用法,也短暂提到了三种沙箱模式:ask、full-auto和yolo。但这三种模式到底有什么区别?它们各自的安全边界在哪里?在什么场景下应该使用哪种模式?
本文将深入剖析 Codex CLI 的沙箱安全体系。这不仅仅是一份功能文档,更是一份安全指南——了解 AI 被允许做什么、被禁止做什么,以及你如何在不同场景下调整安全策略。
一、沙箱模式全景图
Codex CLI 提供三种沙箱模式,代表了三种不同的安全-效率权衡:
┌──────────────────────────────────────────────────────────────┐
│ 沙箱模式安全光谱 │
│ │
│ ←────────── 更安全 更高效 ──────────→ │
│ │
│ ┌──────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ ask │ → │ full-auto │ → │ yolo │ │
│ │ (默认) │ │ (全自动) │ │ (极限模式) │ │
│ └──────────┘ └──────────────┘ └──────────────────┘ │
│ │
│ 每步确认 沙箱内全自动 放宽更多限制 │
│ 最安全 平衡安全与效率 最高效率 │
│ 适合新手 适合日常开发 适合受信任任务 │
│ │
└──────────────────────────────────────────────────────────────┘| 模式 | 权限级别 | 交互程度 | 适用场景 |
|---|---|---|---|
ask |
受限 | 每步需要确认 | 首次使用、敏感操作、学习环境 |
full-auto |
沙箱内完全自动 | 无需确认 | 日常开发、批量任务 |
yolo |
放宽限制 | 无需确认 | 受信任任务、快速原型 |
二、`ask` 模式:默认的安全之选
2.1 工作原理
ask 模式是 Codex CLI 的默认沙箱模式。在这种模式下,AI 在执行以下关键操作之前,会暂停并征求你的同意:
- 创建或修改文件
- 执行 shell 命令
- 安装软件包
- 删除文件
- 网络请求
codex --sandbox ask "创建一个服务器并安装 express"执行输出示例:
🤖 Codex is working...
⚡ Action: Create file 'server.js'
Content preview:
┌─────────────────────────────────┐
│ const express = require('express');│
│ const app = express(); │
│ const PORT = process.env.PORT... │
│ │
│ app.get('/', (req, res) => { │
│ res.send('Hello World!'); │
│ }); │
│ │
│ app.listen(PORT, () => { │
│ console.log(`Server running...`│
│ }); │
└─────────────────────────────────┘
Approve? [Y/n/d(details)/e(edit)]:2.2 交互选项详解
当 AI 请求批准时,你可以输入:
| 输入 | 含义 | 说明 |
|---|---|---|
Y / 回车 |
批准 | 允许 AI 执行该操作 |
n |
拒绝 | 跳过该操作,AI 会尝试其他方案 |
d |
查看详情 | 显示完整的操作细节 |
e |
编辑 | 手动修改操作内容后再批准 |
Yall |
全部批准 | 批准当前操作及后续同类操作 |
Approve? [Y/n/d/e]: d
📋 详细信息:
操作类型: 创建文件
文件路径: /sandbox/server.js
文件大小: 245 bytes
文件权限: 644
影响范围: 新建文件
Approve? [Y/n/d/e]: e
✏️ 编辑模式:
请修改文件内容后保存...
(会打开临时编辑器)2.3 `ask` 模式的最佳使用场景
# ✅ 适合 ask 模式的场景
# 1. 首次使用 Codex CLI 时
codex "帮我创建一个项目"
# 2. 执行可能破坏性的操作时
codex "删除所有 node_modules 目录"
# 3. 处理生产环境代码时
codex "修改数据库连接配置"
# 4. 学习 AI 的工作方式时
codex "解释这段代码并优化它"2.4 批量批准技巧
如果你信任 AI 的方向,但又不想切换到全自动模式,可以使用批量批准:
# 使用 Yall 批准所有同类操作
codex "创建一个包含 20 个组件的 React 项目"
# 当第一个组件被创建时,输入 Yall
Approve? [Y/n/d/e]: Yall
# 后续所有文件创建操作将自动批准,但仍会在不同类型操作时询问三、`--full-auto` 模式:沙箱内的全自动驾驶
3.1 什么是 `full-auto`?
full-auto 模式是 Codex CLI 的全自动沙箱模式。在这种模式下:
- ✅ AI 在沙箱内执行任何操作都 不需要 你的确认
- ✅ AI 可以自主创建、修改、删除文件
- ✅ AI 可以运行任何 shell 命令
- ✅ AI 可以在沙箱内安装软件包
- ❌ AI 仍然不能 突破沙箱的安全边界(访问沙箱外的文件系统、执行特权操作等)
codex --sandbox full-auto "创建一个完整的 Express REST API,包含用户认证、CRUD 操作和单元测试"3.2 `full-auto` vs `ask` 行为对比
# ask 模式 —— 交互式
codex --sandbox ask "安装 lodash 并创建一个使用它的工具函数"
# 输出: ⚡ Action: Run command 'npm install lodash'
# 输出: Approve? [Y/n]: Y ← 需要你确认
# 输出: ⚡ Action: Create file 'utils.js'
# 输出: Approve? [Y/n]: Y ← 需要你确认
# full-auto 模式 —— 全自动
codex --sandbox full-auto "安装 lodash 并创建一个使用它的工具函数"
# 输出: 📝 Step 1/3: 安装依赖
# 输出: ✓ npm install lodash completed
# 输出: 📝 Step 2/3: 创建工具函数
# 输出: ✓ utils.js created
# 输出: 📝 Step 3/3: 验证
# 输出: ✓ 所有测试通过3.3 `full-auto` 的安全边界
很多人担心:全自动模式会不会让 AI 为所欲为?答案是否定的。即使在全自动模式下,AI 的行为仍然受到沙箱的严格限制:
┌───────────────────────────────────────────────────────┐
│ 安全边界示意图 │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 沙箱内部 (full-auto 允许) │ │
│ │ │ │
│ │ ✅ 读写工作目录文件 │ │
│ │ ✅ 运行代码和命令 │ │
│ │ ✅ 安装软件包 │ │
│ │ ✅ Git 操作 │ │
│ │ ✅ 网络请求(有限制) │ │
│ │ │ │
│ └──────────────┬──────────────────────────────────┘ │
│ │ 🛑 安全边界 │
│ │ │
│ ┌──────────────▼──────────────────────────────────┐ │
│ │ 沙箱外部 (始终禁止) │ │
│ │ │ │
│ │ ❌ 访问 ~/.ssh/ 等敏感目录 │ │
│ │ ❌ 修改系统配置 │ │
│ │ ❌ 执行 sudo / 特权操作 │ │
│ │ ❌ 访问工作目录外的文件 │ │
│ │ ❌ 持久化改变宿主机状态 │ │
│ │ │ │
│ └─────────────────────────────────────────────────┘ │
│ │
└───────────────────────────────────────────────────────┘3.4 `full-auto` 的适用场景
# ✅ 适合 full-auto 的场景
# 1. 日常开发任务
codex --sandbox full-auto "添加一个用户登录页面"
# 2. 批量代码重构
codex --sandbox full-auto "将所有回调函数转换为 Promise"
# 3. 代码生成
codex --sandbox full-auto "生成 50 个测试用例"
# 4. 数据处理
codex --sandbox full-auto "解析这个 JSON 文件并生成报告"
# 5. 在 CI/CD 中
codex --sandbox full-auto "运行测试并修复失败的用例"四、`--yolo` 模式:极限自由模式
4.1 什么是 `yolo`?
yolo 模式(You Only Live Once)是 Codex CLI 最激进的沙箱模式。名字本身就说明了它的态度——放手让 AI 去做,不要管它。
相比 full-auto,yolo 模式进一步放宽了限制:
┌─────────────────────────────────────────────────────────┐
│ full-auto vs yolo 对比 │
├──────────────────────┬──────────────────────────────────┤
│ full-auto │ yolo │
├──────────────────────┼──────────────────────────────────┤
│ 沙箱内完全自动 │ 放宽更多沙箱限制 │
│ 不允许访问外部网络 │ 可能允许更多网络访问 │
│ 严格限制命令执行 │ 更宽松的命令执行权限 │
│ 适合日常开发 │ 适合完全受信任的任务 │
│ 保留安全底线 │ 在受控环境下追求最大效率 │
└──────────────────────┴──────────────────────────────────┘codex --sandbox yolo "创建一个完整的 Web 应用,包含前端、后端、数据库,并部署到本地服务器"4.2 `yolo` 模式的额外权限
yolo 模式相比 full-auto,可能允许以下额外操作(具体取决于版本实现):
| 操作 | full-auto |
yolo |
|---|---|---|
| 沙箱内文件操作 | ✅ | ✅ |
| 沙箱内命令执行 | ✅ | ✅ |
| 网络访问 | 有限 | 更宽松 |
| 访问工作目录外文件 | ❌ | 可能允许(取决于配置) |
| 安装系统级包 | ❌ | 可能允许 |
| 执行长时运行命令 | 受限 | 允许 |
4.3 何时使用 `yolo`?
# ✅ 适合 yolo 的场景
# 1. 快速原型验证
codex --sandbox yolo "用最快速度搭建一个博客系统"
# 2. 完全隔离的测试环境
codex --sandbox yolo "在一个空目录中创建一个完整的全栈应用"
# 3. 竞赛或黑客松
codex --sandbox yolo "在 30 分钟内创建一个功能完整的 CRUD 应用"
# 4. 你已经完全信任 AI 的方向
codex --sandbox yolo "继续重构剩下的所有文件"4.4 ⚠️ `yolo` 模式的风险警告
┌─────────────────────────────────────────────────┐
│ ⚠️ 警告 │
│ │
│ yolo 模式放宽了安全限制,使用前请确认: │
│ │
│ 1. 你在工作目录中没有敏感文件 │
│ 2. 你已备份重要数据 │
│ 3. 你理解 AI 可能执行的任何操作 │
│ 4. 你已准备好 git checkout 来回滚更改 │
│ │
│ 使用 yolo 模式 = 你承担所有风险 │
│ │
└─────────────────────────────────────────────────┘安全建议:
# 使用 yolo 模式前的安全检查清单
# 1. 检查当前目录状态
git status
# 确保没有未提交的更改,或者先提交
# 2. 创建备份分支
git checkout -b backup-before-yolo
git checkout -
# 3. 在独立目录中执行
mkdir -p ~/codex-yolo-experiment
cd ~/codex-yolo-experiment
git init
codex --sandbox yolo "你的任务"
# 4. 执行后检查
git diff --stat
git log --oneline五、安全边界详解
5.1 沙箱隔离的层次
Codex CLI 的沙箱安全不是单一维度的,而是多层次的防御体系:
┌───────────────────────────────────────────────────────────┐
│ 多层次安全防御 │
│ │
│ Layer 1: 文件系统隔离 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ • 沙箱使用独立的文件系统命名空间 │ │
│ │ • 工作目录通过 bind mount 映射到沙箱 │ │
│ │ • 其他系统目录不可见 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Layer 2: 进程隔离 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ • 沙箱内的进程在独立的 PID 命名空间中 │ │
│ │ • 无法看到或影响宿主机进程 │ │
│ │ • 资源使用受限(CPU、内存、磁盘) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Layer 3: 网络隔离 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ • 网络访问受防火墙规则控制 │ │
│ │ • 仅允许特定的出站连接 │ │
│ │ • 本地端口绑定受限 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Layer 4: 权限隔离 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ • 沙箱内以非特权用户运行 │ │
│ │ • 无 sudo / root 权限 │ │
│ │ • 设备访问受限 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└───────────────────────────────────────────────────────────┘5.2 被明确禁止的操作
无论在哪个模式下,以下操作始终被禁止:
# ❌ 这些操作在沙箱中始终被阻止
# 访问敏感目录
cat /etc/shadow # ❌ 密码文件
cat ~/.ssh/id_rsa # ❌ SSH 私钥
cat ~/.env # ❌ 环境变量文件
# 特权操作
sudo rm -rf / # ❌ 危险命令
chmod 777 / # ❌ 修改系统权限
# 进程操作
kill -9 1 # ❌ 杀死 init 进程
ps aux | grep ssh # ❌ 查看系统进程
# 网络攻击
curl http://localhost:6379 # ❌ 扫描本地端口
nmap localhost # ❌ 网络扫描
# 设备访问
cat /dev/sda1 # ❌ 直接访问磁盘设备
ls /dev/ # ❌ 查看设备文件5.3 安全测试验证
你可以通过以下命令验证沙箱的安全边界:
codex --sandbox yolo "尝试以下操作并报告结果:
1. 读取 /etc/passwd
2. 读取 /etc/shadow
3. 查看当前进程列表
4. 尝试写入 /tmp
5. 访问宿主机 IP
6. 检查是否以 root 运行"预期结果:
1. /etc/passwd:可能可以读取(沙箱内的副本,非真实系统文件)
2. /etc/shadow:❌ 被阻止 — 权限不足
3. 进程列表:只能看到沙箱内的进程
4. 写入 /tmp:✅ 可以(沙箱内的 /tmp)
5. 宿主机 IP:❌ 网络受限
6. root 检查:❌ 以非特权用户运行六、文件权限管理
6.1 沙箱中的文件权限
Codex CLI 在沙箱中创建文件时遵循以下默认权限:
| 文件类型 | 默认权限 | 说明 |
|---|---|---|
| 普通文件 | 644 (rw-r--r--) |
所有者可读写,其他人只读 |
| 可执行脚本 | 755 (rwxr-xr-x) |
所有者可执行,其他人可读可执行 |
| 目录 | 755 (rwxr-xr-x) |
所有者可进入和修改,其他人可进入 |
6.2 权限继承
codex "创建以下目录结构并设置权限:
- src/ (755)
- src/models/ (755)
- src/models/User.js (644)
- scripts/ (755)
- scripts/deploy.sh (755)
- .env (600)"6.3 权限变更的安全性
# ❌ 这些权限变更会被沙箱阻止
codex "chmod 777 /"
codex "chown root:root /sandbox/file"
# ✅ 这些权限变更在沙箱内允许
codex "chmod +x scripts/deploy.sh"
codex "chmod 600 .env"6.4 Git 权限追踪
Git 只追踪可执行位(execute bit),不追踪完整的权限设置:
# Git 会追踪的变化
chmod +x script.sh # ✅ Git 会记录这个变化
chmod -x script.sh # ✅ Git 会记录这个变化
# Git 不会追踪的变化
chmod 644 file.txt # ❌ Git 忽略(除非是可执行位变化)
chmod 600 file.txt # ❌ Git 忽略这意味着 Codex CLI 在沙箱中修改文件权限后,同步到你的工作目录时,只有可执行位会被 Git 追踪。
七、配置沙箱策略
7.1 通过配置文件设置默认模式
{
"sandbox_mode": "full-auto",
"auto_approve_commands": [
"npm install",
"npm test",
"git status",
"ls",
"cat"
],
"blocked_commands": [
"rm -rf /",
"sudo",
"curl",
"wget"
]
}7.2 通过环境变量覆盖
# 临时设置沙箱模式
export CODEX_SANDBOX_MODE=full-auto
codex "你的任务"
# 或者在命令中直接指定
CODEX_SANDBOX_MODE=yolo codex "快速原型开发"7.3 白名单和黑名单
你可以在配置中设置命令白名单和黑名单:
{
"allowed_commands": [
"npm",
"node",
"python",
"git",
"ls",
"cat",
"echo",
"mkdir",
"touch"
],
"blocked_commands": [
"rm -rf",
"sudo",
"curl",
"wget",
"nc",
"nmap",
"ssh"
]
}八、模式选择决策树
你信任 AI 吗?
/ \
否 是
/ \
使用 ask 模式 任务敏感吗?
/ \
是 否
/ \
使用 ask 模式 需要最大效率?
/ \
是 否
/ \
使用 yolo 模式 使用 full-auto 模式实用建议
# 新手阶段:始终使用 ask
codex --sandbox ask "任何任务"
# 熟悉后:日常开发用 full-auto
codex --sandbox full-auto "添加用户注册功能"
# 快速迭代:在隔离环境中用 yolo
mkdir -p /tmp/codex-experiment && cd /tmp/codex-experiment && git init
codex --sandbox yolo "创建一个完整的应用"
# 混合使用:敏感操作 ask,常规操作 full-auto
codex --sandbox ask "修改数据库密码"
codex --sandbox full-auto "添加新的 API 端点"总结
本文深入剖析了 Codex CLI 的沙箱安全体系:
- 三种沙箱模式:
ask(默认安全)、full-auto(全自动)、yolo(极限自由) - 安全边界:多层防御体系(文件系统、进程、网络、权限隔离)
- 始终禁止的操作:敏感文件访问、特权操作、网络攻击等
- 文件权限管理:默认权限、权限继承、Git 追踪规则
- 策略配置:通过配置文件和环境变量自定义安全策略
- 模式选择:基于信任度和任务敏感度的决策指南
理解并合理使用这些沙箱模式,是安全高效地使用 Codex CLI 的关键。
下篇预告
下一篇我们将探讨 Git 要求与临时仓库。你将学习:
- 为什么 Codex CLI 必须 在 Git 仓库中运行?
git initscratch 模式是什么?- 如何为每次 Codex 任务创建干净的临时仓库?
- Git 在 Codex CLI 中的角色:版本控制、上下文提供、回滚保障
敬请期待!