permissions.allow 裡寫的規則有時候不會生效。
把同一條規則透過 --allowedTools 傳入時就會生效。 我測了 56 次,才找出分界點。
未受信任的資料夾 寫在 .claude/settings.json 的允許規則 0/4 執行(被忽略)
未受信任的資料夾 透過 --allowedTools 傳入相同規則 4/4 執行
未受信任的資料夾 透過 --settings 傳入相同規則 4/4 執行
設為受信任 .claude/settings.json 4/4 執行
Claude Code 2.1.281 與 2.1.282 沒有差異
驗證環境:Windows 10 / Claude Code 2.1.281 與 2.1.282 分開安裝 /
claude -p/ 測量時間為 2026-09-25
Claude Code 2.1.282(2026-09-24)的變更紀錄這樣寫:
修正 Bash 權限規則在設定檔中遇到中段
:*時會被跳過的問題,而--allowedTools會照常接受;現在所有來源都能正常運作,並會在啟動時提示其比對方式
可以理解成:「寫在設定檔裡會被跳過,透過 --allowedTools 就會生效。」我本來想測這件事,結果先在更前面的地方卡住了。
要測許可規則是否生效,必須先有一個沒有規則就會停下來的指令。
一開始我用 echo 來組,但即使完全沒有任何許可規則也能通過,根本不能拿來測。
以下是把許可規則清空後,試了 8 個指令的結果。
指令本身是否能通過echo START MARKER END可通過cat note.txt可通過ls -la可通過git status --short可通過node -e "console.log(...)"會停止sh -c "echo ..."會停止curl --version會停止npm config get registry**會停止我最後選用了 npm config get registry。它不會改動任何東西,卻需要承認。
我避開了會寫入檔案的指令。 如果改成 echo X > out.txt,就會因為
不是許可規則,而是「透過 shell 建立檔案需要承認」 而停住,
看不出規則到底有沒有生效。
我把 Bash(npm config:*) 這條許可規則,從 3 個地方分別傳入來比較。每種條件各測 2 次。
狀態規則放置位置Claude Code 2.1.2812.1.282未受信任.claude/settings.json0/2 執行**0/2 執行未受信任--allowedTools2/2 執行2/2 執行未受信任--settings <file>2/2 執行2/2 執行受信任.claude/settings.json2/2 執行**2/2 執行受信任--allowedTools2/2 執行2/2 執行受信任--settings <file>2/2 執行2/2 執行(對照)沒有規則—0/2 執行0/2 執行只有專案的 settings.json,會因為是否受信任而改變行為。
從命令列傳入的相同規則,即使沒有受信任也會生效。
--output-format stream-json 的 JSON 裡看不到,會出現在標準錯誤輸出。
Ignoring 1 permissions.allow entry from .claude/settings.json: this workspace has not been
trusted. Run Claude Code interactively here once and accept the trust dialog, or set
projects["<路徑>"].hasTrustDialogAccepted: true in ~/.claude.json
它明確寫著「已忽略」。 也提供了兩種修正方式:
~/.claude.json 裡把 projects["<路徑>"].hasTrustDialogAccepted 設為 true之後我用後者重新測了 28 次,settings.json 裡的規則就開始生效了。
(加上未受信任時的 28 次,總共是 56 次)
:* 無法重現我也測了原本變更紀錄提到的「中間有 :* 的規則」。
我用 Bash(npm config:* registry) 這條規則,從 3 條途徑 × 2 個版本 × 受信任/未受信任 全部跑過。
全部都停住了。 不管是受信任、--allowedTools,還是 2.1.282,結果都沒有變。
我不確定是這種寫法本來就沒有匹配到,還是從 claude -p 看不到相關行為。
能確定的只有:以我自己的寫法,沒有測出差異。
claude -p 的輸出。 互動式工作階段會出現信任對話框,條件不同~/.claude.json 取得。是否等同於透過對話框取得,未確認deny。 不知道只有 allow 會被忽略,還是別的也一樣.claude/settings.json 的 permissions.allow 會整組被忽略--allowedTools 和 --settings 即使沒有受信任也會生效。 同一條規則,結果卻不同stream-json 裡hasTrustDialogAccepted: true 寫進去:*」以我自己的寫法無法重現如果覺得「明明寫了規則卻沒生效」,先看標準錯誤輸出。
如果你是用 -p 或 CI 在跑,只讀 JSON 的話很容易完全沒注意到。
參考資料
JQIT 的工程師有超過 95% 是從無經驗招募而來。
如果有興趣,也歡迎來公司網站看看。
▶ 公司網站
我們也有工程師招募。若你有興趣,歡迎看看。
▶ 招募網站