Claude Code 2.1.275(2026-09-17)的 changelog 這樣寫著。

修正了 /update-config 寫入 Write(path) 權限規則時,與檔案權限檢查
不相符,而不是 Edit(path) 規則

Write(路徑) 的權限規則,和檔案的權限檢查不一致。 而且寫出那種格式的正是 Claude Code 自己的 /update-config。我測了 36 次。

deny 只寫 Write(檔案)      12 次都寫進去了
deny 只寫 Edit(檔案)       12 次都停住了
兩者都寫                   12 次都停住了

Edit() 會連 Write 工具的新建也擋下來,Bash 的重新導向也會擋
2.1.275 仍然是 Write() 不起作用。修好的只有「寫出來的那一側」

檢證環境:Windows 10 / Claude Code 2.1.273 與 2.1.275 隔離安裝 / claude -p / 測量於 2026-09-18


測試方法:不是 acceptEdits 就無法定論

上次卡在這裡。
claude -p 沒有會回答確認的人,所以「拒絕」和「等待確認」看起來會是一樣的。

使用 --permission-mode acceptEdits 就能分開。

規則的狀態acceptEdits 下的結果有生效自動核准也不能覆寫 → 停住**沒生效確認會被自動核准 → 寫入**我把拒絕規則各自分開,準備了 3 個丟棄用目錄。

{ "permissions": { "deny": ["Write(./secret.txt)", "Write(./fresh.txt)"] } }
{ "permissions": { "deny": ["Edit(./secret.txt)",  "Edit(./fresh.txt)"] } }
{ "permissions": { "deny": ["Edit(./secret.txt)",  "Write(./secret.txt)", ... ] } }

路徑也有 3 種。判定只看檔案內容,不採信自我申告。

路徑E用 Edit 工具改寫既有的 secret.txtW用 Write 工具新建 fresh.txtB用 Bash 的 echo ... > secret.txt


結果:Write() 一次都沒擋下來

3 種規則 × 3 條路徑 × 2 個版本 × 每次 2 回 = 36 次。

拒絕規則E: Edit 工具W: Write 工具B: Bash 重新導向只有 Write(...)**2/2 寫入2/2 寫入2/2 寫入只有 Edit(...)0/2(拒絕)0/2(拒絕)0/2兩者都有0/2(拒絕)0/2(拒絕)0/2Claude Code 2.1.273 和 2.1.275,沒有任何差異。**

只有 Write(...) 的時候,不會出現拒絕事件(兩個版本都是 0/6)。
只有在有 Edit(...) 時才會回傳,而且不同路徑會顯示不同文句。

Edit / Write 工具  File is in a directory that is denied by your permission settings.
Bash                 Permission to use Bash with command echo BASH-WROTE > secret.txt has been denied.

Edit() 會連 Write 工具也擋下來

寫成 Edit(./fresh.txt),Write 工具的新建也會被擋住。
雖然名字是「Edit」,但檔案相關的檢查其實更偏向這一邊。

Write() 甚至連 Write 工具本身都擋不住。


/update-config 寫出的格式,在 2.1.275 已經改了

changelog 指名的就是這裡。
我請它「阻止對 secret.txt 的編輯」,然後讀取提案 JSON。

Claude Code 的版本提案的拒絕規則2.1.273 第 1 次Edit(secret.txt) / Write(secret.txt)**2.1.273 第 2 次再加上 `Edit(/secret.txt)/ **Write(/secret.txt)`**2.1.275 兩次都是 Edit(secret.txt) / `Edit(/secret.txt)** בלבד****2.1.273 雖然兩次的項目數不同,但都包含Write()。** 2.1.275 兩次都只有Edit()`。

不過 Write() 本身在 2.1.275 也還是沒有效。
修好的只是「之後要寫出的格式」,已經寫出的規則依舊沒有效。


確認自己的設定

只要找 Write( 就行了。

grep -n '"Write(' ~/.claude/settings.json ~/.claude/settings.local.json .claude/settings.json 2>/dev/null

找到了就改成 Edit(只寫 Edit() 就能擋住 3 條路徑,所以沒必要兩個都寫。

我自己的環境裡只有 Edit(...)因此沒有影響。


不能說的事

  • 不能說 Write() 在所有情境都沒用。 我測的是檔案的 deny 規則而已;allow 端沒測
  • 測的是 Claude Code 2.1.273 和 2.1.275 這兩個點。沒有特定出到底是從什麼時候開始這樣的
  • 結果是 acceptEdits 下的表現。 互動式工作階段裡確認對話框怎麼出現,沒有確認
  • /update-config兩個版本都拿不到 settings.json 的建立權限,所以我是讀提案 JSON。寫入後的檔案沒確認
  • 是 Windows 10 環境。路徑處理可能會因作業系統而不同

總結

  • 即使在 deny 裡寫了 Write(檔案),Claude Code 12 次也都還是寫進去了
  • Edit(檔案) 會擋下全部 3 條路徑。 Edit 工具、Write 工具的新建、Bash 的重新導向
  • Claude Code 2.1.275 也還是 Write() 無效。 修好的只有 /update-config 寫出的格式
  • 2.1.273 的 /update-config,混進了無效的 Write() 一起提案
  • 確認只要用 grep '"Write('有出現就改成 Edit(

拒絕規則,並不是寫了就會生效的設定。
上次是「刪掉也不影響結果」,這次則是明明寫著,卻什麼都沒做


參考

相關文章


JQIT 的工程師 95% 以上都是無經驗錄用。
如果有興趣,也歡迎到公司網站逛逛。

公司網站

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

招募網站


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


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

共有 0 則留言


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