在 auto 模式下,Claude 第一次想讀工作目錄以外的檔案,Claude Code 會停下來問你一次。提示框有一個選項叫「No, and block reads outside the working directories from now on」。文件寫得很清楚,選了它不只是拒絕這一次:Claude Code 會把 permissions.blockReadsOutsideWorkingDirectories 在你的 user settings 設成 true,之後每個 session、每種 permission mode,檔案工具都拒絕這類讀取(出處:Permission modes)。

一個提示框的按鈕,就在你的全域設定裡寫進一個 key。而今天發的 2.1.314,changelog 第一條又多了它的寫入版:permissions.blockWritesOutsideWorkingDirectories。

所以現在想讓 Claude 別走出工作目錄,手上有四樣東西:只擋讀、只擋寫、把目錄加進工作目錄、沙盒。它們管的範圍差很多,挑錯了會有一段你以為圍起來、其實沒圍的縫。這篇講怎麼挑。

這篇全部來自官方文件與 changelog,我沒有實際開啟過這兩個 key。本機只跑過 claude --version,輸出是 2.1.314 (Claude Code),其他行為都是文件怎麼寫我就怎麼轉述。寫入版在文件裡我只查到 changelog 那一行,預設值、Scope、對 Bash 的行為,我沒查到,下面都會標出來。

先問你要防的是哪一種動作

四樣東西之間最大的分界線,是 Claude 的檔案工具和 Bash。

沙盒那一邊,文件說得很直接:沙盒只涵蓋 shell 指令,Claude 的檔案工具、MCP server、hooks 都在沙盒外面跑;Read、Edit、Write、WebFetch、WebSearch 這些內建工具,靠的是權限規則(出處:Sandboxing)。反過來,兩個 block key 管的是檔案工具。讀取版擋的是 Read、Grep、Glob、LSP;寫入版照 changelog 的原文,是 Write、Edit、NotebookEdit 三個,拒絕工作目錄外的路徑,而且在每種 permission mode 都一樣(出處:CHANGELOG 2.1.314)。

這個分工有個推論:你只開讀取版的 block key,Claude 若是換成 cat ../x 這種 Bash 指令,那是另一套規則在管。文件對讀取版的說法是 Claude Code 「doesn’t refuse shell commands the same way」。

它對 shell 指令的做法是這樣:shell 解析器追不出路徑的指令,例如換超過一次目錄、或起了 subshell,即使在 auto 或 bypassPermissions 也會問你。如果指令跑在沙盒裡,而且沙盒有執行這個限制,這個提示就不會出現(出處:Settings reference)。寫入版對 Bash 怎麼處理,文件沒寫,我沒查到。

所以判準的第一刀是:你擔心的動作是不是經過 Bash。經過,就要有沙盒;不經過,block key 才是對的工具。兩種都擔心,就兩個都要(這是照讀取版的文件推的)。

沙盒自己的預設範圍也值得知道,文件寫的是:讀寫目前工作目錄與子目錄、你用 --add-dir、/add-dir、permissions.additionalDirectories 加進來的目錄,外加 $TMPDIR 指的個人暫存目錄;讀取則是整台電腦,除了某些被拒的目錄。換句話說,沙盒的「寫」有圍,「讀」預設沒圍。這點跟讀取版 block key 剛好互補,但沙盒本身怎麼設,我之前寫過完整教學,這裡不重講。

讓我意外的是:寫入版只有一行,讀取版有一整套規矩

我本來想寫的是寫入版怎麼用,查下去才發現,它在文件裡沒什麼可看。

讀取版在 settings-reference 有完整條目:型別是 Boolean,預設是 unset,也就是工作目錄外的讀取跟著你的 permission mode 走;false 等於沒設,只要別的檔案設了 true 它就照樣生效;Scope 是 Any file,任何一個設定檔寫 true 就算數,所以 repo 可以替自己上鎖,但解不開你的鎖;要解除,得把每個設了它的檔案裡的 key 都移掉,再開新 session。要求 v2.1.257 以上(出處:Settings reference)。連 managed settings 的優先序例外表都有它:任何 scope 的 true,即使 managed 來源設成 false 也照樣生效(出處:Settings)。

寫入版呢?查證時,settings-reference 的前 200K 字元與 permissions 全文都搜不到這個 key,只在 changelog 看到那一行。優先序例外表也沒列它。這可能是文件當天還沒更新,也可能在我沒讀到的部分。

我的做法是不把讀取版的規矩搬過去。兩個 key 名字只差一個單字,很容易順手認定它們的 Scope 一樣、預設一樣、managed 也一樣。但這些只有讀取版有原文,寫入版沒有。所以下面這些我都不寫成事實:寫入版的預設值、能不能被 repo 的設定檔鎖定、managed 能不能蓋掉它、Bash 的重導向算不算數、symlink 怎麼處理。文件沒說,我沒查到。

什麼算「工作目錄」,讀取版有一條不直覺的規定

兩個 block key 的前提是「工作目錄」這個詞,所以它怎麼劃很重要。

預設是你啟動 Claude 的那個目錄。要擴大有三條路:啟動時用 --add-dir <path>、session 中用 /add-dir、或在設定檔的 additionalDirectories 寫持久設定。加進來的目錄,權限規則跟原本的工作目錄一樣:讀取不用問(網路路徑檢查除外),編輯權限跟著目前的 permission mode(出處:Permissions)。

這裡有兩個容易誤會的地方。第一,additionalDirectories 只給檔案存取,不會讓那個目錄變成完整的設定根;文件原話是它「grant file access only」,不會載入那個目錄的設定。第二,專案的 .claude/settings.json 裡的條目,要等你接受該資料夾的 workspace trust 對話框才生效。

讀取版再多一條規定:只有你用 --add-dir、/add-dir,或在 user、managed settings 的 additionalDirectories 加的目錄,才算這個圍籬的工作目錄。只寫在 repo 設定裡的不算,指的是 .claude/settings.json,還有 .claude/settings.local.json(除非 git 回報該檔是 untracked)。

這條的用意,我的讀法是圍籬的邊界不能讓被圍的東西自己決定,這是我的推測,文件沒這樣解釋。如果 repo 裡一行 additionalDirectories 就能把 ~/.ssh 劃進工作目錄,那個 block key 就形同虛設。寫入版有沒有同一條規則,文件沒寫,這裡一樣只能說我沒查到。

別人踩過的坑,多半在 Bash 和沙盒那一側

這一節不是我的經驗。我沒開過這個 key,沒有死路可講。我只能轉述 CHANGELOG 裡已修掉的條目,它們幾乎都繞著 Bash、沙盒或 symlink 打轉,沒有一條寫的是檔案工具本身漏了。

  • Bash 指令權限檢查器無法完整分析時,跳過了 blockReadsOutsideWorkingDirectories 該有的提示,同一條還提到 bypass mode 下藏在 subshell 裡的危險 rm。
  • 兩次換目錄、一個 subshell、或 cd 加 git 串起來的指令,在 bypass 與 auto mode 下跳過提示。
  • 專案的 CLAUDE.md、rule 或 AGENTS.md 若是 symlink 到工作目錄外,會在讀取版或 Read deny 規則開著時照樣被載入。
  • macOS 上開了讀取版,會讓沙盒裡的 git 看不到使用者的 git config,也讓 worktree 隔離的 sub-agent 看不到自己的 checkout。
  • Linux 上,--plugin-dir 的資料夾同時也是加進來的目錄、又開著讀取版時,沙盒裡的指令會報 bwrap: Can't create file。

(以上出處:CHANGELOG.md,已修。)

這份清單我會這樣看:這幾條漏的或擋過頭的,大多落在 Bash 與沙盒那一側,跟前面講的分界線對得上。寫入版剛發,我沒有它的同類紀錄,所以不會假設它沒有洞,只是沒資料。

我的選法

先講立場:只開 block key,不叫做圍起來。

如果你的 Claude 會碰 Bash,讀取版管不到那一側,文件就是這麼寫的;寫入版有沒有管,我沒查到。要圍 Bash 得靠沙盒。反過來,只開沙盒也不夠,因為沙盒不管 Write、Edit 這些內建工具,那邊得靠權限規則與 block key。兩邊各管一半,哪一半沒圍,就是洞開在哪一半。

再講為什麼需要 block key,而不是只靠 permission mode。沒開圍籬的時候,各模式對工作目錄外的處理不一樣:acceptEdits 文件說自動核准只適用於工作目錄或 additionalDirectories 內的路徑,其他會提示;auto 模式讀取工作目錄內的檔案自動核准,第一次讀工作目錄外會提示,其餘交給分類器判斷;bypassPermissions 則是文件說的「disables permission prompts and safety checks」,連寫入受保護路徑都不問(出處:Permission modes)。那一頁我讀到的內容裡,沒看到針對 bypass 模式的工作目錄邊界說明,所以「bypass 下寫工作目錄外就是不問」是我從這句話推的,不是原文,我沒驗證過。

照這個推法,我的排序是這樣:

  1. 有用 auto 或 bypass,而且不想讓檔案工具離開專案:開對應的 block key。讀取版有完整文件可以對照;寫入版的 key 名稱與 changelog 那句話是確定的,其餘我不替它補。
  2. 目錄不夠用,要多看一個資料夾:加進工作目錄,單次用 --add-dir,要長期用就寫進 user 的 additionalDirectories,不要寫在 repo 設定裡(讀取版不承認,上面講過)。
  3. 有跑 Bash 指令的風險:另外開沙盒,不要把希望放在 block key 上。

會讓我改變想法的條件有兩個。第一,如果你只用 acceptEdits,而且習慣逐次看提示,這兩個 key 對你的增量不大,因為文件寫明那個模式的自動核准只涵蓋工作目錄內,目錄外的路徑仍會提示;其他模式(例如 default)我沒查到對應的文字,所以不替它們下結論。這兩個 key 是替「不想再被問、或根本不會被問」的情境準備的。第二,如果之後文件補上寫入版的條目,寫明它對 Bash 也生效,或 managed settings 蓋不掉它,那我上面對 Bash 的切法就要重寫,這篇也會跟著改。

想自己驗的人

我沒做過,所以只能給步驟,不能給結果。在一個放了無所謂檔案的測試專案裡,把 permissions.blockWritesOutsideWorkingDirectories 設成 true,開新 session,要求 Claude 用檔案工具寫一個專案外的路徑,再要求它用 Bash 寫同一個路徑,比較兩者。文件對讀取版說的行為,是拒絕並請 Claude 叫你用 /add-dir;寫入版是否同樣訊息,我不知道。

壓成一句:圍檔案工具用 block key,圍 Bash 用沙盒,兩者都要才算有邊界。寫入版今天剛發,用之前先把它當成「changelog 有、我在文件裡沒查到」的東西。