3544 字
18 分鐘

Claude Code 自動跑任務前:Auto 權限模式、白名單與回合上限

把 Claude Code 從互動式終端機改成背景或腳本任務後,最容易被忽略的不是 prompt,而是權限邊界。它能讀哪些資料夾、哪些工具不需要詢問、哪些 shell 指令一定要擋下來,會直接決定自動化的風險範圍。

官方 CLI 文件提供了 --allowedTools、--disallowedTools、--permission-mode 與 --max-turns 等控制項。Claude Code v2.1.284 也改變了互動式終端機和 VS Code 的預設權限模式;下面先說明升級後要確認的設定,再用「先讀、再改、最後才執行」整理實作前檢查表。

v2.1.309:驗收設定檔與 sandbox 的實際邊界#

2026 年 10 月 22 日 UTC 發布的 v2.1.309修正 sandbox Bash 在每次命令前於隔離外執行 shell startup files、macOS denyWrite glob 經 symlink 未套用到真實位置,以及 sandbox 命令/自動接受的編輯可修改 --mcp-config 指定檔案等問題。另修正 print/SDK session 已停用的 MCP 被後續權限提示重新連上的路徑。

這些修正對依賴既有排程設定的讀者有直接影響:應核對真正啟動的 claude --version 與參數,重新啟動排程程序後再驗收,不能只看互動終端機更新成功。下面是尚未執行的驗收設計,適用於不含真實憑證、可拋棄的測試工作區:

  • MCP 設定保護:準備只含測試內容的 MCP 設定,記錄原始雜湊。透過實際的 --mcp-config 入口啟動,分別要求受 sandbox 限制的 Bash 寫入及自動接受的編輯修改該檔。核對工具結果與檔案雜湊,測試後仍應與原檔一致;不要拿 production 設定測試。
  • macOS symlink 路徑:以假檔案及 symlink 建立 denyWrite glob 的測試目標,分別要求經連結路徑與真實路徑寫入。兩次都要對照拒絕結果與內容;只測一般路徑不足以涵蓋本次修正。測試設定與 symlink 限定於 fixture,不改個人 dotfiles。
  • 停用 MCP 的持續性:在 print/SDK 測試 session 停用測試 MCP,再觸發既定的無害權限詢問;確認之後的可用工具與測試服務連線紀錄沒有重新啟用。沒有服務端觀測資料時,應保留「未驗證連線」而非只靠模型口頭回答。

官方 sandbox 文件說明 sandbox 包覆 shell 命令,並提供 /sandbox Config 檢查解析後的限制。自己在一般 shell 執行測試、或從通常在 sandbox 外執行的 ! 入口輸入命令,都不能證明模型的 sandbox Bash 路徑受限。失敗後若改成隔離外重試,必須另記為不同入口。

v2.1.309 也將 sed -i 改為一般 Bash 詢問並按原命令執行;這類 Bash 編輯不由 /rewind 還原。驗收工作區應先留 Git checkpoint,再比較檔案差異;不要把 rewind 清單當成所有 shell 副作用的備份。

如果只有 Edit(path) deny,還要對照 permissions 的 redirect 檢查;v2.1.309 包含帶 subshell 的特定 redirect 修正。每項結果都應記下入口、規則來源、是否真正寫入與檔案前後差異,通過一個案例不能概括為全部 shell 語法都已驗證。

v2.1.284 之後先確認互動模式#

從 v2.1.284 起,互動式終端機和 VS Code session 若沒有指定權限模式,會以 Auto 啟動;明確設定的 permissions.defaultMode 仍然優先。這項 release note 指的是互動 session,不應直接推論到所有腳本或非互動呼叫。

Auto 不是 bypassPermissions。後者會略過 permission prompt,官方建議只在無法造成損害的隔離環境使用。若某個自動化依賴固定的 Plan 行為,像本文後面的 claude -p --permission-mode plan 範例一樣,請在該次執行明確指定 --permission-mode plan,不要仰賴安裝版本的互動預設。

若要檢查互動預設,先看團隊或個人的 settings 是否有 permissions.defaultMode,再用一個不含敏感資料的測試 repository 啟動互動 session,確認實際顯示的模式。需要統一管理 Auto 或 bypass 預設時,也要留意官方 settings precedence:project/local settings 不能設定這兩個模式,應在 user 或 managed settings 控制。

v2.1.302 的腳本預設不能從互動視窗推論#

v2.1.302 release notes指出,沒有指定權限模式的 claude -p 與 Agent SDK session,在第三方 provider、停用 telemetry 或全新安裝的情況,會以 default 啟動;明確指定 --permission-mode auto 仍維持 auto。這是帶條件的變更,不能簡化成所有腳本都改用 default,也不能從互動式視窗顯示 Auto 推論排程的模式。

因此,升級後若背景工作開始等待權限或停止,先記錄版本、provider、設定來源與實際啟動參數,確認是否依賴未指定的預設。不要直接補上 bypass。本文最後的 plan 範例已明確指定模式;既有要自動修改的腳本也應依核准的任務能力明確選擇模式。

可以在不含敏感資料的 fixture repository 做兩輪驗收:第一輪從真正的排程入口執行既有命令,保留工具決策與結束狀態;第二輪只加入已選定的 --permission-mode,保持 provider、任務與設定不變,再比較。prompt 可要求讀取指定測試檔,再執行一個事先設有 ask/deny 的無害命令,確認詢問或拒絕路徑符合預期。此流程尚未執行;模型自己說「我在 Auto」也不能取代工具決策紀錄。

Agent SDK 要另外核對呼叫端傳入的權限設定,不能以 terminal wrapper 的參數當證據。若排程無人可以回覆詢問,將等待或權限拒絕列為可辨識的未完成狀態,由排程外層設定逾時;--max-turns 限制的是回合,不能代替整個程序的牆鐘時間上限。不要因為沒有看到錯誤就直接重跑可能已有外部副作用的任務。

升到 v2.1.289,還要驗收拒絕規則的入口#

2026 年 10 月 3 日的 v2.1.289 release notes列出幾個與自動化直接相關的修正:受管理機器上的複合 shell 命令,局部 deny/ask 不應被使用者安裝 mod 的核准蓋過;sandbox auto-allow 下,帶展開值的環境變數前綴或前置變數賦值不應跳過 Bash deny/ask;IDE 中經 symlink 提及、修改或選取的檔案也應套用 Read deny。

這些是特定路徑的修正,不能解讀成所有外掛、shell 或 IDE 情境都已驗證。已有自動任務應先確認 claude --version,再在不含敏感資料的測試 repository 驗收實際使用的入口。以下是待執行的測試設計,本文沒有執行 Claude Code:

  • 建立只含 permission-fixture 字樣的 blocked.txt,設定精確的 Read deny;分別要求直接讀取及透過 IDE 的 symlink 入口讀取,確認工具被擋下。不要用真實金鑰測試。
  • 用 Bash(printf *) 作為測試 deny,要求執行單純的 printf、帶環境變數前綴的版本與前置賦值版本;若 production 開了 sandbox auto-allow,測試也應採相同條件。這些指令只能印出測試字串。
  • 使用 ask 規則時,確認需要人工回覆的入口確實提出詢問;不要把它當成 deny。對 managed/mod 複合命令的情境,另記錄實際政策與 mod 版本,沒有該環境就標記未驗證。

前述 Bash 測試可要求 Claude 在 fixture 中嘗試以下無害命令,逐筆記錄是否被拒絕;不要自己在 shell 執行後,把字串輸出當成 Claude 權限已生效的證據:

Terminal window
printf '%s\n' 'permission-fixture'
TZ="$PWD" printf '%s\n' 'permission-fixture'
marker=fixture; printf '%s\n' 'permission-fixture'

Bash pattern 比對命令文字,不是整個程式的存取邊界。即使 Bash(printf *) 的上述測試通過,也不能推論絕對路徑、其他 shell wrapper 或另一個工具入口全被擋住。需要檔案與網路隔離時,仍要驗收 sandbox;拒絕清單不能取代隔離機制。

驗收紀錄應包含版本、命令原文、規則來源及工具是否執行。官方 permissions 文件說明規則依 deny、ask、allow 順序判定;可在 /permissions 查看來源。prompt 裡寫「不要讀」不能代替工具權限。

若某項拒絕規則沒有生效,先停用該自動流程並保留結果;不要以放寬 allow 或 bypass 來讓測試通過。較完整的唯讀診斷範圍可參考 Claude Code 本機日誌診斷。

先決定這次任務應有哪種能力#

先把任務切成三類,才不會一開始就給過大的權限。

任務合理的最小能力不該預設給的能力
程式碼導覽、報告讀檔、git diff、git log編輯、安裝套件、寫入設定
小型修正讀檔、編輯指定區域、相關測試任意 shell 指令、刪除檔案
受控驗證讀檔、編輯、明確列出的測試指令跳過所有 permission prompt

這個分類不是產品保證,而是實務上的權限設計:先從最小集合開始,缺什麼再補,而不是讓 agent 先拿到完整終端機再希望它永遠不會誤用。

用白名單允許可預期的讀取工作#

Anthropic 文件說明,--allowedTools 可讓指定工具在不另外詢問的情況下執行;規則可對 Bash 指令使用 pattern。對只讀的工作,我會讓允許清單保持小而明確。

Terminal window
claude -p \
--allowedTools "Read" "Bash(git status *)" "Bash(git diff *)" "Bash(git log *)" \
"請檢查這個 PR 的變更,只列出風險,不要修改檔案。"

注意 pattern 是權限規則,不是安全審查的替代品。若命令需要網路、憑證或會改寫資料,就不應因為「看起來常用」而放進白名單。

用拒絕規則封住不能碰的操作#

--disallowedTools 可以移除整個工具,或拒絕特定 pattern。官方文件舉例指出,裸工具名稱會從模型可用工具中移除,而像 Bash(rm *) 的 scoped rule 只會拒絕符合的呼叫。

Terminal window
claude -p \
--disallowedTools "Bash(rm *)" "Bash(git push *)" "Bash(curl *)" \
"修正型別錯誤;只修改 src/,完成後執行 pnpm check。"

這裡的重點不是列出所有危險命令,而是先列出此任務不需要卻可能造成外部影響的類別,例如刪除、推送、下載或部署。真正需要這些動作時,改成單獨一步並交由人確認。

不要把跳過確認當作預設值#

--dangerously-skip-permissions 等同以 bypassPermissions 權限模式啟動。官方文件明確把它標成跳過 permission prompt 的選項;它適合隔離環境中的受控任務,不適合作為日常本機開發的預設。

如果只是要先釐清方案,可從 plan mode 開始:

Terminal window
claude --permission-mode plan \
"先分析目前測試為何失敗,列出根因與預計修改檔案;不要修改。"

先拿到計畫,再以較窄的允許工具重新啟動實作,通常比在同一個 session 內逐步放寬權限更容易稽核。

非互動任務要限制 agent 回合數#

自動化最怕的不是一次失敗,而是無限制重試。Claude Code 的 --max-turns 可限制非互動模式的 agentic turns;為每種任務設定合理上限,並把到達上限視為「需要檢查」而非「再跑一次」。

Terminal window
claude -p \
--max-turns 8 \
--allowedTools "Read" "Edit" "Bash(pnpm check)" \
"修正這個型別錯誤。完成標準:pnpm check 成功;若第 8 回合前無法完成,回報阻礙與目前 diff。"

回合上限要搭配完成條件才有意義。沒有驗證標準時,agent 可能很快停下卻沒有解決問題;沒有上限時,失敗的方向又可能被反覆嘗試。

額外資料夾要當成新的存取面#

--add-dir 會讓 Claude Code 能讀寫額外資料夾。官方文件也提醒,這些資料夾多數 .claude/ 設定不會被自動發現。實務上應把每個額外路徑當作一次新的權限審查:它是否包含 secrets、production 設定檔、客戶資料或其他 repository?

不確定時,先不要用 --add-dir。把需要的檔案複製到明確的工作區,或先以只讀報告確認必要性,再最小化新增路徑。

一個可拿來改的安全起點#

Terminal window
claude -p \
--permission-mode plan \
--max-turns 4 \
--allowedTools "Read" "Bash(git status *)" "Bash(git diff *)" \
--disallowedTools "Bash(rm *)" "Bash(git push *)" "Bash(curl *)" \
"分析登入測試失敗的根因。不要修改檔案。輸出:
1. 涉及檔案;2. 根因證據;3. 最小修正方案;4. 需要的人為決策。"

它的目標不是一次解完問題,而是先取得足以授權下一步的證據。確定修正範圍後,再另開一個只允許必要編輯與測試指令的 session。

這次要記住的事#

自動化的安全性不在於某一個神奇旗標,而在於任務是否分段、每段是否只取得必要權限,以及是否能在回合耗盡時留下可讀的失敗證據。把讀取、修改與外部動作拆開,日後回頭查問題也會容易得多。

常見問題#

Q: --allowedTools 和 --disallowedTools 可以一起用嗎?#

A: 可以。前者用來讓特定工具或 pattern 免於詢問,後者用來移除工具或拒絕特定呼叫。實作前仍要檢查實際 pattern 是否只涵蓋這次任務需要的命令。

Q: 什麼時候可以用 --dangerously-skip-permissions?#

A: 只在你已經隔離工作區、清楚限制可接觸資料,且任務本身經過審核時考慮。它會跳過 permission prompt,不應作為一般本機 repository 的預設設定。

Q: --max-turns 設多少才對?#

A: 沒有通用數字。把它設成足以完成一輪定位、修改與驗證的範圍;若經常撞到上限,先檢查任務是否太大或完成條件不清楚,而不是直接無限加大。

參考資料:

Claude Code CLI reference

Claude Code settings

Claude Code permissions

Claude Code v2.1.284 release notes

Claude Code v2.1.289 release notes

Claude Code v2.1.302 release notes

Claude Code v2.1.309 release notes

Claude Code sandboxing

Claude Code 自動跑任務前:Auto 權限模式、白名單與回合上限
https://laplusda.com/posts/claude-code-permission-automation-checklist/
作者
Zero
發佈於
2026-07-11
許可協議
CC BY-NC-SA 4.0