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 建立檔案需要承認」 而停住,
看不出規則到底有沒有生效。


結果:未受信任時,settings.json 會被忽略

我把 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,會因為是否受信任而改變行為。
從命令列傳入的相同規則,即使沒有受信任也會生效。


原因寫在 stderr 裡

--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 次)


changelog 裡的 :* 無法重現

我也測了原本變更紀錄提到的「中間有 :* 的規則」。
我用 Bash(npm config:* registry) 這條規則,從 3 條途徑 × 2 個版本 × 受信任/未受信任 全部跑過。

全部都停住了。 不管是受信任、--allowedTools,還是 2.1.282,結果都沒有變。

我不確定是這種寫法本來就沒有匹配到,還是從 claude -p 看不到相關行為。
能確定的只有:以我自己的寫法,沒有測出差異。


無法下定論的部分

  • 不能說 changelog 的修正不存在。 仍有可能是我規則的寫法有問題
  • 只測了 Claude Code 2.1.281 和 2.1.282 兩個版本。更早版本沒測
  • 結果是 claude -p 的輸出。 互動式工作階段會出現信任對話框,條件不同
  • 每個條件只測 2 次。次數不多
  • 信任是直接修改 ~/.claude.json 取得。是否等同於透過對話框取得,未確認
  • 沒有測 deny。 不知道只有 allow 會被忽略,還是別的也一樣
  • 沒有確認 2.1.282 所說的啟動時警告。
  • 環境是 Windows 10

總結

  • 在未受信任的資料夾中,.claude/settings.json 的 permissions.allow 會整組被忽略
  • --allowedTools 和 --settings 即使沒有受信任也會生效。 同一條規則,結果卻不同
  • 原因已明寫在 stderr。 不會出現在 stream-json 裡
  • 修正方法是以互動方式信任一次,或把 hasTrustDialogAccepted: true 寫進去
  • Claude Code 2.1.281 和 2.1.282 之間,這個行為沒有差異
  • changelog 提到的「中間有 :*」以我自己的寫法無法重現

如果覺得「明明寫了規則卻沒生效」,先看標準錯誤輸出。
如果你是用 -p 或 CI 在跑,只讀 JSON 的話很容易完全沒注意到。


參考資料


相關文章


JQIT 的工程師有超過 95% 是從無經驗招募而來。
如果有興趣,也歡迎來公司網站看看。

▶ 公司網站

我們也有工程師招募。若你有興趣,歡迎看看。

▶ 招募網站


原文出處:https://qiita.com/suwa_nobu/items/92d4de34077b9ae02fca


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝62   💬2  
846
🥈
NewsData
2
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登