規則
控制 Codex 在沙箱外可以執行哪些命令
使用 rules 可以控制 Codex 哪些命令允許在 sandbox 之外執行。
建立 rules 檔案
在當前啟用設定層旁邊的
rules/目錄下建立一個.rules檔案,例如~/.codex/rules/default.rules。新增一條規則。下面這個例子會在允許
gh pr view於沙箱外執行前先提示使用者確認。# Prompt before running commands with the prefix `gh pr view` outside the sandbox. prefix_rule( # The prefix to match. pattern = ["gh", "pr", "view"], # The action to take when Codex requests to run a matching command. decision = "prompt", # Optional rationale for why this rule exists. justification = "Viewing PRs is allowed with approval", # `match` and `not_match` are optional "inline unit tests" where you can # provide examples of commands that should (or should not) match this rule. match = [ "gh pr view 7888", "gh pr view --repo openai/codex", "gh pr view 7888 --json title,body,comments", ], not_match = [ # Does not match because the `pattern` must be an exact prefix. "gh pr --repo openai/codex view 7888", ], )重啟 Codex。
Codex 會在啟動時掃描每個啟用設定層下的 rules/ 目錄,包括 Team Config 位置和使用者層 ~/.codex/rules/。位於 <repo>/.codex/rules/ 的專案本機規則只會在專案 .codex/ 設定層受信任時載入。
當你在 TUI 中把某條命令加入允許列表時,Codex 會把規則寫入使用者層的 ~/.codex/rules/default.rules,這樣後續執行就可以跳過同類提示。
啟用 Smart approvals(智慧審批)時,Codex 在升級權限請求期間可能會為你建議一條 prefix_rule。接受前,請仔細檢查它建議的命令字首。
管理員也可以通過 requirements.toml 強制下發更嚴格的 prefix_rule。
理解規則欄位
prefix_rule() 支援這些欄位:
pattern(必填):一個非空列表,用來定義要匹配的命令字首。列表中的每個元素可以是:- 一個字面量字串,例如
"pr" - 一個由多個字面量構成的並集,例如
["view", "list"],表示在這一參數位置匹配多個備選值
- 一個字面量字串,例如
decision(預設值為"allow"):當規則命中時要採取的動作。如果多條規則同時命中,Codex 會採用最嚴格的決策(forbidden>prompt>allow)。allow:不提示,直接在 sandbox 外執行命令prompt:每次命中都先請求確認forbidden:不提示,直接阻止該請求
justification(可選):非空的人類可讀說明。Codex 可能會在 approval 提示或拒絕訊息中顯示它。如果使用forbidden,適合在這裡順帶給出一個推薦替代方案,例如"Use \rg` instead of `grep`."`match和not_match(預設都是[]):在載入 rules 時由 Codex 校驗的命令範例,用來在規則真正生效前發現設定錯誤
當 Codex 評估一條待執行命令時,它會把命令的參數陣列與 pattern 做比較。在內部,Codex 會把命令視為一個參數列表,類似 execvp(3) 接收到的形式。
Shell wrapper 與複合命令
有些工具會把多條 shell 命令包裝成一次呼叫,例如:
["bash", "-lc", "git add . && rm -rf /"]由於這種呼叫會把多個動作隱藏在一段字串裡,Codex 會對 bash -lc、bash -c 以及對應的 zsh / sh 變體做特殊處理。
Codex 何時可以安全拆分指令碼
如果 shell 指令碼只是由下列元素組成的線性命令鏈:
- 純字面量單詞,不包含變數展開、
VAR=...、$FOO、*等特殊語法 - 只通過安全運算子連線,例如
&&、||、;或|
那麼 Codex 會使用 tree-sitter 解析它,並在應用 rules 前把它拆成多條獨立命令。
上面的指令碼會被視為兩條命令:
["git", "add", "."]["rm", "-rf", "/"]
Codex 會分別用你的 rules 評估每條命令,並以最嚴格的結果為準。
即使你允許 pattern=["git", "add"],Codex 也不會自動放行 git add . && rm -rf /,因為其中的 rm -rf / 會被單獨評估,從而阻止整個呼叫被自動允許。
這可以防止危險命令混在安全命令後面一起“偷渡”執行。
Codex 何時不會拆分指令碼
如果指令碼使用了更復雜的 shell 特性,例如:
- 重定向,例如
>、>>、< - 替換表示式,例如
$(...)或反引號 - 環境變數賦值,例如
FOO=bar - 萬用字元模式,例如
*、? - 控制流,例如
if、for,或帶賦值的&&
那麼 Codex 就不會嘗試解釋或拆分它。
在這種情況下,整次呼叫會被當作:
["bash", "-lc", "<full script>"]並按一次單獨呼叫整體應用你的 rules。
這種處理方式意味著:在可以安全拆分時,Codex 會按單條命令逐項評估;在不能安全拆分時,則採用更保守的整體判斷。
測試規則檔案
使用 codex execpolicy check 可以測試 rules 對某條命令會產生什麼效果:
codex execpolicy check --pretty \
--rules ~/.codex/rules/default.rules \
-- gh pr view 7888 --json title,body,comments這個命令會輸出 JSON,展示最嚴格的決策結果以及命中的規則,其中也包括命中規則裡的 justification。你可以傳多個 --rules 來組合多份規則檔案;加上 --pretty 則會得到格式化輸出。
理解規則語言
.rules 檔案使用的是 Starlark(參見 language spec)。它的語法看起來像 Python,但設計目標是安全執行,因此 rules 引擎可以在不產生副作用的前提下執行它,例如不會觸碰檔案系統。
來源:</zh-TW/docs/agent-configuration/rules> 更新時間:2026-07-10(UTC)