04 - Sandbox 與 Approval 權限模型
← 03-互動模式基本操作 | 00-Index | 下一篇 → 05-AGENTS-md與config-toml
⚠️ 這是 Codex CLI 最該讀懂的一章。 兩個獨立的旋鈕,搞混會出事。
核心觀念:兩個獨立的旋鈕
┌──────────────────────┐ ┌──────────────────────┐
│ sandbox_mode │ │ approval_policy │
│ │ │ │
│ 技術上「能不能做」 │ × │ 「什麼時候問你」 │
│ (作業系統層級隔離) │ │ │
└──────────────────────┘ └──────────────────────┘
🔑
sandbox_mode控制 Codex 技術上能做什麼;approval_policy控制它什麼時候必須先問你。把它們當成分開的控制項。
這跟 Claude Code 只有一個 permission-mode 維度不同。好處是更精確,代價是要多想一層。
Sandbox modes(能做什麼)
| 模式 | 允許 |
|---|---|
read-only | 指令可以讀檔案,不能寫 |
workspace-write | 可以寫在目前 repo 和暫存目錄裡 |
danger-full-access | 可以寫任何地方 ⚠️ |
danger-full-access 是「不受限制的檔案系統政策」,官方定位是只有在外層環境已經提供隔離時才用(容器、VM、CI runner)。
workspace-write 底下還有一個細部設定表 [sandbox_workspace_write],可以調整:
network_access— 沙箱內能不能連網writable_roots— 除了 repo 之外還能寫哪些路徑
Approval policies(什麼時候問)
| 政策 | 行為 |
|---|---|
untrusted | 只有被視為可信的指令能不經核准直接跑 |
on-request | Codex 自己決定何時要求升級權限(日常預設) |
never | 從不問;被拒絕的操作直接失敗並把結果回給模型 |
選法:
never適合信任的開發機(你已經用 sandbox 圈好範圍了)untrusted是無人值守的 CI 和正式環境的正確預設
常用組合
| 組合 | 用途 |
|---|---|
read-only + untrusted | 最保守:純分析、審查、盤點 |
read-only + never | 純分析且不打擾(適合自動化盤點) |
workspace-write + on-request | 日常開發預設 |
workspace-write + never | 量產模式(= --full-auto) |
danger-full-access + never | ⚠️ 只在容器 / VM 裡 |
--full-auto 是什麼
--full-auto是一個便利旗標:讓 Codex 不問核准,並把 sandbox 強制設成workspace-write。
也就是說 --full-auto ≈ approval_policy = "never" + sandbox_mode = "workspace-write"。
這是 被 Herdr 編排時 最常用的組合:worker 不能停下來等人,但也不該能寫到 repo 外面。
⚠️
--full-auto不等於「什麼都能做」。 sandbox 還在,它寫不出 repo 和暫存目錄。想關掉沙箱要另外明確指定danger-full-access——不要因為想省事就這樣做。
在設定檔裡
~/.codex/config.toml:
approval_policy = "on-request"
sandbox_mode = "workspace-write"
[sandbox_workspace_write]
network_access = false用 profile 準備好幾組:
[profiles.paranoid]
approval_policy = "untrusted"
sandbox_mode = "read-only"
[profiles.ci]
approval_policy = "never"
sandbox_mode = "workspace-write"codex --profile paranoid # 純分析
codex --profile ci # 無人值守給你兩個 repo 的建議
Obsidian-med-note(醫學筆記庫)
[profiles.vault-audit]
approval_policy = "never"
sandbox_mode = "read-only" # 盤點、稽核:物理上改不到你的筆記
[profiles.vault-format]
approval_policy = "never"
sandbox_mode = "workspace-write" # 格式修補:能改,但寫不出 repo🔴 強烈建議盤點類任務一律用
read-only。 你的筆記是不可重建的資產(很多是查過 PubMed 才寫出來的),而 obsidian-git 每 10 分鐘會自動 commit——一旦被改壞,很可能在你發現之前就被推上去了。
read-only是作業系統層級的保證,比在 prompt 裡寫「不要改檔」可靠得多。
Taiwan_IM_board(刷題網站)
[profiles.exam-draft]
approval_policy = "never"
sandbox_mode = "workspace-write"詳解量產寫進 tmp_drafts/,在 repo 內,workspace-write 剛好夠用。
--skip-git-repo-check
Codex 預設要求在 git repo 裡跑,這是為了避免無法回退的破壞性變更。
codex exec --skip-git-repo-check "..."⚠️ 這個 flag 只跳過該指令的「非互動 repo 守衛」,不會關掉 sandbox。 但也代表你失去了 git 這層安全網——用之前想清楚。
網路存取
[sandbox_workspace_write] 的 network_access 控制沙箱內能不能連網。
什麼時候需要開:安裝相依套件、抓 API 資料。 什麼時候該關:處理敏感資料時(你的醫學筆記、理財對帳單)。
💡 關掉網路是防資料外流最簡單的一招。 一個做格式稽核的 worker 根本不需要連網。
一個實務上的心智模型
把兩個旋鈕想成安全帶和速限:
- sandbox = 安全帶:出事時保護你。永遠繫著,跟你開多快無關。
- approval = 速限:決定你被攔下來的頻率。信任的路段可以放寬。
最常見的錯誤是「因為一直被問而直接跳到 danger-full-access」——那是把安全帶解掉來解決被開罰單的問題。正確做法是調 approval,不是調 sandbox。
🔗 相關筆記
- 03-互動模式基本操作 — 上一步
- 05-AGENTS-md與config-toml — 下一步:怎麼寫進設定檔
- 08-實戰-被Claude指揮的雙手 — 編排時該用哪個組合
- Claude Code CLI 05 - 權限模式 — 對照:單一維度的設計
最後更新:2026-08-04
