2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt
3> Use this file to discover all available pages before exploring further.3> Use this file to discover all available pages before exploring further.
4 4
5# 設定沙箱化 Bash 工具5# 設定沙箱化的 Bash 工具
6 6
7> 了解 Claude Code 的沙箱化 Bash 工具如何提供檔案系統和網路隔離,以實現更安全、更自主的代理執行。7> 使用內建沙箱限制 Claude Code 的 shell 命令可存取的檔案與網路主機。啟用沙箱、設定邊界,並修正它所造成的問題。
8 8
9Bash 沙箱讓 Claude 執行大多數 shell 命令,而無需停下來請求權限。與其批准每個命令,您可以定義命令可以接觸哪些檔案和網路域,作業系統會為每個 Bash、PowerShell 或 Monitor 命令及其子流程強制執行該邊界。9Bash 沙箱是作業系統在 Claude 於您的電腦上執行的 shell 命令周圍所強制實施的邊界。您可以設定這些命令能存取哪些檔案和網路網域,這些限制適用於 Bash、PowerShell 和 Monitor 命令,以及它們所啟動的程序。由於作業系統會在命令執行期間套用這些限制,Claude Code 可以[執行沙箱化的命令而無需詢問您](#sandbox-modes)是否核准每一個命令。
10
11沙箱僅涵蓋 shell 命令。Claude 的檔案工具、MCP 伺服器和 hook [在沙箱之外執行](#what-runs-outside-the-sandbox)。
12
13沙箱可在 macOS、Linux 和 WSL2 上執行。在原生 Windows 上,Claude Code 會以非沙箱化的方式執行命令。若要在 Windows 電腦上使用沙箱,請在 WSL2 發行版中執行 Claude Code。
10 14
11<Note>15<Note>
12 若要比較其他隔離方法,例如開發容器、自訂容器和虛擬機,請參閱 [Sandbox environments](/docs/zh-TW/sandbox-environments)。若要減少 Bash 以外工具的權限提示,請參閱 [permission modes](/docs/zh-TW/permission-modes)。16 本頁說明您自己電腦上 shell 命令周圍的沙箱。其他頁面涵蓋相關問題:
17
18 * 關於雲端工作階段如何被隔離,請參閱[安全性與隔離](/docs/zh-TW/claude-code-on-the-web#security-and-isolation)
19 * 若要比較其他隔離方式,例如 dev container、自訂容器和虛擬機器,請參閱[沙箱環境](/docs/zh-TW/sandbox-environments)
20 * 若要減少 Bash 以外工具的權限提示,請參閱[權限模式](/docs/zh-TW/permission-modes)
13</Note>21</Note>
14 22
23<h2 id="what-the-sandbox-restricts">
24 沙箱限制的範圍
25</h2>
26
27啟用沙箱時,Claude 執行的 shell 命令會在其邊界內啟動,這些命令所啟動的程序也是如此。沙箱預設為關閉。若要啟用,請如[開始使用](#get-started)所示,在工作階段中執行 `/sandbox`,或在[設定檔](/docs/zh-TW/settings)(例如 `~/.claude/settings.json`)中將 [`sandbox.enabled`](/docs/zh-TW/settings-reference#sandbox-enabled) 設為 `true`。
28
29下表列出沙箱化命令預設可存取的範圍,以及可變更各項預設值的設定。
30
31| 存取 | 預設 | 變更方式 |
32| :- | :- | :- |
33| 寫入 | 工作目錄、每位使用者專屬的暫存目錄,以及[您新增的目錄](/docs/zh-TW/permissions#additional-directories-grant-file-access-not-configuration)。[受保護路徑](#protected-paths)仍維持禁止寫入 | [`filesystem.allowWrite`](/docs/zh-TW/settings-reference#sandbox-filesystem-allowwrite)、[`filesystem.denyWrite`](/docs/zh-TW/settings-reference#sandbox-filesystem-denywrite) |
34| 讀取 | 機器上的大部分內容,包括 `~/.ssh` 和 `~/.aws/credentials` 等憑證檔案 | [`filesystem.denyRead`](/docs/zh-TW/settings-reference#sandbox-filesystem-denyread)、[`credentials`](#protect-credentials) |
35| 網路 | 沒有直接對外的路徑。連線會經過您機器上的代理伺服器,由其將每個主機與您允許的網域(初始為空)進行比對。您的權限模式決定[其他主機會如何處理](#hosts-outside-your-allowed-domains) | [`network.allowedDomains`](/docs/zh-TW/settings-reference#sandbox-network-alloweddomains)、[`network.deniedDomains`](/docs/zh-TW/settings-reference#sandbox-network-denieddomains) |
36| 環境變數 | 繼承自 Claude Code,包括其環境中的任何機密 | [`credentials`](#protect-credentials)、[`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-TW/env-vars) |
37
38Claude Code 的沙箱建置於開放原始碼套件 [`@anthropic-ai/sandbox-runtime`](https://github.com/anthropics/sandbox-runtime) 之上。
39
40<h3 id="what-runs-outside-the-sandbox">
41 在沙箱外執行的項目
42</h3>
43
44沙箱包覆的是 shell 命令。以下工具和程序會在沙箱外執行:
45
46* **內建檔案與網頁工具**:Read、Edit、Write、WebFetch 和 WebSearch 等工具改為遵循[權限規則](/docs/zh-TW/permissions)。`denyRead` 項目不會阻止 Read 工具,`allowedDomains` 也不會限制 WebFetch
47* **Claude Code 啟動的其他程序**:命令 [hook](/docs/zh-TW/hooks)、本機 [MCP 伺服器](/docs/zh-TW/mcp)、[外掛監視器](/docs/zh-TW/plugins/components#monitors)、[LSP 伺服器](/docs/zh-TW/tools-reference#lsp-tool-behavior),以及您的[狀態列](/docs/zh-TW/statusline)命令和 `apiKeyHelper` 等輔助命令,都會以您的完整存取權限執行
48
49視您的設定而定,部分 shell 命令也會在沙箱外執行:
50
51* **您自行輸入的命令**:在大多數工作階段中,您在 [`!` shell 模式提示字元](/docs/zh-TW/interactive-mode#shell-mode-with-prefix)輸入的命令會在沙箱外執行。[嚴格沙箱模式](#turn-off-the-retry-with-strict-sandbox-mode)列出了您輸入的命令會在沙箱內執行的工作階段
52* **排除的命令**:符合 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands) 的命令會在沙箱外執行
53* **非沙箱重試**:Claude 可以[要求在沙箱外執行命令](#the-unsandboxed-retry-escape-hatch),通常是在命令於沙箱中失敗之後
54
55若要將本節中的工具、程序和命令置於同一個邊界之後,請在[容器、虛擬機器或沙箱執行環境](/docs/zh-TW/sandbox-environments)中執行 Claude Code 程序本身。
56
15<h2 id="get-started">57<h2 id="get-started">
16 開始使用58 開始使用
17</h2>59</h2>
18 60
19sandbox 內建於 Claude Code 中,可在 macOS、Linux 和 WSL2 上執行。不支援原生 Windows。在 Windows 上,請在 WSL2 發行版中執行 Claude Code。61沙箱內建於 Claude Code 中。需要安裝的內容取決於您的平台:
20 62
21在 macOS 上,無需安裝任何內容:sandboxing 使用內建的 Seatbelt 框架。在 Linux 和 WSL2 上,sandbox 依賴於兩個套件,詳見[設定 Linux 和 WSL2](#set-up-linux-and-wsl2)。即使您尚未安裝這些套件,也可以開始使用 `/sandbox`,因為其面板會顯示是否缺少任何內容。63* **macOS**:沙箱機制使用內建的 Seatbelt 框架,因此可以直接進行下列步驟
64* **Linux 和 WSL2**:沙箱依賴 `bubblewrap` 和 `socat`,請參閱[設定 Linux 和 WSL2](#set-up-linux-and-wsl2)。即使尚未安裝它們,也可以先執行 `/sandbox`,因為其面板會顯示是否有任何缺少的項目
22 65
23<Steps>66<Steps>
24 <Step title="執行 /sandbox">67 <Step title="執行 /sandbox">
28 /sandbox71 /sandbox
29 ```72 ```
30 73
31 這會開啟 sandbox 面板,包含三個標籤,以及在 Linux 上缺少選用 seccomp 篩選器時的 Dependencies 標籤:74 這會開啟包含三個分頁的沙箱面板;在 Linux 上,若缺少選用的 seccomp 篩選器,還會多出一個 Dependencies 分頁:
32 75
33 * **Mode**:選擇如何核准 sandboxed 命令,詳見下一步76 * **Mode**:選擇沙箱化命令的核准方式,詳見下一步
34 * **Overrides**:選擇在 sandbox 下失敗的命令是否可以回退到執行 unsandboxed。這是 [`allowUnsandboxedCommands`](/docs/zh-TW/settings-reference#sandbox-allowunsandboxedcommands) 設定77 * **Overrides**:選擇在沙箱中失敗的命令是否可以退回以非沙箱方式執行。這就是 [`allowUnsandboxedCommands`](/docs/zh-TW/settings-reference#sandbox-allowunsandboxedcommands) 設定
35 * **Config**:檢視已解析的 sandbox 設定78 * **Config**:檢視解析後的沙箱設定
36 79
37 如果面板只顯示 Dependencies 標籤,表示缺少必需的套件。按照[設定 Linux 和 WSL2](#set-up-linux-and-wsl2) 中的說明安裝它,重新啟動 Claude Code,然後再次執行 `/sandbox`。80 如果面板只顯示 Dependencies 分頁,表示缺少必要的套件。請依照[設定 Linux 和 WSL2](#set-up-linux-and-wsl2) 中的說明安裝,重新啟動 Claude Code,然後再次執行 `/sandbox`。
38 </Step>81 </Step>
39 82
40 <Step title="選擇一個模式">83 <Step title="選擇模式">
41 在 Mode 標籤上,選擇自動允許或一般權限。自動允許會執行 sandboxed 命令而不提示,一般權限則即使在命令被 sandboxed 時也保持一般權限提示。請參閱[Sandbox 模式](#sandbox-modes),了解在自動允許模式下仍會提示哪些命令。84 在 Mode 分頁上,選擇 auto-allow 或一般權限。Auto-allow 會執行沙箱化命令而不提示,一般權限則即使命令已沙箱化,仍會保留一般的權限提示。關於在 auto-allow 模式下哪些命令仍會提示,請參閱[沙箱模式](#sandbox-modes)。
42 </Step>85 </Step>
43 86
44 <Step title="執行 Bash 命令">87 <Step title="執行 Bash 命令">
45 要求 Claude 執行命令,例如建置或測試套件。根據預設,sandbox 內的命令可以寫入工作目錄、[每個使用者的暫存目錄](/docs/zh-TW/env-vars),以及任何[您使用 `--add-dir`、`/add-dir` 或 `permissions.additionalDirectories` 新增的目錄](/docs/zh-TW/permissions#additional-directories-grant-file-access-not-configuration)。88 請 Claude 執行一個命令,例如建置或測試套件。預設情況下,沙箱內的命令可以寫入工作目錄、[每位使用者的暫存目錄](/docs/zh-TW/env-vars),以及透過 `--add-dir`、`/add-dir` 或 `permissions.additionalDirectories` [新增的任何目錄](/docs/zh-TW/permissions#additional-directories-grant-file-access-not-configuration)。
46 89
47 命令首次需要新的網路網域時,Claude Code 會提示核准;在[自動模式](/docs/zh-TW/permission-modes#eliminate-prompts-with-auto-mode)中,Claude 改為在[命令本身](#per-command-allowed-domains-in-auto-mode)上命名命令需要的主機,供分類器與其一起檢閱。90 當命令首次需要新的網路網域時,Claude Code 會提示您核准;在[自動模式](/docs/zh-TW/permission-modes#eliminate-prompts-with-auto-mode)中,Claude 則會[在命令本身上](#per-command-allowed-domains-in-auto-mode)列出該命令所需的主機,供分類器一併審查。
48 91
49 無法 sandboxed 執行的命令會回退到一般權限流程。Claude Code 將其權限提示標題為「Bash 命令 (unsandboxed)」而不是「Bash 命令」,因此您可以判斷哪些命令在 sandbox 外執行。若要擴大或縮小 sandbox 允許的範圍,請參閱[設定 sandboxing](#configure-sandboxing)。92 若要擴大或縮小沙箱允許的範圍,請參閱[設定沙箱機制](#configure-sandboxing)。
50 93
51 如果 sandboxed 命令在容器內因 `Operation not permitted` 而失敗,請參閱[疑難排解](#troubleshooting)下的 Bubblewrap 項目。94 如果沙箱化命令在容器內因 `Operation not permitted` 而失敗,請參閱[Bubblewrap 無法在容器內啟動](#bubblewrap-fails-to-start-inside-a-container)。
52 </Step>95 </Step>
53</Steps>96</Steps>
54 97
55當您在面板中選擇一個模式時,Claude Code 會將其儲存到您專案的本機設定 `.claude/settings.local.json`,該設定適用於目前專案。Claude Code 在那裡儲存設定時會將該檔案新增到您的全域 gitignore。若要在所有專案中啟用 sandbox,請在使用者設定 `~/.claude/settings.json` 中將 [`sandbox.enabled`](/docs/zh-TW/settings-reference#sandbox-enabled) 設定為 `true`。若要為組織中的每個開發人員強制執行 sandboxing,請使用[受管設定](#enforce-sandboxing-with-managed-settings)。98當您在面板中選擇模式時,Claude Code 會將其儲存到專案的本機設定 `.claude/settings.local.json`,該設定適用於目前的專案。Claude Code 在該檔案中儲存設定時,會將其加入您的全域 gitignore。若要在所有專案中啟用沙箱,請在 `~/.claude/settings.json` 的使用者設定中將 [`sandbox.enabled`](/docs/zh-TW/settings-reference#sandbox-enabled) 設為 `true`。若要對組織中的每位開發人員強制執行沙箱機制,請使用[受管設定](#enforce-sandboxing-with-managed-settings)。
56 99
57若要在一個工作階段中變更 sandbox 而不寫入設定檔,請使用 [`--settings`](/docs/zh-TW/settings#change-a-setting-for-one-session) 啟動 Claude Code。例如,此命令啟動一個 sandboxed 工作階段,其中 Claude 無法在 sandbox 外重試被阻止的命令:100若要在不寫入設定檔的情況下變更單一工作階段的沙箱,請使用 [`--settings`](/docs/zh-TW/settings#change-a-setting-for-one-session) 啟動 Claude Code。例如,下列命令會啟動一個沙箱化工作階段,在其中 Claude 無法在沙箱外重試被封鎖的命令:
58 101
59```bash theme={null}102```bash theme={null}
60claude --settings '{"sandbox": {"enabled": true, "allowUnsandboxedCommands": false}}'103claude --settings '{"sandbox": {"enabled": true, "allowUnsandboxedCommands": false}}'
61```104```
62 105
63<Warning>106<Warning>
64 根據預設,如果 sandbox 因缺少相依性或平台不受支援而無法啟動,Claude Code 會顯示警告並執行命令而不進行 sandboxing。若要改為將其設為硬失敗,請將 [`sandbox.failIfUnavailable`](/docs/zh-TW/settings-reference#sandbox-failifunavailable) 設定為 `true`。這適用於需要 sandboxing 作為安全閘道的受管部署。107 預設情況下,如果沙箱因缺少相依套件或平台不受支援而無法啟動,Claude Code 會在沒有沙箱機制的情況下執行命令。若要讓 Claude Code 改為在啟動時結束,請將 [`sandbox.failIfUnavailable`](/docs/zh-TW/settings-reference#sandbox-failifunavailable) 設為 `true`。需要將沙箱機制作為安全關卡的受管部署可以使用此設定。
65</Warning>108</Warning>
66 109
110<h3 id="confirm-commands-run-inside-the-sandbox">
111 確認命令在沙箱內執行
112</h3>
113
114若要檢查沙箱是否正常運作,請 Claude 執行表格中的每一行。您在 [`!` 提示字元](#what-runs-outside-the-sandbox)輸入的內容通常會在沙箱外執行,因此自行輸入這些命令並不能測試沙箱。
115
116| 命令 | 在沙箱內的結果 |
117| :- | :- |
118| `touch ~/sandbox-probe` | 在 macOS 上因 `Operation not permitted` 而失敗,在 Linux 和 WSL2 上因 `Read-only file system` 而失敗 |
119| `curl --noproxy '*' https://example.com` | 因 `Could not resolve host` 而失敗,因為該命令沒有繞過沙箱代理伺服器的路由 |
120
121如果 Claude 要求在沙箱外重試失敗的命令,請拒絕重試。如果 `touch` 成功,且您的家目錄不屬於沙箱允許命令寫入的目錄之一,請刪除 `~/sandbox-probe`。接著執行 `/sandbox`,檢查沙箱是否已開啟且其相依套件已安裝。
122
67<h3 id="set-up-linux-and-wsl2">123<h3 id="set-up-linux-and-wsl2">
68 設定 Linux 和 WSL2124 設定 Linux 和 WSL2
69</h3>125</h3>
70 126
71在 Linux 和 WSL2 上,sandbox 依賴於兩個套件:127在 Linux 和 WSL2 上,沙箱依賴下列套件:
72 128
73* [`bubblewrap`](https://github.com/containers/bubblewrap):強制檔案系統隔離的無特權 sandboxing 工具129* [`bubblewrap`](https://github.com/containers/bubblewrap):強制執行檔案系統隔離的非特權沙箱工具
74* [`socat`](http://www.dest-unreach.org/socat/):用於透過 sandbox 代理路由網路流量的中繼130* [`socat`](http://www.dest-unreach.org/socat/):用來將網路流量導向沙箱代理伺服器的中繼程式
75 131
76使用您發行版的套件管理員安裝它們:132使用您發行版的套件管理員安裝它們:
77 133
89 </Tab>145 </Tab>
90</Tabs>146</Tabs>
91 147
92當缺少相依性時,`/sandbox` 中的 Dependencies 標籤會列出您的平台缺少 `ripgrep`、`bubblewrap`、`socat` 和 seccomp 篩選器中的哪些。如果安裝並重新啟動 Claude Code 後沒有看到該標籤,表示所有相依性都已存在。148當缺少相依套件時,`/sandbox` 中的 Dependencies 分頁會列出您的平台缺少 `ripgrep`、`bubblewrap`、`socat` 和 seccomp 篩選器中的哪些項目。如果在安裝並重新啟動 Claude Code 後沒有看到該分頁,表示所有相依套件都已就緒。
93 149
94Ripgrep 與原生 Claude Code 二進位檔案一起打包。seccomp 篩選器是選用的,可新增 Unix 網域套接字阻止。如果缺少,請使用 `npm install -g @anthropic-ai/sandbox-runtime` 安裝它。150Ripgrep 隨附於原生 Claude Code 二進位檔中。seccomp 篩選器為選用項目,可增加 Unix domain socket 封鎖功能。如果缺少,請使用 `npm install -g @anthropic-ai/sandbox-runtime` 安裝。
95 151
96當缺少必需的相依性時,Dependencies 標籤是唯一顯示的標籤,直到您安裝它。當只缺少選用的 seccomp 篩選器時,Dependencies 標籤會與其他標籤一起出現。相依性檢查在啟動時執行,因此在安裝套件後重新啟動 Claude Code,以便 `/sandbox` 偵測到它們。152當缺少必要的相依套件時,在您安裝之前,Dependencies 分頁會是唯一顯示的分頁。當只缺少選用的 seccomp 篩選器時,Dependencies 分頁會與其他分頁一起顯示。相依性檢查會在啟動時執行,因此安裝套件後請重新啟動 Claude Code,讓 `/sandbox` 偵測到它們。
97 153
98<AccordionGroup>154<AccordionGroup>
99 <Accordion title="Ubuntu 24.04 及更新版本:允許 bubblewrap 建立使用者命名空間">155 <Accordion title="Ubuntu 24.04 及更新版本:允許 bubblewrap 建立使用者命名空間">
100 在 Ubuntu 24.04 及更新版本上,預設 AppArmor 原則會防止 bubblewrap 建立隔離所需的使用者命名空間。156 在 Ubuntu 24.04 及更新版本上,預設的 AppArmor 原則會阻止 bubblewrap 建立其進行隔離所需的使用者命名空間。
101 157
102 若要檢查您的環境(包括 WSL2 內)是否強制執行此限制,請執行 `sysctl kernel.apparmor_restrict_unprivileged_userns`。如果命令傳回 `0`,請跳過此步驟。如果列印 `No such file or directory` 錯誤,表示金鑰不存在,您可以跳過此步驟。如果傳回 `1`,請新增授予 `bwrap` 此功能的 AppArmor 設定檔:158 若要檢查您的環境(包括 WSL2 內部)是否強制執行此限制,請執行 `sysctl kernel.apparmor_restrict_unprivileged_userns`。如果命令傳回 `0`,請略過此步驟。如果它顯示 `No such file or directory` 錯誤,表示該鍵不存在,您可以略過此步驟。如果它傳回 `1`,請新增一個授予 `bwrap` 此能力的 AppArmor 設定檔:
103 159
104 ```bash theme={null}160 ```bash theme={null}
105 sudo tee /etc/apparmor.d/bwrap > /dev/null <<'EOF'161 sudo tee /etc/apparmor.d/bwrap > /dev/null <<'EOF'
113 EOF169 EOF
114 ```170 ```
115 171
116 該設定檔僅適用於 `bwrap` 本身,不適用於在 sandbox 內執行的命令。重新載入 AppArmor 以套用它:172 此設定檔僅套用於 `bwrap` 本身,而不套用於它在沙箱內執行的命令。重新載入 AppArmor 以套用它:
117 173
118 ```bash theme={null}174 ```bash theme={null}
119 sudo systemctl reload apparmor175 sudo systemctl reload apparmor
121 </Accordion>177 </Accordion>
122 178
123 <Accordion title="WSL2 注意事項">179 <Accordion title="WSL2 注意事項">
124 使用 `wsl -l -v` 從 PowerShell 檢查您的 WSL 版本。如果您看到 `Sandboxing requires WSL2`,您的發行版正在執行 WSL1。將其升級到 WSL2 或執行 Claude Code 而不進行 sandboxing。180 在 PowerShell 中使用 `wsl -l -v` 檢查您的 WSL 版本。如果看到 `Sandboxing requires WSL2`,表示您的發行版正在執行 WSL1。請將其升級到 WSL2,或在沒有沙箱機制的情況下執行 Claude Code。
125 181
126 在 WSL2 上,WSL 會將 Windows 二進位檔案(例如 `cmd.exe`、`powershell.exe` 或 `/mnt/c/` 下的任何內容)的啟動交給 Windows 主機,透過 Unix 套接字進行,因此 sandboxed 命令是否可以啟動一個取決於 sandbox 的 [Unix 套接字設定](/docs/zh-TW/settings-reference#sandbox-network-allowunixsockets):必須安裝選用的 seccomp 篩選器才能首先阻止套接字。若要允許這些啟動,請設定 `allowAllUnixSockets`;若要將它們完全保留在 sandbox 外,請將命令新增到 [`excludedCommands`](/docs/zh-TW/settings-reference#sandbox-excludedcommands)。182 在 WSL2 上,WSL 會透過 Unix socket 將 Windows 二進位檔(例如 `cmd.exe`、`powershell.exe` 或 `/mnt/c/` 下的任何程式)的啟動交給 Windows 主機處理,因此沙箱化命令能否啟動這類程式取決於沙箱的 [Unix socket 設定](/docs/zh-TW/settings-reference#sandbox-network-allowunixsockets):必須先安裝選用的 seccomp 篩選器,才能封鎖該 socket。若要允許這些啟動,請設定 `allowAllUnixSockets`,這會向沙箱化命令開放所有 Unix socket。
127 </Accordion>183 </Accordion>
128</AccordionGroup>184</AccordionGroup>
129 185
130<h3 id="sandbox-modes">186<h3 id="sandbox-modes">
131 Sandbox 模式187 沙箱模式
132</h3>188</h3>
133 189
134Claude Code 提供兩種 sandbox 模式。在兩種模式中,sandbox 強制執行相同的檔案系統和網路限制;唯一的區別是 sandboxed 命令是否自動核准或需要明確權限。190Claude Code 提供兩種沙箱模式。在這兩種模式中,沙箱都會強制執行相同的檔案系統和網路限制;差異僅在於沙箱化命令是自動核准還是需要明確的權限。
135 191
136<h4 id="auto-allow-mode">192<h4 id="auto-allow-mode">
137 自動允許模式193 Auto-allow 模式
138</h4>194</h4>
139 195
140當命令可以被 sandboxed 時,Claude Code 在 sandbox 內執行它並自動核准,無需詢問您的權限。無法被 sandboxed 的命令(例如需要存取非允許主機的網路存取的命令)會回退到一般權限流程,其中 Claude Code 檢查您的[權限規則](/docs/zh-TW/permissions)並限制這些規則不允許的任何命令,在手動模式下提示。196當命令在沙箱內執行時,Claude Code 會自動核准該命令,不會提示。當命令因為符合 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands) 或因為 Claude [以非沙箱方式重試](#the-unsandboxed-retry-escape-hatch)而在沙箱外執行時,該命令會經過一般的[權限流程](/docs/zh-TW/permissions)。
197
198連線到您尚未允許之主機的沙箱化命令仍會留在沙箱中。[允許網域以外的主機](#hosts-outside-your-allowed-domains)說明了由誰決定該連線是否放行。
141 199
142即使在自動允許模式下,以下仍然適用:200即使在 auto-allow 模式下,下列規則仍然適用:
143 201
144* 明確的[拒絕規則](/docs/zh-TW/permissions)始終受到尊重202* 明確的[拒絕規則](/docs/zh-TW/permissions)一律受到遵守
145* 針對[關鍵路徑](/docs/zh-TW/permission-modes#critical-paths)的 `rm` 或 `rmdir` 命令仍會進行一般權限流程203* 以[關鍵路徑](/docs/zh-TW/permission-modes#critical-paths)為目標的 `rm` 或 `rmdir` 命令仍會經過一般的權限流程
146* 內容範圍的[詢問規則](/docs/zh-TW/permissions)(例如 `Bash(git push *)`)仍會強制提示,即使是 sandboxed 命令204* 以內容為範圍的[詢問規則](/docs/zh-TW/permissions)(例如 `Bash(git push *)`)即使對沙箱化命令仍會強制提示
147* 裸 `Bash` 詢問規則或等效的 `Bash(*)` 形式會被跳過以執行 sandboxed 的命令;它仍然適用於回退到一般權限流程的命令。在[計畫模式](/docs/zh-TW/permission-modes#analyze-before-you-edit-with-plan-mode)中,規則不會被跳過:它會提示 sandboxed 命令,包括唯讀命令。在 v2.1.212 之前,跳過也適用於計畫模式205* 單純的 `Bash` 詢問規則,或等效的 `Bash(*)` 形式,對於以沙箱方式執行的命令會被略過;對於退回一般權限流程的命令則仍然適用。在 [plan mode](/docs/zh-TW/permission-modes#analyze-before-you-edit-with-plan-mode) 中,該規則不會被略過:它也會對沙箱化命令(包括唯讀命令)提示
148 206
149<Info>207<Info>
150 自動允許模式獨立於您的權限模式設定運作,除了[計畫模式](/docs/zh-TW/permission-modes#analyze-before-you-edit-with-plan-mode)、自動模式中帶有[每個命令允許的網域](#per-command-allowed-domains-in-auto-mode)的命令,以及[伺服器端分類器檢閱](/docs/zh-TW/permission-modes#how-the-classifier-evaluates-actions)自動模式中的 sandboxed 命令。即使您不在「接受編輯」模式中,當啟用自動允許時,sandboxed Bash 命令也會自動執行。這表示在 sandbox 邊界內修改檔案的 Bash 命令會執行而不提示,即使在手動模式中,檔案編輯工具也會提示。208 Auto-allow 模式獨立於您的權限模式設定運作,但有三個例外:[plan mode](/docs/zh-TW/permission-modes#analyze-before-you-edit-with-plan-mode)、帶有[每個命令允許網域](#per-command-allowed-domains-in-auto-mode)的自動模式命令,以及自動模式中對沙箱化命令的[伺服器端分類器審查](/docs/zh-TW/permission-modes#how-the-classifier-evaluates-actions)。即使您不在「accept edits」模式中,啟用 auto-allow 時沙箱化的 Bash 命令也會自動執行。這表示在沙箱邊界內修改檔案的 Bash 命令會在不提示的情況下執行,即使在檔案編輯工具會提示的 Manual 模式中也是如此。
151 209
152 在計畫模式中,自動允許不會擴大核准;請參閱[計畫模式](/docs/zh-TW/permission-modes#analyze-before-you-edit-with-plan-mode),了解 Claude Code 如何在您計畫時限制命令。在 v2.1.212 之前,自動允許在計畫模式中也執行 sandboxed 命令而不提示。210 在 plan mode 中,auto-allow 不會擴大核准範圍;關於 Claude Code 在您規劃時如何管控命令,請參閱 [plan mode](/docs/zh-TW/permission-modes#analyze-before-you-edit-with-plan-mode)。
153</Info>211</Info>
154 212
155<h4 id="regular-permissions-mode">213<h4 id="regular-permissions-mode">
156 一般權限模式214 一般權限模式
157</h4>215</h4>
158 216
159所有 Bash 命令都會進行一般權限流程,即使被 sandboxed。這提供了更多控制,但需要更多核准。217所有 Bash 命令都會經過一般的權限流程,即使已沙箱化也是如此。這提供了更多控制,但需要更多核准。
160 218
161<h4 id="the-unsandboxed-retry-escape-hatch">219<h4 id="the-unsandboxed-retry-escape-hatch">
162 Unsandboxed 重試逃生艙220 非沙箱重試的緊急出口
221</h4>
222
223非沙箱重試是為在沙箱內失敗的命令(例如與沙箱不相容的工具)所設的緊急出口。當沙箱封鎖網路連線時,Claude Code 會在命令的結果中指出被拒絕的主機,讓 Claude 看到被封鎖的內容。Claude 會分析失敗原因,並可能使用 `dangerouslyDisableSandbox` 參數重試該命令。
224
225重試的命令會以非沙箱方式執行。在互動式終端機工作階段中,由誰核准取決於您的權限模式:
226
227* **`bypassPermissions` 模式**:重試會在不提示的情況下執行
228* **Manual 模式和 `acceptEdits` 模式**:您會收到標題為「Bash command (unsandboxed)」的提示
229* **[自動模式](/docs/zh-TW/permission-modes#eliminate-prompts-with-auto-mode)**:由另一個分類器模型評估底層命令
230* **`dontAsk` 模式**:Claude Code 會拒絕重試
231* **Plan mode**:請參閱 [Claude Code 在您規劃時如何管控命令](/docs/zh-TW/permission-modes#analyze-before-you-edit-with-plan-mode)
232
233下列規則和設定會改變由誰核准重試:
234
235* **相符的允許規則**:如果允許規則(例如 `Bash(curl *)`)與命令相符,它也會核准重試,因此命令會在沙箱外執行而不提示
236* **針對該參數的詢問規則**:為 `Bash(dangerouslyDisableSandbox:true)` 新增一條[詢問規則](/docs/zh-TW/permissions#match-by-input-parameter),即可在 Bash 重試時收到提示。在自動模式和 `bypassPermissions` 模式中您也會收到提示,且該規則優先於相符的允許規則
237* **[`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-TW/settings-reference#permissions-blockreadsoutsideworkingdirectories)**:[任何模式都不會自動核准的動作](/docs/zh-TW/permission-modes#actions-no-mode-auto-approves)說明了此設定開啟時會提示的重試
238
239<h4 id="turn-off-the-retry-with-strict-sandbox-mode">
240 使用嚴格沙箱模式關閉重試
163</h4>241</h4>
164 242
165某些命令根本無法在 sandbox 內執行,例如與其不相容的工具或需要您未允許的主機的工具。Claude Code 在被阻止命令的結果中報告 sandbox 違規,命名 sandbox 拒絕的路徑或主機,因此 Claude 會看到 sandbox 阻止的內容。Claude Code 不會讓任務失敗或要求您關閉 sandboxing,而是包含一個逃生艙:Claude 分析違規並可能使用 `dangerouslyDisableSandbox` 參數重試命令。243您可以在[沙箱設定](/docs/zh-TW/settings-reference#sandbox-settings)中設定 `"allowUnsandboxedCommands": false` 來停用非沙箱重試。停用重試後,Claude Code 會忽略 `dangerouslyDisableSandbox` 參數。在沙箱執行期間,Claude 執行的命令除非符合 `excludedCommands` 項目,否則都會被沙箱化。若要在沙箱無法啟動時防止 Claude Code 以非沙箱方式執行命令,請同時設定 [`failIfUnavailable`](/docs/zh-TW/settings-reference#sandbox-failifunavailable)。`/sandbox` 的 **Overrides** 分頁會將此設定顯示為 **Strict sandbox mode**。
166 244
167重試的命令在 sandbox 外執行,因此會進行一般權限流程。在手動模式中,您會收到確認提示。在[自動模式](/docs/zh-TW/permission-modes#eliminate-prompts-with-auto-mode)中,分類器會評估基礎命令。當 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-TW/settings-reference#permissions-blockreadsoutsideworkingdirectories) 開啟時,需要核准才能在 sandbox 外執行的重試會提示您。若要在自動模式中的每次 unsandboxed 重試時都收到提示,請為 `Bash(dangerouslyDisableSandbox:true)` 新增[詢問規則](/docs/zh-TW/permissions#match-by-input-parameter)。245在您的使用者設定、`--settings` 或受管設定中的 `false`,即使專案的設定設為 `true` 也會維持有效。使用者設定中的 `false` 不會讓沙箱成為管理員強制要求,因此專案的其他沙箱設定仍然適用。在 v2.1.285 之前,專案的 `true` 會覆寫您使用者設定中的 `false`。
168 246
169您可以透過在[sandbox 設定](/docs/zh-TW/settings-reference#sandbox-settings)中設定 `"allowUnsandboxedCommands": false` 來停用此逃生艙。停用逃生艙後,Claude Code 會忽略 `dangerouslyDisableSandbox` 參數,Claude 執行的每個命令都必須 sandboxed 執行,除非您已在 `excludedCommands` 中列出它。`/sandbox` **Overrides** 標籤將此設定顯示為**嚴格 sandbox 模式**。247如果您或您的管理員在受管設定中或透過 `--settings` 旗標停用重試,沙箱就會成為管理員強制要求。Claude Code 接著會忽略儲存庫檔案中放寬沙箱的設定,包括 `excludedCommands` 項目。[管理員強制要求沙箱下的儲存庫設定](#repository-settings-under-an-admin-required-sandbox)列出了這些設定。
170 248
171嚴格 sandbox 模式適用於 Claude 執行的命令。您在 [`!` shell 模式提示](/docs/zh-TW/interactive-mode#shell-mode-with-prefix)中自己輸入的命令在 sandbox 外執行,除非工作階段是以下之一:249嚴格沙箱模式適用於 Claude 執行的命令。您自行在 [`!` shell 模式提示字元](/docs/zh-TW/interactive-mode#shell-mode-with-prefix)輸入的命令會在沙箱外執行,除非工作階段屬於下列情況之一:
172 250
173* **[背景工作階段](/docs/zh-TW/agent-view)**:嚴格 sandbox 模式也涵蓋 shell 模式命令251* **[背景工作階段](/docs/zh-TW/agent-view)**:嚴格沙箱模式也涵蓋 shell 模式命令
174* **Linux 工作階段,設定了 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-TW/env-vars#variables)**:每個命令都 sandboxed 執行,包括 shell 模式命令252* **設定了 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-TW/env-vars#variables) 的 Linux 工作階段**:每個命令都會以沙箱方式執行,包括 shell 模式命令
175 253
176在 v2.1.260 之前,嚴格 sandbox 模式在每個工作階段中都 sandboxed shell 模式命令。254在 v2.1.260 之前,嚴格沙箱模式會在每個工作階段中將 shell 模式命令沙箱化。
177 255
178<h4 id="temporary-directories">256<h4 id="temporary-directories">
179 暫存目錄257 暫存目錄
180</h4>258</h4>
181 259
182工作階段暫存目錄在 sandbox 內預設可寫,與工作目錄一起。除非您[停用檔案系統隔離](#disable-filesystem-isolation),Claude Code 會為 sandboxed 命令設定 `$TMPDIR` 為此目錄,因此寫入暫存檔案的工具無需額外設定即可運作。260預設情況下,除了工作目錄之外,每位使用者的暫存目錄在沙箱內也是可寫入的。除非您[停用檔案系統隔離](#disable-filesystem-isolation),否則 Claude Code 會為沙箱化命令將 `$TMPDIR` 設為此目錄,讓寫入暫存檔案的工具無需額外設定即可運作。
183 261
184Unsandboxed 命令在設定時會繼承您 shell 的 `$TMPDIR`,因此在檔案系統隔離開啟時,sandboxed 和 unsandboxed 命令會將 `$TMPDIR` 解析為不同的目錄。如果您的 shell 將 `$TMPDIR` 保留為未設定或空白,參考 `$TMPDIR` 的 unsandboxed 命令會收到您的 [`CLAUDE_CODE_TMPDIR`](/docs/zh-TW/env-vars) 覆蓋,或當您未設定一個或覆蓋是長路徑時的作業系統暫存目錄,因此變數不會展開為空字串。若要在兩者之間傳遞暫存檔案,請改為在工作目錄下寫入它們。262非沙箱命令在您的 shell 設定了 `$TMPDIR` 時會繼承該值,因此在檔案系統隔離開啟期間,沙箱化與非沙箱命令會將 `$TMPDIR` 解析為不同的目錄。如果您的 shell 未設定 `$TMPDIR` 或其值為空,引用 `$TMPDIR` 的非沙箱命令會收到您的 [`CLAUDE_CODE_TMPDIR`](/docs/zh-TW/env-vars) 覆寫值;若您尚未設定覆寫值或覆寫值是過長的路徑,則會收到作業系統的暫存目錄,因此該變數不會展開為空字串。若要在兩者之間傳遞暫存檔案,請改為將其寫入工作目錄下。
185 263
186<h2 id="configure-sandboxing">264<h2 id="configure-sandboxing">
187 設定沙箱265 設定沙箱機制
188</h2>266</h2>
189 267
190透過 `settings.json` 檔案自訂沙箱行為。請參閱[設定](/docs/zh-TW/settings-reference#sandbox-settings)以取得完整的設定參考。268透過 `settings.json` 檔案自訂沙箱行為。完整的設定參考請參閱[設定](/docs/zh-TW/settings-reference#sandbox-settings)。
191 269
192根據預設,沙箱化命令可以寫入目前的工作目錄、每個使用者的暫存目錄,以及任何[您已新增](/docs/zh-TW/permissions#additional-directories-grant-file-access-not-configuration)的目錄,使用 `--add-dir`、`/add-dir` 或 `permissions.additionalDirectories`。如果子程序命令(例如 `kubectl`、`terraform` 或 `npm`)需要寫入這些目錄以外的位置,請使用 `sandbox.filesystem.allowWrite` 來授予對特定路徑的存取權限:270預設情況下,沙箱化的命令可以寫入目前的工作目錄、每位使用者專屬的暫存目錄,以及任何透過 `--add-dir`、`/add-dir` 或 `permissions.additionalDirectories` [新增的目錄](/docs/zh-TW/permissions#additional-directories-grant-file-access-not-configuration)。如果 `kubectl`、`terraform` 或 `npm` 等子程序命令需要寫入這些目錄以外的位置,請使用 `sandbox.filesystem.allowWrite` 授予特定路徑的存取權:
193 271
194```json theme={null}272```json theme={null}
195{273{
202}280}
203```281```
204 282
205這些路徑在作業系統層級強制執行,因此在沙箱內執行的所有命令(包括其子程序)都會遵守它們。當工具需要對特定位置的寫入存取權限時,這是建議的方法,而不是使用 `excludedCommands` 將工具完全排除在沙箱之外。283這些路徑在作業系統層級強制執行,因此所有在沙箱內執行的命令(包括其子程序)都會遵守這些路徑。當某個工具需要特定位置的寫入權限時,建議採用此方法,而不是使用 `excludedCommands` 將該工具完全排除在沙箱之外。
206 284
207當您在多個[設定範圍](/docs/zh-TW/settings#settings-precedence)中定義相同的檔案系統陣列時,Claude Code 會合併它們,結合來自每個範圍的路徑,而不是用另一個範圍的陣列取代一個範圍的陣列。285當您在多個[設定範圍](/docs/zh-TW/settings#settings-precedence)中定義相同的檔案系統陣列時,Claude Code 會將它們合併,結合每個範圍中的路徑,而不是以某個範圍的陣列取代另一個範圍的陣列。當[防止開發人員擴大政策](#keep-developers-from-widening-the-policy)中所述的鎖定涵蓋某個項目時,Claude Code 會將該項目排除在合併之外。
208 286
209如果您在 CLI 上使用 [`--setting-sources`](/docs/zh-TW/cli-reference) 或在 Agent SDK 中使用 [`settingSources`](/docs/zh-TW/agent-sdk/claude-code-features#control-filesystem-settings-with-settingsources) 排除來源,Claude Code 會在建立沙箱設定時忽略其 `sandbox.filesystem` 項目、其 `Edit` 權限規則和其 `Read` 拒絕規則。需要 Claude Code v2.1.246 或更新版本。287如果您在 CLI 上使用 [`--setting-sources`](/docs/zh-TW/cli-reference) 或在 Agent SDK 中使用 [`settingSources`](/docs/zh-TW/agent-sdk/claude-code-features#control-filesystem-settings-with-settingsources) 排除某個來源,Claude Code 在建置沙箱設定時會忽略該來源的 `sandbox.filesystem` 項目、其 `Edit` 權限規則,以及其 `Read` 拒絕規則。需要 Claude Code v2.1.246 或更新版本。
210 288
211當您在工作階段期間編輯這些檔案系統清單時,Claude Code [將變更套用到執行中的工作階段](/docs/zh-TW/settings#when-edits-take-effect),因此下一個沙箱化命令會在新路徑下執行。289當您在工作階段期間編輯這些檔案系統清單時,Claude Code 會[將變更套用至執行中的工作階段](/docs/zh-TW/settings#when-edits-take-effect),因此下一個沙箱化命令會在新路徑下執行。
212 290
213路徑前綴控制路徑的解析方式:291沙箱檔案系統路徑使用標準慣例:`/tmp/build` 是絕對路徑,`~/.kube` 則相對於您的家目錄。這與 [Read 和 Edit 權限規則](/docs/zh-TW/permissions#read-and-edit)不同,後者使用 `//path` 表示絕對路徑,使用 `/path` 表示相對於專案的路徑。關於相對路徑、結尾斜線和萬用字元,請參閱[沙箱路徑前綴](/docs/zh-TW/settings-reference#sandbox-path-prefixes)。
214 292
215| 前綴 | 意義 | 範例 |293您也可以使用 `sandbox.filesystem.denyWrite` 和 `sandbox.filesystem.denyRead` 拒絕寫入或讀取存取,並使用 `sandbox.filesystem.allowRead` 在被拒絕的區域內重新允許特定路徑。當讀取規則重疊時,套用路徑較窄的規則:
216| :- | :- | :- |
217| `/` | 從檔案系統根目錄的絕對路徑 | `/tmp/build` 保持 `/tmp/build` |
218| `~/` | 相對於主目錄 | `~/.kube` 變成 `$HOME/.kube` |
219| `./` 或無前綴 | 相對於專案設定的專案根目錄,或相對於使用者設定的 `~/.claude` | `.claude/settings.json` 中的 `./output` 解析為 `<project-root>/output` |
220
221此語法不同於[讀取和編輯權限規則](/docs/zh-TW/permissions#read-and-edit),後者使用 `//path` 表示絕對路徑,`/path` 表示專案相對路徑。沙箱檔案系統路徑使用標準慣例:`/tmp/build` 是絕對路徑。關於 Claude Code 如何處理這些路徑中的尾部斜線或萬用字元,請參閱[沙箱路徑前綴](/docs/zh-TW/settings-reference#sandbox-path-prefixes)。
222
223您也可以使用 `sandbox.filesystem.denyWrite` 和 `sandbox.filesystem.denyRead` 拒絕寫入或讀取存取,並使用 `sandbox.filesystem.allowRead` 重新允許被拒絕區域內的特定路徑。當讀取規則重疊時,路徑較窄的規則適用:
224 294
225| 範例規則 | 結果 |295| 範例規則 | 結果 |
226| :- | :- |296| :- | :- |
227| `"denyRead": ["~/"]` 搭配 `"allowRead": ["~/projects"]` | `~/projects` 可讀,主目錄的其餘部分保持被阻止。較窄的允許重新開啟被拒絕區域的該部分 |297| `"denyRead": ["~/"]` 搭配 `"allowRead": ["~/projects"]` | `~/projects` 可讀取,家目錄的其餘部分仍被封鎖。較窄的允許規則會重新開放被拒絕區域中的該部分 |
228| `"allowRead": ["~/"]` 搭配 `"denyRead": ["~/.env"]` | `~/.env` 保持被阻止,主目錄的其餘部分可讀。拒絕在較寬的允許內保持,因此廣泛的允許無法無聲地重新暴露機密 |298| `"allowRead": ["~/"]` 搭配 `"denyRead": ["~/.env"]` | `~/.env` 仍被封鎖,家目錄的其餘部分可讀取。拒絕規則在較寬的允許規則內仍然有效,因此廣泛的允許規則無法在不知不覺中重新暴露機密 |
229| `"allowRead": ["~/"]` 搭配 `"denyRead": ["~/**/.env"]` | 主目錄下的每個 `.env` 保持被阻止,其餘部分可讀。[萬用字元拒絕](/docs/zh-TW/settings-reference#sandbox-path-prefixes)在較寬的允許內保持,就像精確路徑一樣 |299| `"allowRead": ["~/"]` 搭配 `"denyRead": ["~/**/.env"]` | 家目錄下的每個 `.env` 都仍被封鎖,其餘部分可讀取。[萬用字元拒絕規則](/docs/zh-TW/settings-reference#sandbox-path-prefixes)在較寬的允許規則內同樣有效,與精確路徑相同 |
230 300
231下面的範例會阻止從整個主目錄讀取,同時仍允許從目前專案讀取。將其放在您專案的 `.claude/settings.json` 中,因為相對路徑 `.` 只有在設定位於專案設定中時才會解析為專案根目錄:301以下範例封鎖從整個家目錄讀取,同時仍允許從目前專案讀取。請將其放在專案的 `.claude/settings.json` 中,因為只有當設定位於專案設定中時,相對路徑 `.` 才會解析為專案根目錄:
232 302
233```json theme={null}303```json theme={null}
234{304{
242}312}
243```313```
244 314
245如果您將相同的設定放在 `~/.claude/settings.json` 中,`.` 會解析為 `~/.claude`,專案檔案將保持被 `denyRead` 規則阻止。315如果您將相同的設定放在 `~/.claude/settings.json` 中,`.` 會改為解析為 `~/.claude`,而專案檔案將仍被 `denyRead` 規則封鎖。
316
317若要拒絕沙箱化命令讀取家目錄和掛載的磁碟區,同時保持工作目錄可讀取,請設定 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-TW/settings-reference#permissions-blockreadsoutsideworkingdirectories),而不是撰寫路徑規則。
318
319<h3 id="run-commands-outside-the-sandbox-with-excludedcommands">
320 使用 `excludedCommands` 在沙箱外執行命令
321</h3>
322
323在 [`sandbox.excludedCommands`](/docs/zh-TW/settings-reference#sandbox-excludedcommands) 中列出命令模式,即可在沙箱外執行相符的命令,這表示沒有檔案系統限制,也沒有網路代理伺服器。請將其用於無法在沙箱內運作、且您信任其擁有您完整存取權的工具。若某個工具只需要多一個目錄或多一個主機,或許可以使用 `allowWrite` 或 `allowedDomains` 運作,這兩者會讓命令保持在沙箱中。
324
325此範例將 `docker compose` 命令移出沙箱。將其儲存在 `~/.claude/settings.json` 中即可套用至您的所有專案:
326
327```json theme={null}
328{
329 "sandbox": {
330 "enabled": true,
331 "excludedCommands": ["docker compose *"]
332 }
333}
334```
335
336Claude Code 會將您的項目與每個 Bash 和 Monitor 呼叫進行比對。一個呼叫是 Claude 傳送的完整命令列,其中可以串接多個命令。以下規則決定呼叫是否離開沙箱:
337
338* **以 ` *` 結束模式**:項目使用與 `Bash(...)` [權限規則](/docs/zh-TW/permissions#permission-rule-syntax)相同的語法,其中不含萬用字元的模式為精確比對。`docker` 只比對不帶引數的 `docker`。`docker *` 比對帶或不帶引數的 `docker`
339* **呼叫中的每個命令都必須相符**:`npm ci && docker compose build` 會保持在沙箱中,除非另有項目涵蓋 `npm ci`
340* **Claude Code 比對的是呼叫的文字**:在內部呼叫 `docker` 的指令碼或 `make` 目標不會相符,`/usr/local/bin/docker` 也不會相符
341* **某些呼叫會保持在沙箱中**:重新導向至檔案、`cd`,或如 `$(...)` 的命令替換,會讓整個呼叫保持在沙箱中。[參考項目](/docs/zh-TW/settings-reference#sandbox-excludedcommands)列出了更多會保持在沙箱中的呼叫
342* **項目的儲存位置可能有影響**:當沙箱為[管理員要求](#repository-settings-under-an-admin-required-sandbox)時,Claude Code 會忽略 `.claude/settings.json` 和 `.claude/settings.local.json` 中的項目
343
344被排除的命令會經過一般的權限流程:
246 345
247若要拒絕沙箱化命令對主目錄和掛載磁碟區的讀取存取,同時保持工作目錄可讀,請改為設定 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-TW/settings-reference#permissions-blockreadsoutsideworkingdirectories),而不是編寫路徑規則。346* [唯讀命令](/docs/zh-TW/permissions#read-only-commands)以及您的允許規則涵蓋的命令會在不顯示提示的情況下執行
347* 在自動模式中,分類器會審查其他被排除的命令
348* 在 `bypassPermissions` 模式中,被排除的命令會在不顯示提示的情況下執行,除非有 ask 規則與之相符
349
350若要確認項目是否相符,請切換至 Manual 模式,並要求 Claude 執行會變更內容的相符命令,例如 `docker compose up -d`。權限提示的標題為「Bash command (unsandboxed)」。
351
352<Warning>
353 被排除的命令會以您的完整存取權執行。像 `docker *` 這樣廣泛的項目涵蓋了該工具能做的一切。如果您撰寫的模式涵蓋了直譯器、工作目錄內的指令碼,或作用於該目錄中檔案的工具(就像 `docker compose` 作用於其 compose 檔案一樣),Claude 就可以寫入該檔案,然後在沙箱外執行它。較窄的模式會讓 Claude 能在沙箱外執行的內容更少。
354</Warning>
248 355
249<h3 id="disable-filesystem-isolation">356<h3 id="disable-filesystem-isolation">
250 停用檔案系統隔離357 停用檔案系統隔離
251</h3>358</h3>
252 359
253將 `sandbox.filesystem.disabled` 設定為 `true` 以跳過檔案系統隔離,同時保持網路隔離。下面的範例關閉檔案系統隔離,同時保持網路網域的允許清單:360將 `sandbox.filesystem.disabled` 設為 `true`,即可略過檔案系統隔離,同時保留網路隔離。以下範例關閉檔案系統隔離,同時保留網路網域的允許清單:
254 361
255```json theme={null}362```json theme={null}
256{363{
266}373}
267```374```
268 375
269沙箱有兩個獨立的層:[檔案系統隔離](#filesystem-isolation)控制沙箱化命令可以讀取和寫入的路徑,[網路隔離](#network-isolation)控制它們可以到達的網域。關閉檔案系統層後,沙箱化命令可以不受限制地讀取和寫入主機檔案系統,同時其網路出口仍限制在您允許的網域。當您沙箱化以控制命令連接的位置而不是它們寫入的內容時,請關閉該層。376沙箱有兩個獨立的層:[檔案系統隔離](#filesystem-isolation)控制沙箱化命令可以讀取和寫入哪些路徑,[網路隔離](#network-isolation)控制它們可以連線到哪些網域。關閉檔案系統層後,沙箱化命令會取得對主機檔案系統不受限制的讀取和寫入存取權,而其網路輸出流量仍限制在您允許的網域內。當您使用沙箱是為了控制命令連線至何處,而非它們寫入什麼內容時,請關閉此層。
270 377
271該設定預設為關閉,並適用於沙箱執行的平台:macOS、Linux 和 WSL2。需要 Claude Code v2.1.216 或更新版本。378`sandbox.filesystem.disabled` 預設為 `false`。需要 Claude Code v2.1.216 或更新版本。
272 379
273<Warning>380<Warning>
274 關閉檔案系統隔離且命令自動允許時,沙箱化命令可以寫入稍後命令執行或讀取的檔案,例如 shell 啟動檔案、`$PATH` 上的可執行檔或 `~/.claude/settings.json`,並使用它們在下一次執行時擴大自己的存取權限。只有在您信任工作負載不會擴大自己的存取權限時,才將 `filesystem.disabled` 設定為 `true`。使用 [`allowManagedDomainsOnly`](#keep-developers-from-widening-the-policy) 鎖定網路網域會縮小風險,但不會消除風險,因為該鎖定僅適用於在沙箱內執行的命令。381 在關閉檔案系統隔離且命令自動允許的情況下,沙箱化命令可以寫入之後的命令會執行或讀取的檔案,例如 shell 啟動檔案、`$PATH` 上的可執行檔或 `~/.claude/settings.json`,並利用它們在下次執行時擴大自身的存取權。請僅針對您信任不會自行提升存取權的工作負載,將 `filesystem.disabled` 設為 `true`。使用 [`allowManagedDomainsOnly`](#keep-developers-from-widening-the-policy) 鎖定網路網域可降低風險,但無法消除風險,因為該鎖定僅適用於在沙箱內執行的命令。
275</Warning>382</Warning>
276 383
277<h4 id="which-settings-can-disable-it">384<h4 id="which-settings-can-disable-it">
278 哪些設定可以停用它385 哪些設定可以停用它
279</h4>386</h4>
280 387
281因為關閉檔案系統隔離會擴大沙箱化命令可以執行的操作,Claude Code 只從這些設定來源接受 `filesystem.disabled`:388由於關閉檔案系統隔離會擴大沙箱化命令能做的事,Claude Code 僅接受來自以下設定來源的 `filesystem.disabled`:
282 389
283* 使用者設定、受管設定和 `--settings` CLI 旗標可以設定它。`.claude/settings.json` 和 `.claude/settings.local.json` 中的專案設定不能,因此簽出的專案無法關閉檔案系統隔離。390* 使用者設定、受管設定和 `--settings` CLI 旗標可以設定它。`.claude/settings.json` 和 `.claude/settings.local.json` 中的專案設定則不行,因此簽出的專案無法關閉檔案系統隔離。
284* 當受管設定設定 `sandbox.filesystem` 時,或列出任何 `sandbox.credentials.files` 項目且 `"mode": "deny"` 時,只有受管設定可以設定該金鑰。這會保持管理員部署的檔案系統限制有效;若要放寬此類部署,請在受管設定中設定 `"disabled": true`。391* 當受管設定有設定任何 `sandbox.filesystem`,或列出任何 `"mode": "deny"` 的 `sandbox.credentials.files` 項目時,只有受管設定可以設定此鍵。這可確保管理員部署的檔案系統限制持續生效;若要放寬此類部署,請在受管設定中設定 `"disabled": true`。
285* 當設定 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-TW/env-vars) 時,Claude Code 會忽略來自每個來源(包括受管設定)的 `filesystem.disabled`,並保持檔案系統隔離開啟。392* 當設定了 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-TW/env-vars) 時,Claude Code 會忽略來自所有來源(包括受管設定)的 `filesystem.disabled`,並保持檔案系統隔離開啟。
286 393
287受管 `credentials.files` 項目是否固定 `filesystem.disabled`(將金鑰鎖定到受管設定,使開發人員無法關閉檔案系統隔離)取決於項目的 `mode` 以及沙箱啟動時項目發生的情況:394[有效的](/docs/zh-TW/settings-reference#invalid-credential-entries-in-managed-settings) `mask` 項目不會鎖定此鍵,即使 Claude Code 在啟動時對其[退回 `deny`](#mask-credential-files) 也是如此。請將無法遮罩的路徑(例如憑證目錄)在受管設定中列為明確的 `deny` 項目,這樣會鎖定此鍵。
288
289| 受管項目 | 固定 `filesystem.disabled` | 隔離關閉時保護檔案的內容 |
290| - | - | - |
291| `"mode": "deny"` | 是 | 無:讀取區塊是檔案系統層的一部分 |
292| `"mode": "mask"`,應用為遮罩 | 否 | 遮罩本身:Linux 和 WSL2 上的[哨兵複本和代理](#mask-credential-files),macOS 上沙箱自己的讀取規則 |
293| `"mode": "mask"`,[在設定時回退到 `deny`](#mask-credential-files) | 否 | 無,與 `deny` 相同。將無法遮罩的路徑(例如目錄)列為明確的 `deny` 項目,這會固定該金鑰 |
294| `"mode": "mask"`,[由驗證降級為 `deny`](/docs/zh-TW/managed-settings#invalid-entries-in-managed-settings) | 是,如同明確的 `deny` | 無,與 `deny` 相同 |
295
296回退發生在沙箱啟動時,在 Claude Code 已讀取設定之後,針對該回退執行的固定檢查,因此回退項目永遠不會固定。驗證在設定載入時將無效項目重寫為 `deny`,因此降級項目的固定方式與您寫成 `deny` 的項目相同。
297 395
298<h4 id="what-changes-when-filesystem-isolation-is-off">396<h4 id="what-changes-when-filesystem-isolation-is-off">
299 檔案系統隔離關閉時的變更397 關閉檔案系統隔離時的變化
300</h4>398</h4>
301 399
302設定 `filesystem.disabled` 會解除檔案系統層本身強制執行的保護。其他層強制執行的保護會繼續適用:400設定 `filesystem.disabled` 會解除檔案系統層本身強制執行的保護。其他層強制執行的保護則持續適用:
303 401
304| 保護 | 檔案系統隔離關閉時 |402| 保護 | 關閉檔案系統隔離時 |
305| - | - |403| - | - |
306| `filesystem.denyRead` 和 [`credentials.files`](#protect-credentials) `deny` 讀取區塊 | 未強制執行。檔案系統層適用兩者 |404| `filesystem.denyRead` 和 [`credentials.files`](#protect-credentials) `deny` 讀取封鎖 | 不強制執行。兩者皆由檔案系統層套用 |
307| `credentials.envVars` `deny` 和 `mask` 項目 | 強制執行。環境變數清理獨立於檔案系統層 |405| `credentials.envVars` `deny` 和 `mask` 項目 | 強制執行。環境變數清除獨立於檔案系統層 |
308| [`credentials.files` `mask` 項目](#mask-credential-files)應用為遮罩 | 強制執行:遮罩獨立於檔案系統層。[回退到 `deny`](#mask-credential-files) 的項目未強制執行,如同任何 `deny` 項目 |406| 以遮罩方式套用的 [`credentials.files` `mask` 項目](#mask-credential-files) | 強制執行:遮罩獨立於檔案系統層。[退回 `deny`](#mask-credential-files) 的項目則不強制執行,與任何 `deny` 項目相同 |
309 407
310另外兩件事會改變:408另有兩項變化:
311 409
312* 沙箱化命令繼承您 shell 的 `$TMPDIR`,而不是每個使用者的暫存目錄,因為每個暫存目錄都是可寫的,Claude Code 不再將命令重新導向到每個使用者的暫存目錄。410* 沙箱化命令會繼承您 shell 的 `$TMPDIR`,而非每位使用者專屬的暫存目錄,因為每個暫存目錄都可寫入,Claude Code 不再將命令重新導向至每位使用者專屬的暫存目錄。
313 411
314 在 Linux 上,該變數在父 shell 中通常未設定。Bash 工具指導告訴 Claude 使用 `mktemp -d` 建立暫存目錄,而不是依賴 `$TMPDIR`。412 在 Linux 上,此變數在父 shell 中通常未設定。Bash 工具指引會告知 Claude 使用 `mktemp -d` 建立暫用目錄,而不是依賴 `$TMPDIR`。
315* [`autoAllowBashIfSandboxed`](/docs/zh-TW/settings-reference#sandbox-autoallowbashifsandboxed) 仍預設為 `true`,因此沙箱化命令繼續執行而不會出現提示。將其設定為 `false` 以提示沙箱化命令。413* [`autoAllowBashIfSandboxed`](/docs/zh-TW/settings-reference#sandbox-autoallowbashifsandboxed) 仍預設為 `true`,因此沙箱化命令會持續在不顯示提示的情況下執行。將其設為 `false` 即可針對沙箱化命令顯示提示。
316 414
317<h3 id="protect-credentials">415<h3 id="protect-credentials">
318 保護認證416 保護憑證
319</h3>417</h3>
320 418
321`sandbox.credentials` 設定宣告要從沙箱化命令保護的認證檔案和環境變數。每個項目命名一個檔案路徑或環境變數以及一個 `mode`。專用的 `credentials` 區塊將認證規則分組在一起,並與一般檔案系統規則分開。419`sandbox.credentials` 設定宣告要保護、使其不受沙箱化命令存取的憑證檔案和環境變數。每個項目指定一個檔案路徑或環境變數,以及一個 `mode`。專用的 `credentials` 區塊讓憑證規則集中在一起,並與一般檔案系統規則分開。
322 420
323對於 `"mode": "deny"` 的項目,檔案路徑在沙箱內被拒絕讀取,與 `filesystem.denyRead` 適用的限制相同,環境變數在每個沙箱化命令執行前被取消設定。檔案保護是檔案系統層的一部分,因此如果您[停用檔案系統隔離](#disable-filesystem-isolation),它不適用;環境變數保護仍然適用。421對於 `"mode": "deny"` 的項目,檔案路徑在沙箱內會被拒絕讀取,這與 `filesystem.denyRead` 套用的限制相同;環境變數則會在每個沙箱化命令執行前取消設定。檔案保護屬於檔案系統層,因此如果您[停用檔案系統隔離](#disable-filesystem-isolation),檔案保護便不適用;環境變數保護則仍然適用。
324 422
325下面的範例會阻止讀取 AWS 認證檔案和 SSH 目錄,並從沙箱化命令的環境中移除 `GITHUB_TOKEN` 和 `NPM_TOKEN`:423以下範例封鎖讀取 AWS 憑證檔案和 SSH 目錄,並從沙箱化命令的環境中移除 `GITHUB_TOKEN` 和 `NPM_TOKEN`:
326 424
327```json theme={null}425```json theme={null}
328{426{
342}440}
343```441```
344 442
345環境變數項目和檔案項目也接受 `"mode": "mask"`,在[遮罩認證](#mask-credentials)下描述。443環境變數項目和檔案項目也接受 `"mode": "mask"`,詳見[遮罩憑證](#mask-credentials)。
346 444
347檔案路徑遵循與 `sandbox.filesystem.*` 設定相同的[前綴規則](/docs/zh-TW/settings-reference#sandbox-path-prefixes)。445檔案路徑遵循與 `sandbox.filesystem.*` 設定相同的[前綴規則](/docs/zh-TW/settings-reference#sandbox-path-prefixes)。
348 446
349Claude Code 合併來自工作階段載入的每個[設定範圍](/docs/zh-TW/settings#settings-precedence)的 `deny` 項目。`deny` 項目只會縮小存取,因此任何範圍都可以新增一個,但沒有範圍可以移除另一個範圍新增的項目。447Claude Code 會合併工作階段載入的每個[設定範圍](/docs/zh-TW/settings#settings-precedence)中的 `deny` 項目。`deny` 項目只會縮小存取範圍,因此任何範圍都可以新增,但沒有任何範圍可以移除其他範圍新增的項目。
350 448
351當您[排除設定來源](#configure-sandboxing)時:449當您[排除某個設定來源](#configure-sandboxing)時:
352 450
353* **專案或本機設定**:Claude Code 不適用其任何 `credentials` 項目。需要 Claude Code v2.1.246 或更新版本。451* **專案或本機設定**:Claude Code 不會套用其任何 `credentials` 項目。需要 Claude Code v2.1.246 或更新版本。
354* **使用者設定**:Claude Code 仍然適用 `~/.claude/settings.json` 中的 `deny` 項目,並將其[檔案 `mask` 項目](#mask-credential-files)保持為限制,但會捨棄其[環境變數 `mask` 項目](#mask-environment-variables)。452* **使用者設定**:Claude Code 仍會套用 `~/.claude/settings.json` 中的 `deny` 項目,並將其[檔案 `mask` 項目](#mask-credential-files)保留為限制,但這些項目不再授權代理伺服器替換真實值;同時會捨棄其[環境變數 `mask` 項目](#mask-environment-variables)。
355 453
356沒有內建的認證拒絕清單,因此只有您列出的檔案和變數受到限制。454沒有內建的憑證拒絕清單,因此只有您列出的檔案和變數會受到限制。
357 455
358`sandbox.credentials` 僅影響沙箱化 Bash 命令。若要從所有子程序中去除認證,無論沙箱化如何,請設定 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-TW/env-vars)。456`sandbox.credentials` 僅影響沙箱化的 Bash 命令。若要無論是否使用沙箱都從所有子程序中移除憑證,請設定 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-TW/env-vars)。
359 457
360<h3 id="mask-credentials">458<h3 id="mask-credentials">
361 遮罩認證459 遮罩憑證
362</h3>460</h3>
363 461
364遮罩比[保護認證](#protect-credentials)下的 `deny` 項目更進一步。Claude Code 不會阻止認證,而是向沙箱化命令顯示預留位置(哨兵),[沙箱代理](#network-isolation)會在對您允許的主機的出站請求上交換真實值。對於檔案,替換是 Linux 和 WSL2 行為;[macOS 改為阻止檔案](#mask-credential-files)。462當您遮罩憑證時,Claude Code 會向沙箱化命令顯示一個每個工作階段專屬的預留位置,稱為哨兵值,而[沙箱代理伺服器](#network-isolation)會在傳送至您允許之主機的外送請求中換入真實值。[保護憑證](#protect-credentials)中的 `deny` 項目則會改為封鎖憑證。對於 macOS 上的檔案,Claude Code 會[改為封鎖該檔案](#mask-credential-files),而非加以遮罩。
365
366<h4 id="mask-environment-variables">
367 遮罩環境變數
368</h4>
369
370`"mode": "mask"` 保護認證,同時保持使用它進行驗證的工具正常工作。`deny` 完全移除變數,這也會破壞需要它的工具,例如 `gh` 或 `npm`。需要 Claude Code v2.1.199 或更新版本。
371 463
372使用 `mask`,沙箱化命令會看到每個工作階段的哨兵值,而不是真實值。每個 `mask` 項目可以列出 `injectHosts`,允許真實值到達的主機。當請求離開沙箱前往其中一個時,[沙箱代理](#network-isolation)會用真實值取代哨兵。命令和它記錄的任何內容都不會保持真實認證,但其請求仍然進行驗證。464遮罩環境變數需要 Claude Code v2.1.199 或更新版本。[`sandbox.credentials`](/docs/zh-TW/settings-reference#sandbox-credentials) 參考列出了每個欄位。
373 465
374代理在請求內容中替換認證,因此它必須看到它們。設定 [`network.tlsTerminate`](/docs/zh-TW/settings-reference#sandbox-network-tlsterminate) 使代理自己終止 TLS。466遮罩需要以下條件:
375 467
376沒有它,遮罩會失敗而不暴露任何內容:命令仍然只看到哨兵,但哨兵未變更地到達伺服器,驗證失敗。Claude Code 在啟動時報告此誤設定。468* **TLS 終止**:代理伺服器會在請求內容中替換真實值,因此必須能看到請求內容。請設定 [`network.tlsTerminate`](/docs/zh-TW/settings-reference#sandbox-network-tlsterminate),讓代理伺服器自行終止 TLS。若未設定,遮罩會失敗但不會洩漏任何內容:命令仍只看到哨兵值,但哨兵值會原封不動地送達伺服器,導致身分驗證失敗。Claude Code 會在啟動時回報此設定錯誤。
469* **允許的目的地**:每個 `mask` 項目可以列出 `injectHosts`,即允許真實值送達的主機。代理伺服器只會在[網域允許清單](#network-isolation)允許的連線上注入,因此每個 `injectHosts` 主機也必須能透過 `network.allowedDomains` 連線到。對於沒有 `injectHosts` 的 `mask` 項目,代理伺服器會在傳送至 `network.allowedDomains` 中每個主機的請求中替換真實值。
470* **受信任的設定範圍**:遮罩會授權代理伺服器將您的真實憑證傳送至某處,因此 Claude Code 只接受來自使用者設定、受管設定和 `--settings` 旗標的 `mask` 項目、`network.tlsTerminate`、[`credentials.allowPlaintextInject`](/docs/zh-TW/settings-reference#sandbox-credentials-allowplaintextinject)、`awsPairs` 和 `sigv4`。它會忽略儲存庫的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的這些設定。當您的管理員透過伺服器管理的設定提供 `mask` 項目、`network.tlsTerminate` 或 `credentials.allowPlaintextInject` 時,這些會被視為[需要核准的設定](/docs/zh-TW/server-managed-settings#security-approval-dialogs)。
377 471
378替換涵蓋標頭和請求主體。使用從認證衍生的簽名而不是認證本身進行驗證的請求需要在代理處重新簽名;[重新簽名 AWS 請求](#re-sign-aws-requests)涵蓋 AWS 如何工作。472<h4 id="mask-environment-variables">
473 遮罩環境變數
474</h4>
379 475
380代理僅在[網域允許清單](#network-isolation)允許的連接上注入,因此每個 `injectHosts` 目的地也必須可透過 `network.allowedDomains` 到達。476若要遮罩環境變數,請在其 `credentials.envVars` 項目上設定 `"mode": "mask"`。命令及其記錄的任何日誌永遠不會持有真實憑證,但其請求仍能通過身分驗證。當同一個變數在任何範圍中以 `deny` 列出時,`deny` 優先。
381 477
382下面的範例遮罩兩個令牌。`GH_TOKEN` 僅在對 `api.github.com` 的請求上替換,而 `NPM_TOKEN` 沒有 `injectHosts`,在對 `network.allowedDomains` 中每個主機的請求上替換。478以下範例遮罩兩個 token。`GH_TOKEN` 只會在傳送至 `api.github.com` 的請求中替換,而 `NPM_TOKEN` 沒有 `injectHosts`,因此會在傳送至 `network.allowedDomains` 中每個主機的請求中替換:
383 479
384```json theme={null}480```json theme={null}
385{481{
399}495}
400```496```
401 497
402<span id="ipv6-destinations-in-injecthosts" />在兩個清單中以不同方式拼寫 IPv6 目的地,因為每個清單都有自己的匹配器:498遮罩預設會取代整個值。對於具有結構的值,例如 `DATABASE_URL` 連線字串或 JWT,請使用 [`extract`、`decode`、`maskClaims` 和 `onExtractNoMatch` 欄位](/docs/zh-TW/settings-reference#sandbox-credentials-envvars),讓剖析該值的工具持續運作。
403
404* **`network.allowedDomains`**:[括號形式網域清單使用](#ipv6-addresses-in-domain-lists),例如 `"[::1]"`。代理檢查此清單以允許連接。
405* **`injectHosts`**:其規範壓縮形式中的裸地址,例如 `"::1"` 或 `"2001:db8::1"`。代理將每個項目與連接的裸目的地地址進行比對,忽略連接埠,因此括號、區域 ID 或不同壓縮拼寫永遠不會比對,代理永遠不會在那裡注入認證。
406
407`claude doctor` 標記無法與警告 `Sandbox credential injectHosts entries can never match their destination` 比對的 `injectHosts` 項目。此檢查需要 Claude Code v2.1.229 或更新版本。
408
409與 `deny` 不同,遮罩授權代理將您的真實認證傳送到列出的主機,因此 Claude Code 只從您或您的管理員控制的設定中接受它:使用者設定、受管設定和 `--settings` CLI 旗標。Claude Code 忽略存放庫的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的 `mask` 項目。在這些檔案中,它也忽略 `network.tlsTerminate` 和 [`credentials.allowPlaintextInject`](/docs/zh-TW/settings-reference#sandbox-credentials-allowplaintextinject),允許代理將認證注入未加密請求的設定。如果您[排除使用者設定](#configure-sandboxing),Claude Code 也會捨棄 `~/.claude/settings.json` 中的環境變數 `mask` 項目。
410
411當您的管理員透過伺服器受管設定傳遞 `mask` 項目、`network.tlsTerminate` 或 `credentials.allowPlaintextInject` 時,它們計為[需要核准的設定](/docs/zh-TW/server-managed-settings#security-approval-dialogs)。
412
413當相同變數在任何範圍中以 `deny` 列出時,`deny` 優先。
414 499
415遮罩預設會取代變數的整個值,適合裸令牌。可選項目欄位(需要 Claude Code v2.1.224 或更新版本)處理具有結構的值:500<span id="ipv6-destinations-in-injecthosts" />對於 IPv6 目的地,請在兩個清單中以不同方式書寫位址:
416 501
417* `extract`:Claude Code 在整個值上應用的正規表達式,僅取代每個比對的第 1 組捕獲的文字,因此解析值的工具(例如 `DATABASE_URL` 連接字串)在沙箱內仍然有效。模式必須包含至少一個捕獲群組。502* **`network.allowedDomains`**:方括號形式,例如 `"[::1]"`
418* `onExtractNoMatch` 控制模式不比對任何內容時發生的情況:503* **`injectHosts`**:標準壓縮形式的純位址,例如 `"::1"`
419 * `warn`(預設)警告並不遮罩地傳遞變數
420 * `deny` 在沙箱內取消設定變數
421 * `error` 停止沙箱設定,直到您修正設定
422* `decode: "jwt"`:用於保持 JSON Web Token (JWT) 的變數。Claude Code 驗證值是 JWT 並用結構上有效的假令牌取代它,因此沙箱內解碼令牌的程式碼繼續工作。新增 `maskClaims` 以列出要個別遮罩的頂層承載宣告,而不是取代整個令牌;其他宣告保持可讀。當值未驗證為 JWT 或沒有列出的宣告比對時,Claude Code 會以警告不遮罩地傳遞變數。`decode` 無法與 `extract` 結合。
423 504
424請參閱[設定參考中的 `credentials.envVars[]` 列](/docs/zh-TW/settings-reference#sandbox-settings)以取得完整欄位清單。505代理伺服器會將每個 `injectHosts` 項目與連線的純目的地位址進行比對,並忽略連接埠,因此帶方括號、帶區域 ID 或以不同方式壓縮的寫法永遠不會相符。`claude doctor` 會以警告 `Sandbox credential injectHosts entries can never match their destination` 標示永遠無法相符的項目。此檢查需要 Claude Code v2.1.229 或更新版本。
425 506
426<h4 id="re-sign-aws-requests">507<h4 id="re-sign-aws-requests">
427 重新簽名 AWS 請求508 重新簽署 AWS 請求
428</h4>509</h4>
429 510
430AWS 請求在請求內容上攜帶 SigV4 簽名,因此一起遮罩 `AWS_ACCESS_KEY_ID` 和 `AWS_SECRET_ACCESS_KEY`。代理透過存取金鑰的哨兵偵測 SigV4 請求,並在替換真實值後重新簽名。僅遮罩祕密會使請求以預留位置簽名,代理無法偵測,因此它們在 AWS 處失敗;Claude Code 在啟動時警告此情況,但不會在僅遮罩存取金鑰 ID 時警告。代理無法重新簽名的偵測到的請求(例如缺少其 `x-amz-date` 標頭的請求)會因代理錯誤而失敗,而不是到達伺服器且簽名損壞。511AWS 請求帶有針對請求內容的 SigV4 簽章,因此請同時遮罩 `AWS_ACCESS_KEY_ID` 和 `AWS_SECRET_ACCESS_KEY`。代理伺服器會透過存取金鑰的[哨兵值](#mask-credentials)偵測 SigV4 請求,並以真實值重新簽署請求,此功能需要 Claude Code v2.1.221 或更新版本。如果您只遮罩密鑰,請求會以代理伺服器無法偵測的預留位置簽署,因此會在 AWS 端失敗。
431 512
432當您遮罩其整個值時,Claude Code 會自動將常規 `AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY` 和 `AWS_SESSION_TOKEN` 變數連結到一個認證。如果您的 AWS 認證位於具有其他名稱的變數中,請使用 [`credentials.awsPairs`](/docs/zh-TW/settings-reference#sandbox-credentials-awspairs) 自行分組,需要 Claude Code v2.1.224 或更新版本。此範例將配對新增到已遮罩 `MY_KEY_ID`、`MY_SECRET_KEY` 和 `MY_SESSION_TOKEN` 整個值的設定,如上面的[遮罩設定](#mask-environment-variables):513當您遮罩慣用的 `AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY` 和 `AWS_SESSION_TOKEN` 變數的完整值時,Claude Code 會自動將它們連結為單一憑證。如果您的 AWS 憑證存放在其他名稱的變數中,請使用 [`credentials.awsPairs`](/docs/zh-TW/settings-reference#sandbox-credentials-awspairs) 將它們分組,此功能需要 Claude Code v2.1.224 或更新版本。
433 514
434```json theme={null}515串流上傳、預先簽署的 URL 和 SigV4A 請求帶有代理伺服器無法重新計算的簽章。當此類請求以已遮罩配對的預留位置簽署時,代理伺服器會讓它失敗,而不是轉送損壞的簽章。以未遮罩憑證簽署的請求不受影響。使用 [`credentials.sigv4`](/docs/zh-TW/settings-reference#sandbox-credentials-sigv4)(需要 Claude Code v2.1.224 或更新版本)可改為轉送這些請求形式之一。AWS 仍會拒絕該請求,因此呼叫的工具會收到 AWS 本身的拒絕回應,而非代理伺服器錯誤。
435{
436 "sandbox": {
437 "credentials": {
438 "awsPairs": [
439 {
440 "accessKeyIdVar": "MY_KEY_ID",
441 "secretAccessKeyVar": "MY_SECRET_KEY",
442 "sessionTokenVar": "MY_SESSION_TOKEN"
443 }
444 ]
445 }
446 }
447}
448```
449
450每個項目遵循這些規則:
451
452* `accessKeyIdVar` 和 `secretAccessKeyVar` 命名保持存取金鑰 ID 和祕密金鑰的遮罩 `envVars` 項目。可選的 `sessionTokenVar` 命名保持臨時認證工作階段令牌的項目;設定時,代理在重新簽名的請求上傳送真實令牌作為 `x-amz-security-token`。
453* 每個命名變數必須是遮罩其整個值的 `mask` 項目,沒有 `extract` 或 `decode`。
454* 代理在存取金鑰 ID 項目的 `injectHosts` 中列出的主機上重新簽名請求。
455* 在配對中命名任何常規變數會取代自動配對。
456
457如同 `mask` 項目,`awsPairs` 只從使用者設定、受管設定和 `--settings` CLI 旗標接受。
458
459三種 AWS 請求形式攜帶代理無法重新計算的簽名。當此類請求以遮罩配對的預留位置簽名時,代理會失敗它,而不是轉發損壞的簽名;使用未遮罩認證簽名的請求永遠不會受影響。[`credentials.sigv4`](/docs/zh-TW/settings-reference#sandbox-credentials-sigv4) 設定(需要 Claude Code v2.1.224 或更新版本)放寬每種形式:將形式的金鑰設定為 `passthrough` 會轉發具有其預留位置衍生簽名的請求,因此呼叫工具會收到 AWS 自己的拒絕回應,而不是代理錯誤。如同 `awsPairs`,`sigv4` 只從使用者設定、受管設定和 `--settings` CLI 旗標接受。
460
461| 請求形式 | `sigv4` 金鑰 | 代理無法重新簽名的原因 |
462| :- | :- | :- |
463| aws-chunked 串流上傳 | `streaming` | 每個區塊簽名鏈接到種子簽名,因此重新簽名需要重寫主體 |
464| 預簽名 URL | `presigned` | 簽名位於 URL 本身,沒有 `Authorization` 標頭 |
465| SigV4A 非對稱簽名 | `sigv4a` | 沒有共用金鑰 HMAC 可重新計算 |
466 516
467<h4 id="mask-credential-files">517<h4 id="mask-credential-files">
468 遮罩認證檔案518 遮罩憑證檔案
469</h4>519</h4>
470 520
471檔案項目也接受 `"mode": "mask"`,需要 Claude Code v2.1.221 或更新版本。沙箱化命令看到的內容取決於平台:521若要遮罩憑證檔案,請在其 `credentials.files` 項目上設定 `"mode": "mask"`。遮罩檔案需要 Claude Code v2.1.221 或更新版本。沙箱化命令看到的內容取決於平台:
472
473* **Linux 和 WSL2**:沙箱化命令讀取檔案的哨兵複本,一個替代品,其祕密被取代為預留位置值,[沙箱代理](#network-isolation)在出口上替換真實值。
474* **macOS**:沙箱化命令無法讀取列出的檔案。Claude Code 不建立哨兵複本,不在出口上替換任何內容,因此使用檔案進行驗證的工具在沙箱內不工作,與 `deny` 相同效果。與 `deny` 項目不同,讀取區塊即使在您[停用檔案系統隔離](#disable-filesystem-isolation)時也保持。
475 522
476在每個平台上,Claude Code 以與[遮罩環境變數](#mask-environment-variables)相同的方式應用 [`network.tlsTerminate`](/docs/zh-TW/settings-reference#sandbox-network-tlsterminate) 要求和 `injectHosts`,並以相同方式忽略存放庫設定。如果您[排除使用者設定](#configure-sandboxing),Claude Code 將 `~/.claude/settings.json` 中的檔案 `mask` 項目保持為限制,但項目不再授權代理替換真實值。523* **Linux 和 WSL2**:沙箱化命令讀取的是檔案的[哨兵值](#mask-credentials)副本,而代理伺服器會在外送請求中替換真實值。
524* **macOS**:沙箱化命令完全無法讀取該檔案。Claude Code 不會建置哨兵副本,因此使用該檔案進行身分驗證的工具無法在沙箱內運作,效果與 `deny` 相同。即使您[停用檔案系統隔離](#disable-filesystem-isolation),讀取封鎖仍然有效。
477 525
478下面的範例遮罩儲存在 `~/.config/gh/hosts.yml` 中的 GitHub 令牌;`extract` 模式(下面涵蓋)告訴 Claude Code 檔案的哪個部分是祕密。在 Linux 和 WSL2 上,讀取檔案的沙箱化命令會取得令牌位置的哨兵,代理在對 `api.github.com` 的請求上替換真實令牌:526以下範例遮罩存放在 `~/.config/gh/hosts.yml` 中的 GitHub token。`extract` 模式會標示檔案的哪個部分是密鑰,因此在 Linux 和 WSL2 上,`gh` 仍能剖析其設定的其餘部分:
479 527
480```json theme={null}528```json theme={null}
481{529{
499}547}
500```548```
501 549
502若要確認遮罩有效,請要求 Claude 在沙箱化命令中執行 `cat ~/.config/gh/hosts.yml`:在 Linux 和 WSL2 上,輸出在令牌位置顯示哨兵值,在 macOS 上,讀取改為失敗。550若要確認遮罩已生效,請要求 Claude 在沙箱化命令中執行 `cat ~/.config/gh/hosts.yml`。在 Linux 和 WSL2 上,輸出會顯示哨兵值來取代 token;在 macOS 上,讀取則會失敗。
503
504在 Linux 和 WSL2 上,`extract` 模式是保持 `hosts.yml` 其餘部分可讀的內容。Claude Code 在整個檔案上應用正規表達式,僅取代每個比對的第 1 組捕獲的文字,因此 `gh` 仍然解析其設定,只有令牌是預留位置。對任何工具解析的結構化檔案(例如 `.netrc`、JSON 或 YAML)使用 `extract`;模式必須包含至少一個捕獲群組。沒有 `extract`,Claude Code 會用一個哨兵值取代整個檔案內容,適合保持單個裸祕密且沒有其他內容的檔案。
505
506對於保持 JSON Web Token (JWT) 的檔案,設定 `decode: "jwt"` 而不是或與 `extract` 一起。`decode` 需要 Claude Code v2.1.224 或更新版本。Claude Code 使用內建模式或您的 `extract` 模式(設定時)找到 JWT 候選項,驗證每個候選項是 JWT,並用結構上有效的假令牌取代它,因此在沙箱內解碼令牌的程式碼繼續工作。新增 `maskClaims` 以僅遮罩每個驗證令牌內的命名頂層承載宣告,並保持其他宣告可讀。當沒有候選項驗證或沒有命名宣告比對時,下面的 `onExtractNoMatch` 欄位控制結果,就像模式不比對任何內容時一樣。
507 551
508兩個可選欄位精化比對行為。兩者僅在 `mode` 是 `mask` 且 `extract` 或 `decode` 設定時適用。在 macOS 上,當檔案系統隔離開啟時,Claude Code 在模式執行前將 `mask` 項目應用為 `deny`,因此這些欄位和下面的不比對結果僅在[檔案系統隔離關閉](#disable-filesystem-isolation)時在那裡生效:552若未使用 `extract` 或 `decode`,Claude Code 會以單一哨兵值取代整個檔案,這適用於只存放單一純密鑰的檔案。請使用 [`extract`、`decode`、`maskClaims`、`onExtractNoMatch` 和 `maskDuplicates` 欄位](/docs/zh-TW/settings-reference#sandbox-credentials-files)來控制部分遮罩,以及模式未相符任何內容時的行為。
509 553
510* `onExtractNoMatch` 控制比對在檔案中找不到要遮罩的內容時發生的情況:554<Warning>
511 555 當比對找不到任何可遮罩的內容時,預設的 `onExtractNoMatch` 值 `warn` 會略過該項目,因此沙箱化命令可以讀取未遮罩的真實檔案。在 macOS 上,只要檔案系統隔離開啟,Claude Code 就會在模式執行前將 `mask` 項目以 `deny` 套用,因此無相符結果只有在[檔案系統隔離關閉](#disable-filesystem-isolation)時才會在 macOS 上生效。預設值適用於可能合理不存在的憑證。如果密鑰可能存在但模式可能遺漏它,請使用 [`deny`](/docs/zh-TW/settings-reference#mask-fields-for-files)。
512 * `warn`(預設)警告並跳過項目,因此沙箱化命令可以不遮罩地讀取真實檔案。預設適合認證可能合法不存在的情況;如果祕密可能存在但模式可能遺漏它,請使用 `deny`556</Warning>
513 * `deny` 改為使檔案不可讀
514 * `error` 停止沙箱設定,直到您修正設定
515
516 Claude Code 將 `deny` 視為 `error`,無論何時讀取區塊不會強制執行:當您[停用檔案系統隔離](#disable-filesystem-isolation)時,以及當來自任何設定來源的 `filesystem.allowRead` 項目重新開啟檔案的路徑時。
517* `maskDuplicates` 也取代每個遮罩認證值的逐字複本,在比對跨度外找到的 `extract` 捕獲或 `decode` 驗證令牌,用於在比對無法到達的地方重複的祕密。它比對原始子字串,因此短或常見值會被取代到處出現;為長、高熵祕密保留它。預設:false。
518 557
519`mask` 適用於單個檔案,因此個別列出每個認證檔案。Claude Code 回退到 `deny` 用於無法安全遮罩的 `mask` 項目:目錄路徑、glob 模式、大於 8 MiB 的檔案或非 UTF-8 文字檔案。改為將目錄寫成明確的 `deny` 項目;[哪些設定可以停用它](#which-settings-can-disable-it)下的表格涵蓋每種形式是否固定 `filesystem.disabled` 以及它在檔案系統隔離關閉時的行為。558`mask` 適用於單一檔案,因此請個別列出每個憑證檔案。對於無法安全遮罩的 `mask` 項目,Claude Code 會退回 `deny`:目錄路徑、glob 模式、大於 8 MiB 的檔案,或非 UTF-8 文字的檔案。
520 559
521<h2 id="how-sandboxing-works">560<h2 id="how-sandboxing-works">
522 沙箱隔離的運作方式561 沙箱機制的運作方式
523</h2>562</h2>
524 563
525<h3 id="filesystem-isolation">564<h3 id="filesystem-isolation">
526 檔案系統隔離565 檔案系統隔離
527</h3>566</h3>
528 567
529沙箱化的 Bash 工具將檔案系統存取限制在特定目錄:568沙箱化的 Bash 工具會將檔案系統存取限制在特定目錄:
530 569
531* **預設寫入行為**:對目前工作目錄及其子目錄、任何使用 `--add-dir`、`/add-dir` 或 [`permissions.additionalDirectories`](/docs/zh-TW/settings-reference#permissions-additionaldirectories) 新增的目錄,以及 `$TMPDIR` 指向的工作階段暫存目錄具有讀寫存取權限570* **預設寫入行為**:對目前工作目錄及其子目錄、以 `--add-dir`、`/add-dir` 或 [`permissions.additionalDirectories`](/docs/zh-TW/settings-reference#permissions-additionaldirectories) 新增的任何目錄,以及 `$TMPDIR` 所指向的每位使用者暫存目錄,具有讀取和寫入權限
532* **預設讀取行為**:對整個電腦具有讀取存取權限,除了某些被拒絕的目錄。請注意,此預設仍允許讀取認證檔案,例如 `~/.aws/credentials` 和 `~/.ssh/`。使用 [`sandbox.credentials`](#protect-credentials) 來阻止讀取這些檔案並取消設定祕密環境變數,或將路徑新增至 `denyRead`。571* **預設讀取行為**:對整台電腦具有讀取權限,但某些被拒絕的目錄除外。此預設仍允許讀取憑證檔案,因此請[保護憑證](#protect-credentials),避免命令讀取您不希望其讀取的憑證。
533* **讀取阻止**:啟用 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-TW/settings-reference#permissions-blockreadsoutsideworkingdirectories) 時,沙箱化命令也會失去對您主目錄和其他保存使用者檔案的目錄的讀取存取權限,除了 [Sandboxed commands under the block](/docs/zh-TW/settings-reference#sandboxed-commands-under-the-block) 列出的路徑。該部分也說明了此阻止部分何時不適用。572* **讀取封鎖**:開啟 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-TW/settings-reference#permissions-blockreadsoutsideworkingdirectories) 後,沙箱化命令也會失去對您的家目錄及其他存放使用者檔案之目錄的讀取權限,但[封鎖下的沙箱化命令](/docs/zh-TW/settings-reference#sandboxed-commands-under-the-block)所列出的路徑除外。該章節也說明了這部分封鎖何時不適用。
534* **被阻止的存取**:無法修改工作目錄、新增的目錄和工作階段暫存目錄外的檔案,除非有明確的權限,包括 shell 設定檔案(例如 `~/.bashrc`)和 `/bin/` 中的系統二進位檔573* **Git worktree**:當工作目錄是[連結的 git worktree](/docs/zh-TW/worktrees) 時,沙箱也允許寫入主儲存庫共用的 `.git` 目錄,讓 `git commit` 等命令可以更新 refs 和 index。對該目錄內 `hooks/` 和 `config` 的寫入仍會被拒絕。
535* **Git worktrees**:當工作目錄是[連結的 git worktree](/docs/zh-TW/worktrees) 時,沙箱也允許寫入主儲存庫的共用 `.git` 目錄,以便 `git commit` 等命令可以更新參考和索引。對該目錄內的 `hooks/` 和 `config` 的寫入仍被拒絕。
536* **可設定**:透過設定定義自訂允許和拒絕的路徑
537 574
538若要完全跳過檔案系統隔離,同時保持網路隔離,請設定 [`sandbox.filesystem.disabled`](#disable-filesystem-isolation)。575若要完全略過檔案系統隔離,同時保留網路隔離,請設定 [`sandbox.filesystem.disabled`](#disable-filesystem-isolation)。
539 576
540<h3 id="protected-paths">577<h3 id="protected-paths">
541 受保護的路徑578 受保護的路徑
542</h3>579</h3>
543 580
544在沙箱化命令可以寫入的目錄內,沙箱仍然拒絕寫入 Claude Code 載入設定和程式碼的檔案。可以編輯這些檔案的命令可能會授予自己權限,或新增 Claude Code 在沙箱外執行的 hook 或 MCP 伺服器。權限系統有自己的[受保護路徑](/docs/zh-TW/permission-modes#protected-paths),控制 Claude Code 在工具執行前批准的內容;沙箱的清單適用於已在執行的命令。它涵蓋四組路徑:581在沙箱化命令可以寫入的目錄中,沙箱仍會拒絕寫入 Claude Code 載入設定和程式碼的檔案。能夠編輯這些檔案的命令可能會自行授予權限,或新增由 Claude Code 在沙箱外執行的 hook 或 MCP 伺服器。權限系統有其自己的[受保護路徑](/docs/zh-TW/permission-modes#protected-paths),用來控制 Claude Code 在工具執行前核准的內容;沙箱的清單則適用於已在執行中的命令。它涵蓋四組路徑:
545 582
546* **在您的工作目錄及其上方的目錄中**:`.claude` 設定檔案、`.claude/skills`、`.claude/agents`、`.claude/commands` 和 `.claude/hooks` 目錄、`.mcp.json`,以及 Claude Code 自行執行的檔案,例如 `.claude/workflows` 和 `.claude/scheduled_tasks.json`583* **在您的工作目錄及其上層目錄中**:`.claude` 設定檔、`.claude/skills`、`.claude/agents`、`.claude/commands` 和 `.claude/hooks` 目錄、`.mcp.json`,以及 Claude Code 自行執行的檔案,例如 `.claude/workflows` 和 `.claude/scheduled_tasks.json`
547* **僅在您的工作目錄中**:shell 啟動檔案,例如 `.bashrc` 和 `.zshrc`、`.gitconfig`、`.vscode` 和 `.idea` 目錄,以及 `.git` 內的 `hooks` 和 `config`584* **僅在您的工作目錄中**:shell 啟動檔案,例如 `.bashrc` 和 `.zshrc`、`.gitconfig`、`.vscode` 和 `.idea` 目錄,以及 `.git` 內的 `hooks` 和 `config`
548* **會將您的工作目錄轉變為裸 git 儲存庫的檔案**:頂層的 `HEAD`、`objects` 和 `refs`,加上 `HEAD` 旁邊的 `config` 和 `hooks`。即使沒有 `HEAD`,名為 `config` 的檔案也被拒絕。在 Linux 和 WSL2 上,當沙箱化命令執行時,沙箱會刪除出現的頂層 `HEAD` 檔案或 `objects` 或 `refs` 目錄585* **會將您的工作目錄變成 bare git 儲存庫的檔案**:頂層的 `HEAD`、`objects` 和 `refs`,以及當旁邊有 `HEAD` 時,該處既有的 `config` 和 `hooks` 項目。名為 `config` 的檔案即使沒有 `HEAD` 也會被拒絕。在 Linux 和 WSL2 上,沙箱會刪除沙箱化命令執行期間出現的頂層 `HEAD` 檔案或 `objects` 或 `refs` 目錄
549* **在 `~/.claude` 中,或 `CLAUDE_CONFIG_DIR` 指向的目錄中**:其大部分內容,加上 `~/.claude.json` 和 `.credentials.json` 認證存放區586* **在 `~/.claude` 或 `CLAUDE_CONFIG_DIR` 所指向的目錄中**:其大部分內容,加上 `~/.claude.json` 和 `.credentials.json` 憑證儲存區
550 587
551如果在工作階段期間在受保護設定檔案的路徑出現符號連結,沙箱也會拒絕寫入它指向的檔案,從下一個命令開始。588如果在工作階段期間,受保護設定檔的路徑上出現符號連結,沙箱也會從下一個命令開始,拒絕寫入該符號連結所指向的檔案。
552 589
553無法豁免這些路徑之一:涵蓋該路徑的 `allowWrite` 項目或 `Edit` 允許規則不會解除保護。關閉保護的唯一方法是 [`filesystem.disabled`](#disable-filesystem-isolation),它會關閉每個路徑的檔案系統隔離。若要查看為您的機器解析的大部分這些路徑,請執行 `/sandbox` 並開啟 **Config** 標籤,該標籤在 **Denied within allowed** 下列出它們,混合您自己的 `denyWrite` 項目。590無法豁免這些路徑中的任何一個:涵蓋該路徑的 `allowWrite` 項目或 `Edit` 允許規則不會解除保護。關閉保護的唯一方式是 [`filesystem.disabled`](#disable-filesystem-isolation),它會關閉所有路徑的檔案系統隔離。若要查看這些路徑在您電腦上解析後的大部分結果,請執行 `/sandbox` 並開啟 **Config** 分頁,其中會將它們列在 **Denied within allowed** 下,並與您自己的 `denyWrite` 項目混在一起。
554 591
555如果 `git merge` 或 `git checkout` 在這些路徑之一上失敗並出現 `unable to unlink old`,請參閱[疑難排解](#troubleshooting)。592如果 `git merge` 或 `git checkout` 在其中某個路徑上因 `unable to unlink old` 而失敗,請參閱[git 命令因 `unable to unlink old` 而失敗](#a-git-command-fails-with-unable-to-unlink-old)。
556 593
557<h3 id="network-isolation">594<h3 id="network-isolation">
558 網路隔離595 網路隔離
559</h3>596</h3>
560 597
561網路存取透過在沙箱外執行的代理伺服器進行控制:598沙箱化命令沒有直接連到網路的路徑:
599
600* **Linux 和 WSL2**:命令會在一個與您的網路沒有連線的獨立網路命名空間中執行
601* **macOS**:Seatbelt 沙箱框架預設會封鎖除了連到沙箱代理伺服器以外的連線
602
603Claude Code 會在您的電腦上、沙箱之外執行沙箱代理伺服器,並透過 `HTTP_PROXY`、`HTTPS_PROXY`、`ALL_PROXY` 及相關環境變數將命令導向它。代理伺服器會根據您允許和拒絕的網域檢查每個連線的主機名稱。
604
605工具可以連到哪裡,取決於它是否使用代理伺服器:
562 606
563* **網域限制**:Claude Code 預設不預先允許任何網域。命令首次需要新網域時,Claude Code 會提示批准;在[自動模式](/docs/zh-TW/permission-modes#eliminate-prompts-with-auto-mode)中,Claude 改為在命令本身上命名命令需要的主機,根據[每個命令允許的網域](#per-command-allowed-domains-in-auto-mode)。607* **會讀取代理伺服器變數的工具**:`curl`、`npm`、透過 HTTPS 的 `git` 及類似工具,在其主機被允許後即可連線。沒有指定連接埠的 `allowedDomains` 項目會允許該主機上的所有連接埠
564* **批准選擇**:如果您在提示時選擇「是」,Claude Code 會在目前工作階段的其餘時間允許該主機,並且不會再次提示稍後連線到同一主機。如果您選擇「是,以後不要再問」,Claude Code 會將 `WebFetch(domain:...)` 允許規則儲存到您的[本機設定](/docs/zh-TW/permissions#permission-system),以便該主機在未來工作階段中保持允許。608* **會忽略代理伺服器變數的工具**:純 `ssh`、大多數資料庫驅動程式及類似工具無法連線,即使是連到被允許的主機也一樣。請參閱[資料庫用戶端或其他非 HTTP 工具無法連到被允許的主機](#a-database-client-or-other-non-http-tool-fails-to-reach-an-allowed-host)
565* **預先允許的網域**:使用 [`allowedDomains`](/docs/zh-TW/settings-reference#sandbox-network-alloweddomains) 預先允許網域以完全避免提示。Claude Code 也預先允許來自 `WebFetch(domain:...)` 允許規則的網域,如[權限規則](#permission-rules)中所述。609* **任何非 TCP 的流量**:UDP、透過 QUIC 的 HTTP/3,以及 `ping` 等 ICMP 工具都無法離開沙箱
566* **嚴格允許清單**:如果您在使用者、受管理或 CLI `--settings` 設定中將 [`strictAllowlist`](/docs/zh-TW/settings-reference#sandbox-network-strictallowlist) 設定為 `true`,Claude Code 會拒絕沙箱化命令存取允許清單外的任何主機,而不是提示。允許清單與沙箱以其他方式提示的清單相同:`allowedDomains` 加上來自 `WebFetch(domain:...)` 允許規則的網域,或當設定 `allowManagedDomainsOnly` 時僅受管理設定項目。Claude Code 僅對沙箱化命令強制執行此操作;進程內工具(例如 `WebFetch`)仍遵循其[權限規則](#permission-rules)。在儲存庫的 `.claude/settings.json` 或 `.claude/settings.local.json` 中設定它沒有效果。需要 Claude Code v2.1.219 或更新版本。
567* **受管理的鎖定**:如果在受管理設定中設定了 [`allowManagedDomainsOnly`](/docs/zh-TW/settings-reference#sandbox-network-allowmanageddomainsonly),非允許的網域會自動被阻止而不是提示,並且僅受管理設定中的 `allowedDomains` 和 `WebFetch(domain:...)` 允許規則被接受。
568* **公司代理**:當您的網路要求出站流量通過公司代理時,請在設定的 `env` 區塊中設定 `HTTPS_PROXY`、`HTTP_PROXY` 和 `NO_PROXY`,如[代理設定](/docs/zh-TW/network-config#proxy-configuration)所述,以便[背景代理](/docs/zh-TW/network-config#set-network-variables-in-settings-not-the-shell)也能取得它們,或在您啟動 Claude Code 的環境中設定。Claude Code 強制執行網域允許清單,然後透過該上游代理隧道允許的連線。
569* **自訂代理支援**:進階使用者可以在出站流量上實施自訂規則
570* **全面涵蓋**:限制適用於命令產生的所有指令碼、程式和子程序
571 610
572在 `WebFetch(domain:...)` 規則中,沙箱接受兩種萬用字元形式:前導 `*.`(例如 `*.example.com`)和裸 `*`。裸 `*` 形式需要 Claude Code v2.1.186 或更新版本。任何其他位置的萬用字元(例如 `WebFetch(domain:example.*)`)仍會符合擷取但對沙箱化命令沒有效果。611下列設定和行為控制代理伺服器允許哪些主機:
612
613* **網域限制**:您允許的網域一開始是空的。[您允許網域以外的主機](#hosts-outside-your-allowed-domains)說明了命令第一次需要新網域時會發生什麼事。
614* **核准選擇**:如果您在出現提示時選擇 Yes,Claude Code 會在目前工作階段的剩餘時間內允許該主機。如果您選擇「Yes, and don't ask again」,Claude Code 會將 `WebFetch(domain:...)` 允許規則儲存到您的[本機設定](/docs/zh-TW/permissions#permission-system),讓該主機在未來的工作階段中仍被允許。當沙箱為[管理員強制](#repository-settings-under-an-admin-required-sandbox)時,Claude Code 會將規則儲存到您的使用者設定,並套用於每個專案。
615* **預先允許的網域**:使用 [`allowedDomains`](/docs/zh-TW/settings-reference#sandbox-network-alloweddomains) 預先允許網域,即可完全避免提示。Claude Code 也會預先允許來自 `WebFetch(domain:...)` 允許規則的網域,如[權限規則](#permission-rules)所述。
616* **嚴格允許清單**:如果您在使用者設定、受管設定或 CLI `--settings` 設定中將 [`strictAllowlist`](/docs/zh-TW/settings-reference#sandbox-network-strictallowlist) 設為 `true`,Claude Code 會拒絕沙箱化命令存取允許清單以外的任何主機,而不是顯示提示。允許清單為 `allowedDomains` 加上來自 `WebFetch(domain:...)` 允許規則的網域;若設定了 `allowManagedDomainsOnly`,則僅為受管設定中的項目。[不需管理員強制沙箱即可套用的鎖定](#locks-that-apply-without-an-admin-required-sandbox)說明了儲存庫的項目。Claude Code 僅對沙箱化命令強制執行此設定;`WebFetch` 等程序內工具仍遵循其[權限規則](#permission-rules)。在儲存庫的 `.claude/settings.json` 或 `.claude/settings.local.json` 中設定此項目沒有作用。需要 Claude Code v2.1.219 或更新版本。
617* **受管鎖定**:如果在受管設定中設定了 [`allowManagedDomainsOnly`](/docs/zh-TW/settings-reference#sandbox-network-allowmanageddomainsonly),未被允許的網域會自動被封鎖,而不是顯示提示,且僅會採用受管設定中的 `allowedDomains` 和 `WebFetch(domain:...)` 允許規則。
618* **企業代理伺服器**:當您的網路要求對外流量必須經過企業代理伺服器時,請依照[代理伺服器設定](/docs/zh-TW/network-config#proxy-configuration)的說明設定 `HTTPS_PROXY`、`HTTP_PROXY` 和 `NO_PROXY`,設定位置可以是您設定中的 `env` 區塊(讓[背景 agent](/docs/zh-TW/network-config#set-network-variables-in-settings-not-the-shell) 也能取得),或是您啟動 Claude Code 的環境。Claude Code 會強制執行網域允許清單,然後將被允許的連線透過該上游代理伺服器建立通道。`http://` 和 `https://` 代理伺服器 URL 皆可使用,如有需要,可在 URL 中加入基本身分驗證。
619
620在 `WebFetch(domain:...)` 規則中,沙箱支援兩種萬用字元形式:開頭的 `*.`(例如 `*.example.com`)以及單獨的 `*`。單獨的 `*` 形式需要 Claude Code v2.1.186 或更新版本。位於其他位置的萬用字元(例如 `WebFetch(domain:example.*)`)仍會比對擷取請求,但對沙箱化命令沒有作用。
573 621
574<Note>622<Note>
575 內建代理根據請求的主機名稱強制執行允許清單,預設情況下不會終止或檢查 TLS 流量。實驗性 [`network.tlsTerminate`](/docs/zh-TW/settings-reference#sandbox-network-tlsterminate) 設定(在 Claude Code v2.1.199 及更新版本中可用)使內建代理自行終止 TLS,這是 [`mask` 認證項目](#mask-credentials)所需的。有關預設值的含義,請參閱[安全限制](#security-limitations),如果您的威脅模型需要 TLS 檢查,請參閱[自訂代理設定](#custom-proxy-configuration)。623 內建代理伺服器會根據所請求的主機名稱強制執行允許清單,且預設不會終止或檢查 TLS 流量。實驗性的 [`network.tlsTerminate`](/docs/zh-TW/settings-reference#sandbox-network-tlsterminate) 設定(適用於 Claude Code v2.1.199 及更新版本)會讓內建代理伺服器自行終止 TLS,這是 [`mask` 憑證項目](#mask-credentials)所必需的。關於預設行為的影響,請參閱[安全性限制](#security-limitations);如果您的威脅模型需要 TLS 檢查,請參閱[自訂代理伺服器設定](#custom-proxy-configuration)。
576</Note>624</Note>
577 625
626<h4 id="hosts-outside-your-allowed-domains">
627 您允許網域以外的主機
628</h4>
629
630當沙箱化命令連線到不在您允許網域中的主機時,命令會留在沙箱中並等待決定。在互動式終端機工作階段中,決定取決於您的權限模式:
631
632| 權限模式 | 連線會如何處理 |
633| :- | :- |
634| `bypassPermissions` 模式,以及[可使用略過權限](/docs/zh-TW/permission-modes#skip-all-checks-with-bypasspermissions-mode)時的 plan mode | 不經提示即允許 |
635| 手動模式、`acceptEdits` 模式,以及其他情況下的 plan mode | 您會收到提示 |
636| 自動模式 | 除非命令[列出了該主機](#per-command-allowed-domains-in-auto-mode)且分類器核准了該清單,否則拒絕 |
637| `dontAsk` 模式 | 拒絕 |
638
639開啟 [`strictAllowlist`](/docs/zh-TW/settings-reference#sandbox-network-strictallowlist) 或 [`allowManagedDomainsOnly`](/docs/zh-TW/settings-reference#sandbox-network-allowmanageddomainsonly) 時,內建沙箱代理伺服器在每種權限模式下都會拒絕該連線。在 `bypassPermissions` 模式中,除非開啟了其中之一,否則您允許網域以外的主機都會被允許。[非沙箱重試的逃生口](#the-unsandboxed-retry-escape-hatch)說明了命令在該模式下何時可以離開沙箱。連到 [`deniedDomains`](/docs/zh-TW/settings-reference#sandbox-network-denieddomains) 中主機的連線,在每種權限模式下也都會被拒絕。
640
641<h4 id="hostnames-that-resolve-to-local-addresses">
642 解析為本機位址的主機名稱
643</h4>
644
645主機名稱通過允許清單後,沙箱代理伺服器會解析它,並在該名稱僅解析為本機位址時拒絕連線。本機位址包括 `127.0.0.1` 等迴路位址、`169.254.169.254` 雲端中繼資料端點等鏈路本機位址,以及指派給您自己電腦的位址。名稱 `localhost` 和 `*.localhost` 可以解析為迴路位址。
646
647被允許的內部網路主機名稱若解析為 `10.0.0.0/8` 等私有範圍,則可以連線。若要讓某個名稱解析為會被拒絕的位址,請將該 IP 位址加入 `allowedDomains`,例如 `"127.0.0.1:8080"`。
648
649此檢查適用於主機名稱。連到 IP 位址的連線由您允許的網域和權限模式決定。對於透過上游企業代理伺服器送出的連線,代理伺服器也會略過此檢查,因為由該代理伺服器解析名稱。
650
578<h4 id="per-command-allowed-domains-in-auto-mode">651<h4 id="per-command-allowed-domains-in-auto-mode">
579 自動模式中的每個命令允許的網域652 自動模式中的每個命令允許網域
580</h4>653</h4>
581 654
582在啟用沙箱的[自動模式](/docs/zh-TW/permission-modes#eliminate-prompts-with-auto-mode)中,Claude 在命令本身上命名命令需要的主機,而不是為每個連線觸發網路批准。在沙箱中執行的每個 Bash、PowerShell 或[監視器](/docs/zh-TW/tools-reference#monitor-tool)命令都可以攜帶超出沙箱允許清單的主機清單:網域(例如 `registry.npmjs.org`)、萬用字元(例如 `*.pythonhosted.org`)或 IP 位址,每個都帶有可選的 `:port`。分類器將主機與命令一起審查。需要 Claude Code v2.1.271 或更新版本。655在開啟沙箱機制的[自動模式](/docs/zh-TW/permission-modes#eliminate-prompts-with-auto-mode)中,Claude 會在命令本身上指名該命令所需的主機,而不是為每個連線觸發網路核准。每個在沙箱中執行的 Bash、PowerShell 或 [Monitor](/docs/zh-TW/tools-reference#monitor-tool) 命令,都可以攜帶一份超出沙箱允許清單的主機清單:例如 `registry.npmjs.org` 這樣的網域、`*.pythonhosted.org` 這樣的萬用字元,或 IP 位址,每一項都可以選擇性加上 `:port`。分類器會將這些主機與命令一起審查。需要 Claude Code v2.1.271 或更新版本。
583 656
584批准的清單僅為該一個命令開啟這些主機,只要它執行。沒有任何內容被新增到您的工作階段允許的主機或您的設定;下一個命令命名其自己的主機。657獲得核准的清單只會在該單一命令執行期間為其開放這些主機。不會將任何內容加入您工作階段的允許主機或您的設定;下一個命令會指名它自己的主機。
585 658
586攜帶主機的命令會進入分類器,而不是由權限規則或沙箱的[自動允許模式](#sandbox-modes)批准。如果[詢問規則](/docs/zh-TW/permissions#manage-permissions)強制提示命令,您終端中的權限對話會在其旁邊列出主機,在那裡批准涵蓋兩者。659攜帶主機的命令會交由分類器處理,而不是由權限規則或沙箱的[自動允許模式](#sandbox-modes)核准。如果 [ask 規則](/docs/zh-TW/permissions#manage-permissions)強制對該命令顯示提示,您終端機中的權限對話框會在命令旁列出這些主機,在該處核准即同時涵蓋兩者。
587 660
588每個命令清單僅擴大沙箱預設拒絕的內容。[`deniedDomains`](/docs/zh-TW/settings-reference#sandbox-network-denieddomains) 項目仍會阻止。當 [`strictAllowlist`](/docs/zh-TW/settings-reference#sandbox-network-strictallowlist) 或 [`allowManagedDomainsOnly`](/docs/zh-TW/settings-reference#sandbox-network-allowmanageddomainsonly) 鎖定允許清單時,Claude Code 拒絕每個命令清單。661每個命令的清單只會放寬沙箱預設拒絕的內容。[`deniedDomains`](/docs/zh-TW/settings-reference#sandbox-network-denieddomains) 項目仍會封鎖。當 [`strictAllowlist`](/docs/zh-TW/settings-reference#sandbox-network-strictallowlist) 或 [`allowManagedDomainsOnly`](/docs/zh-TW/settings-reference#sandbox-network-allowmanageddomainsonly) 鎖定允許清單時,Claude Code 會拒絕每個命令的清單。
589 662
590當每個命令清單適用時,Claude Code 拒絕連線到沒有批准命令列出的主機,沒有提示或分類器檢查。拒絕在命令的結果中命名主機,Claude 使用新增的主機重新執行命令。663當每個命令的清單生效時,Claude Code 會拒絕連到任何未被已核准命令列出的主機,且不會顯示提示或進行分類器檢查。拒絕訊息會在命令結果中指名該主機,Claude 會將該主機加入後重新執行命令。
591 664
592<h4 id="ipv6-addresses-in-domain-lists">665<h4 id="ipv6-addresses-in-domain-lists">
593 網域清單中的 IPv6 位址666 網域清單中的 IPv6 位址
594</h4>667</h4>
595 668
596沙箱的網域清單是 `allowedDomains`、`deniedDomains` 和提供它們的 `WebFetch(domain:...)` 規則。若要符合其中任何一個中的 IPv6 位址,請在括號中寫入文字:`"[::1]"` 符合該位址在每個連接埠上,`"[::1]:443"` 僅在連接埠 443 上符合它。將連接埠寫成 1 到 65535 之間的數字,不帶前導零。括號形式需要 Claude Code v2.1.229 或更新版本。在 v2.1.229 之前,當未括號項目最後一個冒號後的文字是連接埠號時,Claude Code 將其讀為一個,所以 `::1:443` 命名位址 `::1` 在連接埠 443 上。669若要在 `allowedDomains`、`deniedDomains` 或 `WebFetch(domain:...)` 規則中比對 IPv6 位址,請將位址寫在方括號中:`"[::1]"` 會比對該位址的所有連接埠,而 `"[::1]:443"` 只會比對其連接埠 443。方括號形式需要 Claude Code v2.1.229 或更新版本。
597 670
598當您在 IPv6 位址的網路批准提示中選擇「是,以後不要再問」時,Claude Code 會使用括號的位址儲存 `WebFetch(domain:...)` 規則,以便規則在未來工作階段中保持符合位址。671未加方括號的項目(例如 `::1:443`)具有歧義,既可能是一個位址,也可能是一個加上連接埠的位址:
599 672
600帶有兩個或更多冒號的未括號項目是模稜兩可的:`::1:443` 既是完整的 IPv6 位址,也是位址後跟連接埠。Claude Code 保守地強制執行模稜兩可的拼寫,而不是猜測您的意思是哪個讀法:673* **拒絕清單**:Claude Code 會拒絕該項目可解析出的每一種解讀,因此無論您想要的是哪一種解讀都會被封鎖。對於無法解析出任何解讀的項目,Claude Code 不會封鎖任何內容
674* **允許清單**:Claude Code 絕不會允許超出您所寫的內容。當有歧義的項目可以乾淨地解析為主機加連接埠的解讀時,Claude Code 會將其改寫為該解讀,並且可能會完全捨棄該項目,而不是放寬允許清單
601 675
602* **拒絕清單**:Claude Code 拒絕項目解析為的每個讀法,所以無論您的意思是哪個讀法都被阻止。對於沒有可解析讀法的項目,Claude Code 不阻止任何內容。676若要找出有歧義的項目,請在您的終端機中執行 `claude doctor`,並尋找 `Sandbox network domain entries have unreliable spellings` 警告。將每個有歧義的項目改寫為方括號形式。
603* **允許清單**:Claude Code 永遠不允許超過您寫的內容。當該讀法乾淨地解析時,它會將模稜兩可的項目重寫為其主機和連接埠讀法,並可能完全刪除項目,而不是擴大允許清單。
604
605在您的終端中執行 `claude doctor` 以找到受影響的項目:`Sandbox network domain entries have unreliable spellings` 警告命名最多三個並計算其餘的。將每個重寫為括號形式以清除警告。警告也命名拼寫不可靠的項目,原因包括 `@`、路徑或查詢字元,或括號內的萬用字元。
606 677
607<h3 id="os-level-enforcement">678<h3 id="os-level-enforcement">
608 作業系統層級強制執行679 作業系統層級的強制執行
609</h3>680</h3>
610 681
611沙箱化的 Bash 工具使用作業系統安全原語:682沙箱化的 Bash 工具使用作業系統的安全原語:
612 683
613* **macOS**:使用 Seatbelt 進行沙箱強制執行684* **macOS**:使用 Seatbelt 強制執行沙箱
614* **Linux**:使用 [bubblewrap](https://github.com/containers/bubblewrap) 進行隔離685* **Linux**:使用 [bubblewrap](https://github.com/containers/bubblewrap) 進行隔離
615* **WSL2**:使用 bubblewrap,與 Linux 相同686* **WSL2**:使用 bubblewrap,與 Linux 相同
616 687
617不支援 WSL1,因為 bubblewrap 需要僅在 WSL2 中可用的核心功能。688您也可以單獨執行 [`@anthropic-ai/sandbox-runtime`](https://github.com/anthropics/sandbox-runtime) 套件來包裝 Claude Code 程序。請參閱[沙箱執行環境](/docs/zh-TW/sandbox-environments#sandbox-runtime)。
618
619這些相同的原語可作為獨立的 [`@anthropic-ai/sandbox-runtime`](https://github.com/anthropic-experimental/sandbox-runtime) 套件使用,[沙箱環境](/docs/zh-TW/sandbox-environments#sandbox-runtime)頁面涵蓋作為包裝整個 Claude Code 程序的單獨方法。
620 689
621<h2 id="how-sandboxing-relates-to-permissions-and-permission-modes">690<h2 id="how-sandboxing-relates-to-permissions-and-permission-modes">
622 沙箱隔離如何與權限和權限模式相關691 沙箱隔離如何與權限和權限模式相關
671 為您的組織設定沙箱740 為您的組織設定沙箱
672</h2>741</h2>
673 742
674管理員可以為每個使用者要求沙箱化,防止開發人員擴大策略,並通過公司代理路由沙箱流量。743管理員可以為每個使用者要求沙箱機制,防止開發人員擴大策略,並透過公司代理伺服器路由沙箱流量。
675 744
676<h3 id="enforce-sandboxing-with-managed-settings">745<h3 id="enforce-sandboxing-with-managed-settings">
677 使用受管設定強制執行沙箱化746 使用受管設定強制執行沙箱化
678</h3>747</h3>
679 748
680若要為每個開發人員要求沙箱,通過 [managed settings](/docs/zh-TW/managed-settings#delivery-mechanisms) 傳遞 `sandbox` 金鑰,可以是由您的 MDM 管理的檔案,也可以是通過 claude.ai 上的 [server-managed settings](/docs/zh-TW/server-managed-settings)。749若要為每個開發人員要求沙箱,請透過[受管設定](/docs/zh-TW/managed-settings#delivery-mechanisms)傳遞 `sandbox` 鍵,可以是由您的 MDM 管理的檔案,也可以是透過 claude.ai 上的[伺服器受管設定](/docs/zh-TW/server-managed-settings)。
681 750
682以下受管設定配置啟用沙箱,如果沙箱無法初始化則拒絕啟動 Claude Code,並防止模型在沙箱外重試命令:751以下受管設定組態會啟用沙箱,在平台不受支援或缺少相依性時拒絕啟動 Claude Code,並防止模型在沙箱外重試命令:
683 752
684```json theme={null}753```json theme={null}
685{754{
691}760}
692```761```
693 762
694超過 `enabled` 的兩個金鑰控制沙箱無法執行命令時會發生什麼:763除了 `enabled` 之外的兩個鍵控制沙箱無法執行命令時會發生什麼:
695 764
696* **`failIfUnavailable`**:缺少的依賴項(例如 Linux 上的 bubblewrap)會阻止 Claude Code 啟動,而不是顯示警告並回退到未沙箱化執行765* **`failIfUnavailable`**:缺少相依性(例如 Linux 上的 bubblewrap)會阻止 Claude Code 啟動,而不是回退到未沙箱化執行
697* **`allowUnsandboxedCommands: false`**:Claude Code 忽略 `dangerouslyDisableSandbox` 逃生艙,因此在沙箱下失敗的命令無法在其外重試766* **`allowUnsandboxedCommands: false`**:Claude Code 會忽略 `dangerouslyDisableSandbox` 逃生艙,因此當命令在沙箱下失敗時,Claude 無法在未沙箱化的情況下重試
698 767
699值得考慮與它們一起的兩個補充。為任何必須在沒有隔離的情況下執行的組織批准的工具新增 `excludedCommands`。為認證目錄(例如 `~/.aws` 和 `~/.ssh`)和祕密環境變數新增 [`sandbox.credentials`](#protect-credentials) 項目,因為預設讀取策略仍允許這些。768請考慮同時加入以下項目:
700 769
701此配置沙箱化 Claude 執行的命令。開發人員仍然可以在 [`!` shell 模式提示](/docs/zh-TW/interactive-mode#shell-mode-with-prefix)輸入命令並在沙箱外執行它,具有他們在 Claude Code 外任何終端中已有的相同存取權限。請參閱 [The unsandboxed retry escape hatch](#the-unsandboxed-retry-escape-hatch) 以了解輸入的命令在沙箱中執行的工作階段。770* 為任何必須在沒有隔離的情況下執行的組織核准工具新增 `excludedCommands`,因為此設定[會阻止儲存庫的設定將命令移出沙箱](#repository-settings-under-an-admin-required-sandbox)
771* 為憑證目錄(例如 `~/.aws` 和 `~/.ssh`)和祕密環境變數新增 [`sandbox.credentials`](#protect-credentials) 項目,因為預設讀取策略仍允許這些
702 772
703沙箱不在原生 Windows 上執行,因此如果您的機隊包括 Windows 主機,請將此配置限制在 macOS 和 Linux,或讓這些使用者在 WSL2 或容器內執行 Claude Code。773此設定會將 Claude 執行的命令沙箱化。開發人員仍然可以在 [`!` shell 模式提示字元](/docs/zh-TW/interactive-mode#shell-mode-with-prefix)輸入命令並在沙箱外執行,具有與他們在 Claude Code 外任何終端機中已有的相同存取權限。請參閱[嚴格沙箱模式](#turn-off-the-retry-with-strict-sandbox-mode),了解輸入的命令在沙箱中執行的工作階段。
774
775沙箱無法在原生 Windows 上執行,因此設定 `failIfUnavailable` 時,Claude Code 會在這些機器上於啟動時結束。如果您的機隊包括 Windows 主機,您可以:
776
777* **依作業系統傳遞設定**:僅在 macOS 和 Linux 機器上透過您的 MDM 或以[受管設定檔](/docs/zh-TW/managed-settings#delivery-mechanisms)部署。[伺服器受管設定](/docs/zh-TW/server-managed-settings#current-limitations)會套用至組織中的所有使用者
778* **將 Windows 使用者移至受支援的環境**:讓他們在 WSL2 或容器內執行 Claude Code
704 779
705<h3 id="keep-developers-from-widening-the-policy">780<h3 id="keep-developers-from-widening-the-policy">
706 防止開發人員擴大策略781 防止開發人員擴大策略
707</h3>782</h3>
708 783
709對於布林金鑰(例如 `enabled` 和 `failIfUnavailable`),Claude Code 使用受管值並忽略開發人員在本地設定的任何內容。對於陣列金鑰(例如 `excludedCommands` 和 `allowRead`),Claude Code 合併來自工作階段載入的每個範圍的項目,因此開發人員可以附加擴大策略的項目。784當受管設定設定了布林鍵(例如 `enabled` 或 `failIfUnavailable`)時,Claude Code 會使用受管值並忽略開發人員在本機設定的任何內容。對於陣列鍵(例如 `allowRead`),Claude Code 會合併來自工作階段載入之範圍的項目,因此除非有鎖定涵蓋該鍵,否則開發人員可以附加擴大策略的項目。
785
786除非受管設定已設定這些鍵,否則開發人員的使用者設定或 `--settings` 可以開啟下列鍵。儲存庫的 `.claude/settings.json` 也可以,除非沙箱是[管理員要求的](#repository-settings-under-an-admin-required-sandbox)。每一個鍵都會削弱沙箱,因此如果您不希望使用它,請在受管設定中將其設定為 `false`:
787
788* [`enableWeakerNestedSandbox`](/docs/zh-TW/settings-reference#sandbox-enableweakernestedsandbox)
789* [`enableWeakerNetworkIsolation`](/docs/zh-TW/settings-reference#sandbox-enableweakernetworkisolation)
790* [`network.allowAllUnixSockets`](/docs/zh-TW/settings-reference#sandbox-network-allowallunixsockets)
791* [`network.allowLocalBinding`](/docs/zh-TW/settings-reference#sandbox-network-allowlocalbinding)
792* [`allowAppleEvents`](/docs/zh-TW/settings-reference#sandbox-allowappleevents),儲存庫無法開啟此鍵
710 793
711在受管設定中將 `allowManagedReadPathsOnly` 設定為 `true`,以便只有來自受管設定的 `allowRead` 項目被尊重。這防止開發人員擴大讀取存取超過組織批准的路徑。若要以相同方式將網路域鎖定到受管值,請設定 [`allowManagedDomainsOnly`](/docs/zh-TW/settings-reference#sandbox-network-allowmanageddomainsonly)。794在受管設定中將 `allowManagedReadPathsOnly` 設定為 `true`,以便只有來自受管設定的 `allowRead` 項目被尊重。這防止開發人員擴大讀取存取超過組織核准的路徑。
712 795
713當受管設定配置 `sandbox.filesystem` 或列出任何具有 `"mode": "deny"` 的 `sandbox.credentials.files` 項目時,只有受管設定可以設定 [`filesystem.disabled`](#disable-filesystem-isolation),因此開發人員無法關閉管理員部署的檔案系統限制。`mask` 項目是否固定金鑰取決於它如何解析;[Which settings can disable it](#which-settings-can-disable-it) 下的表格涵蓋四種情況。796若要以相同方式將網路網域鎖定到受管值,請設定 [`allowManagedDomainsOnly`](/docs/zh-TW/settings-reference#sandbox-network-allowmanageddomainsonly)。開啟此鎖定後,只有受管設定可以設定[代理伺服器連接埠](#custom-proxy-configuration)。
714 797
715`excludedCommands` 沒有等效的受管專用鎖定,因此開發人員總是可以附加在沙箱外執行其他命令的項目。保持受管清單狹窄。798當受管設定設定 `sandbox.filesystem` 或列出任何具有 `"mode": "deny"` 的 `sandbox.credentials.files` 項目時,只有受管設定可以設定 [`filesystem.disabled`](#disable-filesystem-isolation),因此開發人員無法關閉管理員部署的檔案系統限制。[有效的](/docs/zh-TW/settings-reference#invalid-credential-entries-in-managed-settings) `mask` 項目不會鎖定該鍵。請參閱[哪些設定可以停用它](#which-settings-can-disable-it)。
799
800<h4 id="repository-settings-under-an-admin-required-sandbox">
801 管理員要求沙箱時的儲存庫設定
802</h4>
803
804當下列任一設定生效時,沙箱即為管理員要求的:
805
806* [`allowUnsandboxedCommands`](/docs/zh-TW/settings-reference#sandbox-allowunsandboxedcommands) 在受管設定中設定為 `false`,或透過 `--settings` 旗標設定為 `false`(除非受管設定將其設定為 `true`)
807* [`allowManagedDomainsOnly`](/docs/zh-TW/settings-reference#sandbox-network-allowmanageddomainsonly) 在受管設定中設定為 `true`
808
809這些設定不會開啟沙箱,因此也請設定 `enabled`。
810
811當沙箱為管理員要求時,Claude Code 只會從受管設定、`--settings` 旗標以及每位開發人員的 `~/.claude/settings.json` 採用放寬沙箱的設定。它會忽略儲存庫的 `.claude/settings.json` 和 `.claude/settings.local.json` 中的這些設定:
812
813| 儲存庫設定 | Claude Code 忽略的內容 |
814| :- | :- |
815| `excludedCommands`、`ignoreViolations`、`network.allowedDomains`、`network.allowUnixSockets`、`network.allowMachLookup`、`network.httpProxyPort`、`network.socksProxyPort` | 每個項目 |
816| `filesystem.allowWrite`、`Edit(...)` 允許規則、`permissions.additionalDirectories` | 每個項目為沙箱化命令提供的寫入存取權限。Claude 的檔案工具仍會遵循 `Edit(...)` 規則和額外目錄 |
817| `WebFetch(domain:...)` 允許規則 | 每條規則新增至沙箱允許清單的主機。WebFetch 工具仍會遵循該規則 |
818| `enableWeakerNestedSandbox`、`enableWeakerNetworkIsolation`、`network.allowAllUnixSockets`、`network.allowLocalBinding` | `true`。`false` 仍會套用 |
819| `enabled`、`failIfUnavailable` | `false`,當開發人員的 `~/.claude/settings.json` 設定為 `true` 時 |
820| `filesystem.allowRead` | 位於受管設定、`--settings` 或使用者設定拒絕讀取的路徑或其下的項目,或可能與其相符的 glob |
821
822當沙箱為管理員要求時,這些設定仍會套用:
823
824* **在儲存庫的檔案中**:拒絕項目和 `autoAllowBashIfSandboxed` 值。在受管設定中設定該鍵,以防止儲存庫變更它
825* **在開發人員自己的設定中**:表格中的設定仍會從 `~/.claude/settings.json` 或 `--settings` 套用,除非有僅限受管的鎖定(例如 `allowManagedDomainsOnly`)涵蓋它們。其中大多數(例如 `excludedCommands` 和 `filesystem.allowWrite`)沒有僅限受管的鎖定
826
827[使用受管設定強制執行沙箱化](#enforce-sandboxing-with-managed-settings)下的設定會使沙箱成為管理員要求的。請將您核准的工具所需的 `excludedCommands`、`allowWrite` 和通訊端項目新增至受管設定,因為儲存庫無法提供它們。
828
829需要 Claude Code v2.1.285 或更新版本。從 v2.1.282 到 v2.1.284,相同的設定會使 Claude Code 忽略儲存庫的 `excludedCommands` 項目。
830
831<h4 id="locks-that-apply-without-an-admin-required-sandbox">
832 不需管理員要求沙箱即套用的鎖定
833</h4>
834
835某些設定會使 Claude Code 忽略直接覆寫某項限制的儲存庫鍵,即使沙箱不是管理員要求的。每個設定只有在您於其所在列指名的檔案中設定時才有此效果,且儲存庫的其他沙箱設定仍會套用。需要 Claude Code v2.1.285 或更新版本。
836
837| 設定 | 設定位置 | Claude Code 在儲存庫設定中忽略的內容 |
838| :- | :- | :- |
839| `network.deniedDomains` 或 `WebFetch(domain:...)` 拒絕規則 | 受管設定、`--settings` | `httpProxyPort` 和 `socksProxyPort` |
840| `network.strictAllowlist` | 受管設定、`--settings`、使用者設定 | 代理伺服器連接埠、`allowedDomains` 和 `WebFetch(domain:...)` 允許規則 |
841| `filesystem.denyRead`、`Read(...)` 拒絕規則或 `credentials.files` 項目 | 受管設定、`--settings` | 位於受管設定、`--settings` 或使用者設定拒絕讀取的路徑或其下的 `allowRead`、`allowWrite`、`Edit(...)` 允許或 `additionalDirectories` 項目,或可能與其相符的 glob |
842
843這些鎖定會改變沙箱化命令可以存取的範圍。WebFetch 工具和 Claude 的檔案工具仍會遵循儲存庫的規則和額外目錄。
716 844
717<h3 id="custom-proxy-configuration">845<h3 id="custom-proxy-configuration">
718 自訂代理配置846 自訂代理伺服器設定
719</h3>847</h3>
720 848
721對於需要進階網路安全的組織,您可以實施自訂代理以:849若要使用您自己的工具檢查、過濾沙箱流量或將其記錄至日誌,請以您在同一台機器上執行的代理伺服器取代內建的沙箱代理伺服器。
722 850
723* 解密和檢查 HTTPS 流量851若要透過網路上其他位置的公司代理伺服器路由沙箱流量,請改為設定 `HTTPS_PROXY`,如[網路隔離](#network-isolation)下的**公司代理伺服器**項目所述。如此一來,Claude Code 的允許清單仍會套用。
724* 應用自訂過濾規則
725* 記錄所有網路請求
726* 與現有安全基礎設施整合
727 852
728若要將 Claude Code 指向您的代理,請在 [sandbox settings](/docs/zh-TW/settings-reference#sandbox-settings) 中設定代理連接埠:853若要將沙箱化命令導向您的代理伺服器,請在[沙箱設定](/docs/zh-TW/settings-reference#sandbox-settings)中設定其監聽的 localhost 連接埠:
729 854
730```json theme={null}855```json theme={null}
731{856{
738}863}
739```864```
740 865
866如果您設定了連接埠,同時也設定了 `HTTPS_PROXY` 或 `HTTP_PROXY`,Claude Code 不會將沙箱化命令傳送至您代理伺服器的內容再轉送至這些變數所指名的代理伺服器。若要連線至公司代理伺服器,請設定您自己的代理伺服器轉送至該伺服器。
867
868哪些檔案可以設定連接埠取決於您的其他沙箱設定。適用第一個符合的情況:
869
870* **`allowManagedDomainsOnly` 已開啟**:僅限受管設定
871* **沙箱是[管理員要求的](#repository-settings-under-an-admin-required-sandbox),或套用了[較窄的網路鎖定](#locks-that-apply-without-an-admin-required-sandbox)**:受管設定、`--settings` 和使用者設定
872* **其他情況**:任何設定檔
873
874Claude Code 會忽略在其他任何位置設定的連接埠。在 v2.1.285 之前,任何設定檔都可以設定連接埠。
875
876<Warning>
877 一旦任一連接埠生效,您的代理伺服器就負責過濾傳送至它的所有內容。Claude Code 自身的網路控制(例如 `allowedDomains`、`deniedDomains`、`strictAllowlist`、核准提示和[本機位址檢查](#hostnames-that-resolve-to-local-addresses))將不再套用於該流量。沙箱化命令可以連線至任一代理伺服器,因此如果您只設定一個連接埠,Claude Code 在另一個代理伺服器上的網域清單並不會限制該命令透過您的代理伺服器所能存取的內容。
878</Warning>
879
741<h2 id="troubleshooting">880<h2 id="troubleshooting">
742 故障排除881 疑難排解
743</h2>882</h2>
744 883
745某些命令在沙箱內失敗,即使它們在沙箱外工作。下面的修復涵蓋最常見的情況。884某些命令在沙箱內會失敗,即使它們在沙箱外可以正常運作。請找出與您的症狀或錯誤訊息相符的標題。
885
886如果您組織的沙箱是[管理員強制要求的](#repository-settings-under-an-admin-required-sandbox),Claude Code 會忽略專案設定檔中這些修正所提到的設定,因此請將它們儲存在 `~/.claude/settings.json` 中,這樣它們會套用於每個專案。如果某項修正仍然沒有效果,可能是您組織的受管設定設定了該設定鍵。
887
888新增 `excludedCommands` 模式的修正,會讓該模式所比對的命令脫離沙箱。請參閱[被排除的命令可以做什麼](#run-commands-outside-the-sandbox-with-excludedcommands)。
746 889
747* **命令因主機不允許錯誤而失敗**:許多 CLI 工具需要到達特定主機。在提示時授予權限會將主機新增到您的允許清單,以便工具在將來在沙箱內執行。890<h3 id="commands-fail-with-a-host-not-allowed-error">
748* **`jest` 掛起或失敗**:`watchman` 與沙箱不相容。改為執行 `jest --no-watchman`。891 命令因主機不允許錯誤而失敗
749* **Go 型 CLI 在 macOS 上 TLS 驗證失敗**:`gh`、`gcloud` 和 `terraform` 等工具在 Seatbelt 下可能無法進行 TLS 驗證。在 [`excludedCommands`](/docs/zh-TW/settings-reference#sandbox-excludedcommands) 中列出這些工具。如果您使用 `httpProxyPort` 與 MITM 代理和自訂 CA,請改為將 [`enableWeakerNetworkIsolation`](/docs/zh-TW/settings-reference#sandbox-enableweakernetworkisolation) 設定為 `true`。892</h3>
750* **`open`、`osascript` 或瀏覽器型驗證流程在 macOS 上因錯誤 `-600` 而失敗**:沙箱預設會阻止 Apple Events。在您的使用者、受管理或 CLI 設定中將 [`allowAppleEvents`](/docs/zh-TW/settings-reference#sandbox-allowappleevents) 設定為 `true` 以允許它們。專案設定會被忽略此金鑰。啟用它會移除程式碼執行隔離,因為沙箱化命令之後可以啟動其他應用程式而不進行沙箱化,無需使用者提示,並向執行中的應用程式傳送 AppleScript 命令,受限於 macOS 自動化同意提示 (TCC)。或者,將命令新增到 [`excludedCommands`](/docs/zh-TW/settings-reference#sandbox-excludedcommands)。893
751* **`docker` 命令失敗**:`docker` 與沙箱不相容。將 `docker *` 新增到 [`excludedCommands`](/docs/zh-TW/settings-reference#sandbox-excludedcommands)。894許多 CLI 工具需要連線到特定主機。在出現提示時核准該主機,或將其新增到 [`allowedDomains`](/docs/zh-TW/settings-reference#sandbox-network-alloweddomains)。如果您的組織使用 `allowManagedDomainsOnly` 鎖定允許清單,則不會出現提示,因此請要求您的管理員新增該主機。
752* **`pbcopy`、`xclip` 或 `wl-copy` 不會更新剪貼簿**:這些剪貼簿公用程式可能無法從沙箱內到達系統剪貼簿,在這種情況下,傳送給它們的文字不會到達。
753 895
754 若要將 Claude 的輸出放在您的剪貼簿上,請要求 Claude 在其回應中列印它,然後執行 [`/copy`](/docs/zh-TW/commands)。`/copy` 從 Claude Code 程序而不是從沙箱化命令寫入剪貼簿。896<h3 id="jest-hangs-or-fails">
897 `jest` 掛起或失敗
898</h3>
755 899
756 當 Claude 將文字傳送給這些工具之一時,將工具新增到 [`excludedCommands`](/docs/zh-TW/settings-reference#sandbox-excludedcommands) 本身不會將該呼叫從沙箱中取出。900`watchman` 與沙箱不相容。改為執行 `jest --no-watchman`。
757* **git 命令因 `unable to unlink old` 而失敗**:`git merge`、`git checkout` 和類似命令在需要取代沙箱拒絕寫入的檔案時以這種方式失敗,無論該檔案是在 [受保護路徑](#protected-paths) 下(例如 `.claude/skills`)、在您的 `denyWrite` 項目之一下,還是完全在沙箱允許命令寫入的目錄之外。在 Linux 和 WSL2 上,錯誤以 `Read-only file system` 結尾。
758 901
759 失敗後,Claude 可能會 [提供在沙箱外重新執行命令](#the-unsandboxed-retry-escape-hatch);批准該重試,或在另一個終端中自己執行 git 命令。如果您已將 `allowUnsandboxedCommands` 設定為 `false`,Claude 無法提供重試,因此請自己執行命令。如果相同的 git 命令經常失敗,請將其新增到 [`excludedCommands`](/docs/zh-TW/settings-reference#sandbox-excludedcommands)。902<h3 id="go-based-clis-fail-tls-verification-on-macos">
760* **Bubblewrap 在容器內啟動失敗**:在無特權容器中,bubblewrap 無法掛載新的 `/proc` 檔案系統,因此沙箱化命令失敗,出現 `bwrap` 錯誤,例如 `Can't mount proc on /newroot/proc: Operation not permitted`。將 [`enableWeakerNestedSandbox`](/docs/zh-TW/settings-reference#sandbox-enableweakernestedsandbox) 設定為 `true`,以便內部沙箱綁定掛載容器的現有 `/proc`。僅在外部容器已提供您需要的隔離邊界時使用此設定,因為它向沙箱化命令公開程序資訊,新的 `/proc` 掛載會隱藏。903 Go 型 CLI 在 macOS 上 TLS 驗證失敗
761* **0 位元組唯讀檔案出現在 `.claude` 設定路徑,且「是,不要再問」不會儲存**:在 Linux 和 WSL2 上,沙箱在沙箱化命令執行時透過在該處建立 0 位元組唯讀預留位置來保持對尚不存在的檔案的寫入拒絕。沙箱在之後移除預留位置。如果在該清理執行之前會話被終止,例如透過 SIGKILL,預留位置會保留下來。稍後的會話在每次啟動時再次將它們綁定為唯讀,因此設定寫入(例如儲存權限選擇)在其中一個位置失敗。904</h3>
905
906`gh`、`gcloud` 和 `terraform` 等工具在 [Seatbelt](#os-level-enforcement) 下可能無法通過 TLS 驗證。若要在沙箱外執行這些工具,請為每個工具新增一個模式(例如 `gh *`)到 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands)。該工具隨後會以您的完整存取權限及其已儲存的憑證執行。如果您將 `httpProxyPort` 與 MITM 代理伺服器和自訂 CA 搭配使用,請改為將 [`enableWeakerNetworkIsolation`](/docs/zh-TW/settings-reference#sandbox-enableweakernetworkisolation) 設定為 `true`。
907
908<h3 id="open-osascript-or-browser-based-auth-flows-fail-with-error-600-on-macos">
909 `open`、`osascript` 或瀏覽器型驗證流程在 macOS 上因錯誤 `-600` 而失敗
910</h3>
911
912沙箱預設會阻止 Apple Events。在您的使用者、受管理或 CLI 設定中將 [`allowAppleEvents`](/docs/zh-TW/settings-reference#sandbox-allowappleevents) 設定為 `true` 以允許它們。Claude Code 會忽略專案設定中的此設定鍵。
913
914啟用 `allowAppleEvents` 會移除程式碼執行隔離,因為沙箱化命令之後可以在未經沙箱化且無使用者提示的情況下啟動其他應用程式,並向執行中的應用程式傳送 AppleScript 命令,受限於 macOS 自動化同意提示 (TCC)。或者,將 `open *` 之類的模式新增到 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands)。這樣每次 `open` 呼叫都會經過權限流程,而 `open` 可以啟動任何檔案或應用程式,包括 Claude 所寫的檔案或應用程式。
915
916<h3 id="docker-commands-fail">
917 `docker` 命令失敗
918</h3>
762 919
763 執行 `claude doctor` 以列出剩餘的預留位置檔案。[`Stale sandbox mask files left by a killed session`](/docs/zh-TW/errors#stale-sandbox-mask-files-left-by-a-killed-session) 警告命名最多三個,並計算其餘的。在該專案中沒有其他 Claude Code 會話執行時,使用 `rm` 刪除每個檔案。在 v2.1.257 之前,Claude Code 留下相同的預留位置而不標記它們。920`docker` 與沙箱不相容。使用 `excludedCommands` 模式(例如 `docker compose *`)將您需要的 `docker` 命令移出沙箱。[使用 `excludedCommands` 在沙箱外執行命令](#run-commands-outside-the-sandbox-with-excludedcommands)說明被排除的 `docker` 命令可以存取什麼。範圍較窄的模式會讓較少的命令脫離沙箱。
764* **`--dangerously-skip-permissions` 以 root 身份失敗**:在 Linux 和 macOS 上以 root 身份或透過 sudo 執行時,此旗標被阻止,因為 root 存取加上沒有權限提示可以修改系統上的任何檔案或服務。檢查在識別的沙箱內自動跳過。若要在容器中自主執行,請使用 [dev container](/docs/zh-TW/devcontainer) 配置,它以非 root 使用者身份執行 Claude Code。921
922<h3 id="pbcopy-xclip-or-wl-copy-doesn’t-update-the-clipboard">
923 `pbcopy`、`xclip` 或 `wl-copy` 不會更新剪貼簿
924</h3>
925
926`pbcopy`、`xclip` 和 `wl-copy` 剪貼簿公用程式可能無法從沙箱內到達系統剪貼簿,在這種情況下,傳送給它們的文字不會到達。
927
928若要將 Claude 的輸出放在您的剪貼簿上,請要求 Claude 在其回應中列印它,然後執行 [`/copy`](/docs/zh-TW/commands)。`/copy` 從 Claude Code 程序而不是從沙箱化命令寫入剪貼簿。
929
930當 Claude 將文字傳送給這些工具之一時,將工具新增到 [`excludedCommands`](/docs/zh-TW/settings-reference#sandbox-excludedcommands) 本身不會將該呼叫從沙箱中取出。
931
932<h3 id="a-git-command-fails-with-unable-to-unlink-old">
933 git 命令因 `unable to unlink old` 而失敗
934</h3>
935
936`git merge`、`git checkout` 和類似命令在需要取代沙箱拒絕寫入的檔案時,會因 `unable to unlink old` 而失敗。在 Linux 和 WSL2 上,錯誤以 `Read-only file system` 結尾。該檔案可能位於以下其中一處:
937
938* 在[受保護路徑](#protected-paths)下,例如 `.claude/skills`
939* 在您的 `denyWrite` 項目之一下
940* 完全在沙箱允許命令寫入的目錄之外
941
942失敗後,Claude 可能會[提供在沙箱外重新執行命令](#the-unsandboxed-retry-escape-hatch)。核准該重試,或在另一個終端機中自己執行 git 命令。如果您已將 `allowUnsandboxedCommands` 設定為 `false`,Claude 無法提供重試,因此請自己執行命令。
943
944<h3 id="bubblewrap-fails-to-start-inside-a-container">
945 Bubblewrap 在容器內啟動失敗
946</h3>
947
948在無特權容器中,[bubblewrap](#os-level-enforcement) 無法掛載新的 `/proc` 檔案系統,因此沙箱化命令失敗,出現 `bwrap` 錯誤,例如 `Can't mount proc on /newroot/proc: Operation not permitted`。將 [`enableWeakerNestedSandbox`](/docs/zh-TW/settings-reference#sandbox-enableweakernestedsandbox) 設定為 `true`,以便沙箱改為綁定掛載容器的現有 `/proc`。僅在外部容器已提供您需要的隔離邊界時使用此設定,因為此設定會向沙箱化命令公開新的 `/proc` 掛載原本會隱藏的程序資訊。
949
950<h3 id="0-byte-read-only-files-appear-at-claude-settings-paths-and-yes-and-don’t-ask-again-doesn’t-save">
951 0 位元組唯讀檔案出現在 `.claude` 設定路徑,且「是,不要再問」不會儲存
952</h3>
953
954在 Linux 和 WSL2 上,沙箱在沙箱化命令執行時透過在該處建立 0 位元組唯讀預留位置來保持對尚不存在的檔案的寫入拒絕。沙箱在之後移除預留位置。如果在該清理執行之前工作階段被終止,例如透過 SIGKILL,預留位置會保留下來。稍後的工作階段在每次啟動時再次將這些預留位置綁定為唯讀,因此設定寫入(例如儲存權限選擇)會在預留位置所在之處失敗。
955
956在您的終端機中執行 `claude doctor` 以列出剩餘的預留位置檔案。[`Stale sandbox mask files left by a killed session`](/docs/zh-TW/errors#stale-sandbox-mask-files-left-by-a-killed-session) 警告會列出其中一部分,並計算其餘的數量。在該專案中沒有其他 Claude Code 工作階段執行時,使用 `rm` 刪除每個檔案。在 v2.1.257 之前,Claude Code 會留下相同的預留位置而不標記它們。
957
958<h3 id="git-over-ssh-fails-with-the-sandbox-on">
959 啟用沙箱時透過 SSH 執行 `git` 失敗
960</h3>
961
962在 macOS 上,針對 SSH 遠端執行的 `git fetch`、`git pull` 和 `git push` 即使在主機已被允許的情況下,也會在沙箱內失敗。在 Linux 和 WSL2 上,只要主機被允許,它們就能正常運作。Claude Code 會透過[沙箱代理伺服器](#network-isolation)為 git 的 SSH 連線建立通道,而 macOS 的通道無法向該代理伺服器進行身分驗證。
963
964在 Linux 和 WSL2 上,如果連線仍然失敗,請檢查以下項目:
965
966* **主機在連接埠 22 上被允許**:不含連接埠的 `allowedDomains` 項目(例如 `"git.example.com"`)即涵蓋此情況
967* **您的企業代理伺服器允許連接埠 22**:如果您的網路需要上游代理伺服器,通道也會經過它
968* **金鑰可以作為檔案讀取**:沙箱可能會封鎖 `ssh-agent` socket,而針對 `~/.ssh` 的 `denyRead` 或 `credentials` 項目會隱藏您的金鑰檔案
969
970在 macOS 上,請將遠端切換為 HTTPS,這需要 HTTPS 憑證,例如個人存取 token:
971
972```bash theme={null}
973git remote set-url origin https://git.example.com/example-org/example-repo.git
974```
975
976如果您必須保留 SSH 遠端,請使用 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands) 將 git 的網路命令移出沙箱:
977
978```json theme={null}
979{
980 "sandbox": {
981 "excludedCommands": ["git fetch *", "git pull *", "git push *"]
982 }
983}
984```
985
986這些項目會比對 `git push origin main`。加上 `cd`、使用 `git -C` 或包含命令替換的呼叫會保持在沙箱中。被排除的 git 命令可以連線到任何主機,而不僅限於 `allowedDomains` 中的主機。
987
988透過 SSH 執行的一般 `ssh`、`scp` 和 `rsync` 失敗的原因,與[資料庫用戶端項目](#a-database-client-or-other-non-http-tool-fails-to-reach-an-allowed-host)所述的原因相同。
989
990<h3 id="a-database-client-or-other-non-http-tool-fails-to-reach-an-allowed-host">
991 資料庫用戶端或其他非 HTTP 工具無法連線到允許的主機
992</h3>
993
994忽略代理伺服器環境變數的工具無法從沙箱內進行連線,即使目標是 `allowedDomains` 中的主機也一樣。沙箱化命令[沒有直接通往網路的路徑](#network-isolation),因此自行開啟連線的工具會失敗。大多數資料庫驅動程式、一般的 `ssh`,以及使用 UDP 的工具都是如此。
995
996此失敗看起來像是網路或名稱解析錯誤:
997
998* **macOS**:`Operation not permitted`,或名稱解析錯誤,例如 `Could not resolve host`
999* **Linux 和 WSL2**:`Network is unreachable`,或名稱解析錯誤,例如 `Temporary failure in name resolution`
1000
1001使用代理伺服器的工具在其主機未被允許時,會以不同的方式失敗。您會收到網路提示,或者工具會收到來自代理伺服器的 `403` 回應。
1002
1003若要讓工具能夠連線,請使用 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands) 在沙箱外執行需要它的命令。此範例排除了一個指令碼,並新增一條 [ask 規則](/docs/zh-TW/permissions),讓您核准每次執行:
1004
1005```json theme={null}
1006{
1007 "sandbox": {
1008 "excludedCommands": ["python scripts/load_orders.py *"]
1009 },
1010 "permissions": {
1011 "ask": ["Bash(python scripts/load_orders.py *)"]
1012 }
1013}
1014```
1015
1016該指令碼會以您的完整存取權限執行,而 Claude 可以編輯位於您工作目錄內的指令碼,因此請在提示出現時檢查它。
1017
1018<h3 id="a-command-fails-to-reach-a-server-on-localhost">
1019 命令無法連線到 localhost 上的伺服器
1020</h3>
1021
1022預設情況下,沙箱化命令無法直接連線到在您機器上、於沙箱外執行的伺服器,例如開發伺服器或容器中的資料庫。您可以變更的內容取決於您的平台:
1023
1024* **macOS**:將 [`network.allowLocalBinding`](/docs/zh-TW/settings-reference#sandbox-network-allowlocalbinding) 設定為 `true`。沙箱化命令之後就可以在網路連接埠上監聽,並連線到 localhost 上的任何連接埠,包括在該處監聽的所有其他服務。不需要身分驗證的 localhost 服務(例如偵錯工具)就可以在沙箱外代替該命令執行動作,而在非 loopback 位址上監聽的命令會接受來自其他機器的連線
1025* **Linux 和 WSL2**:沙箱化命令的 `localhost` 為該命令所私有。該命令可以在連接埠上監聽,並連線到它自己啟動的伺服器。直接連線到 `localhost` 或 `127.0.0.1` 無法到達主機上的伺服器,且 `allowLocalBinding` 沒有效果。請使用 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands) 在沙箱外執行需要主機伺服器的命令,在那裡它不受任何檔案系統或網路限制。關於經過沙箱代理伺服器的連線,請參閱[解析為本機位址的主機名稱](#hostnames-that-resolve-to-local-addresses)
1026
1027此範例為 macOS 開啟該設定:
1028
1029```json theme={null}
1030{
1031 "sandbox": {
1032 "network": {
1033 "allowLocalBinding": true
1034 }
1035 }
1036}
1037```
1038
1039針對 `localhost` 的 `allowedDomains` 項目適用於經過代理伺服器的連線,因此不會改變直接連線。Claude Code 會為沙箱化命令設定 `NO_PROXY`,讓它們直接連線到 `localhost`,而不是經過代理伺服器。該項目也會將您機器 localhost 上的每個連接埠公開給確實使用代理伺服器的命令。關於指向 `127.0.0.1` 的開發用主機名稱,請參閱[允許的主機名稱因 `resolved to a loopback address` 而被拒絕](#an-allowed-hostname-is-refused-with-resolved-to-a-loopback-address)。
1040
1041<h3 id="an-allowed-hostname-is-refused-with-resolved-to-a-loopback-address">
1042 允許的主機名稱因 `resolved to a loopback address` 而被拒絕
1043</h3>
1044
1045沙箱代理伺服器會拒絕[解析為本機位址](#hostnames-that-resolve-to-local-addresses)的允許主機名稱,這會影響指向 `127.0.0.1` 的開發用名稱,例如 `myapp.test`。命令會看到一個 `403` 回應,其內文會指出位址的類型,例如 `Connection to myapp.test blocked: resolved to a loopback address`。
1046
1047請在 `allowedDomains` 中將該名稱所解析到的 IP 位址與主機名稱一併新增,並各自附上您伺服器所監聽的連接埠:
1048
1049```json theme={null}
1050{
1051 "sandbox": {
1052 "network": {
1053 "allowedDomains": ["myapp.test:3000", "127.0.0.1:3000"]
1054 }
1055 }
1056}
1057```
1058
1059不含連接埠的 IP 位址項目會讓沙箱化命令能夠連線到在該位址上監聽的每個服務。
1060
1061在 v2.1.284 之前,代理伺服器會連線到允許的主機名稱所解析到的任何位址。
1062
1063<h3 id="/sandbox-fails-with-sandbox-settings-are-overridden-by-a-higher-priority-configuration">
1064 `/sandbox` 因 `Sandbox settings are overridden by a higher-priority configuration` 而失敗
1065</h3>
1066
1067當較高的[設定層級](/docs/zh-TW/settings#settings-precedence)設定了 `sandbox.enabled`、`sandbox.autoAllowBashIfSandboxed` 或 `sandbox.allowUnsandboxedCommands` 時,`/sandbox` 會印出 `Error: Sandbox settings are overridden by a higher-priority configuration and cannot be changed locally.`,而不會開啟其面板。該面板會將您的選擇儲存到 `.claude/settings.local.json`,而儲存在那裡的值無法覆寫那些層級。
1068
1069受管設定和 `--settings` 的優先順序高於本機設定。若要查看此工作階段載入了哪些設定,請執行 `/status` 並閱讀 `Setting sources` 這一行:
1070
1071* **`Command line arguments`**:如果您使用 [`--settings`](/docs/zh-TW/settings#change-a-setting-for-one-session) 啟動 Claude Code,請檢查您傳入的檔案或 JSON 是否設定了上述其中一個設定鍵。如果是,請在那裡變更該值,或在不使用這些設定鍵的情況下重新啟動 Claude Code。
1072* **`Enterprise managed settings`**:已載入您組織的受管設定。如果它們設定了上述其中一個設定鍵,您就無法從 `/sandbox` 或從您所控制的任何設定檔變更該設定鍵,因此請詢問您的管理員。
765 1073
766<h2 id="limitations">1074<h2 id="limitations">
767 限制1075 限制
768</h2>1076</h2>
769 1077
770沙箱化減少風險,但不是完整的隔離邊界。在依賴它作為硬安全控制之前,請檢查下面的限制。1078沙箱機制可降低風險,但不是完整的隔離邊界。在依賴它作為硬安全控制之前,請檢查下面的限制。
771 1079
772<h3 id="security-limitations">1080<h3 id="security-limitations">
773 安全限制1081 安全限制
774</h3>1082</h3>
775 1083
776* **網路過濾**:沙箱限制流程可以連接的域名。預設情況下,內建代理不終止或檢查出站流量上的 TLS,因此加密連接的內容不被檢查。實驗性的 [`network.tlsTerminate`](/docs/zh-TW/settings-reference#sandbox-network-tlsterminate) 設定在代理處終止 TLS 以進行 [`mask` 認證替換](#mask-credentials),但不添加內容過濾。您負責確保只有受信任的域名在您的策略中被允許。1084* **網路過濾**:沙箱限制程序可以連接的域名。預設情況下,內建代理伺服器不終止或檢查出站流量上的 TLS,因此加密連接的內容不被檢查。實驗性的 [`network.tlsTerminate`](/docs/zh-TW/settings-reference#sandbox-network-tlsterminate) 設定在代理伺服器處終止 TLS 以進行 [`mask` 憑證替換](#mask-credentials),但不添加內容過濾。您負責確保只有受信任的域名在您的策略中被允許。
777 1085
778<Warning>1086<Warning>
779 允許廣泛域名(例如 `github.com`)可能會為資料洩露建立路徑。因為代理根據用戶端提供的主機名進行允許決定而不檢查 TLS,在沙箱內執行的程式碼可能可以使用 [domain fronting](https://en.wikipedia.org/wiki/Domain_fronting) 或類似技術到達允許清單外的主機。如果您的威脅模型需要更強的保證,請配置 [custom proxy](#custom-proxy-configuration),它終止 TLS 並檢查流量,並在沙箱內安裝其 CA 憑證。更強的 TLS 感知網路隔離是一個活躍的開發領域。1087 允許廣泛域名(例如 `github.com`)可能會為資料洩露建立路徑。因為代理伺服器根據用戶端提供的主機名進行允許決定而不檢查 TLS,在沙箱內執行的程式碼可能可以使用 [domain fronting](https://en.wikipedia.org/wiki/Domain_fronting) 或類似技術到達允許清單外的主機。如果您的威脅模型需要更強的保證,請設定 [custom proxy](#custom-proxy-configuration),它終止 TLS 並檢查流量,並在沙箱內安裝其 CA 憑證。更強的 TLS 感知網路隔離是一個活躍的開發領域。
780</Warning>1088</Warning>
781 1089
782* **通過 Unix 套接字的特權提升**:`allowUnixSockets` 配置可能會無意中授予對系統服務的存取,這可能導致沙箱繞過。例如,允許存取 `/var/run/docker.sock` 有效地通過 Docker 套接字授予對主機系統的存取。仔細考慮您通過沙箱允許的任何 Unix 套接字。1090* **通過 Unix 套接字的特權提升**:`allowUnixSockets` 設定可能會無意中授予對系統服務的存取,這可能導致沙箱繞過。例如,允許存取 `/var/run/docker.sock` 有效地通過 Docker 套接字授予對主機系統的存取。仔細考慮您通過沙箱允許的任何 Unix 套接字。
783* **檔案系統權限提升**:過於寬泛的檔案系統寫入權限可能導致特權提升攻擊。允許寫入包含 `$PATH` 中可執行檔案的目錄、系統配置目錄或使用者 shell 配置檔案(例如 `.bashrc` 或 `.zshrc`)可能導致當其他使用者或系統流程存取這些檔案時在不同安全上下文中執行程式碼。1091* **檔案系統權限提升**:過於寬泛的檔案系統寫入權限可能導致特權提升攻擊。允許寫入包含 `$PATH` 中可執行檔案的目錄、系統設定目錄或使用者 shell 設定檔(例如 `.bashrc` 或 `.zshrc`)可能導致當其他使用者或系統程序存取這些檔案時在不同安全上下文中執行程式碼。
784* **Linux 沙箱強度**:Linux 實現提供強大的檔案系統和網路隔離,但包含一個 `enableWeakerNestedSandbox` 模式,使其能夠在 Docker 環境中工作而無需特權命名空間,或在 Linux 主機上禁用無特權使用者命名空間的情況下。此選項大大削弱了安全性,應僅在其他隔離被強制執行時使用。1092* **Linux 沙箱強度**:Linux 實現提供強大的檔案系統和網路隔離,但包含一個 `enableWeakerNestedSandbox` 模式,使其能夠在 Docker 環境中工作而無需特權命名空間。此選項大大削弱了安全性,應僅在其他隔離被強制執行時使用。
785* **macOS 上的 Apple Events**:macOS 沙箱預設阻止 Apple Events。`allowAppleEvents` 設定解除此限制,使 `open` 和 `osascript` 等工具能夠運作,但它移除了程式碼執行隔離:沙箱化命令可以啟動其他應用程式而不進行沙箱化,無需使用者提示,並可以向執行中的應用程式傳送 AppleScript 命令,受限於每個應用程式的 macOS 自動化同意提示 (TCC)。它僅從使用者、受管或 CLI 設定中被接受。專案設定無法啟用它。1093* **macOS 上的 Apple Events**:macOS 沙箱預設阻止 Apple Events。`allowAppleEvents` 設定解除此限制,使 `open` 和 `osascript` 等工具能夠運作,但它移除了程式碼執行隔離:沙箱化命令可以啟動其他應用程式而不進行沙箱化,無需使用者提示,並可以向執行中的應用程式傳送 AppleScript 命令,受限於每個應用程式的 macOS 自動化同意提示 (TCC)。它僅從使用者、受管或 CLI 設定中被接受。專案設定無法啟用它。
786 1094
787<h3 id="platform-and-tool-compatibility">
788 平台和工具相容性
789</h3>
790
791* **平台支援**:支援 macOS、Linux 和 WSL2。不支援 WSL1 和原生 Windows。
792* **效能開銷**:最小,但某些檔案系統操作可能稍慢。
793* **工具相容性**:某些需要特定系統存取模式的工具可能需要配置調整,或可能需要在沙箱外執行。
794
795<h3 id="scope">1095<h3 id="scope">
796 範圍1096 範圍
797</h3>1097</h3>
798 1098
799沙箱隔離 Bash 子流程。其他工具在不同的邊界下運作:1099沙箱隔離 shell 命令及其子程序。[在沙箱外執行的內容](#what-runs-outside-the-sandbox)列出了它未涵蓋的工具和輔助程序。電腦使用和 subagents 與沙箱的關係如下:
800 1100
801* **內建檔案工具**:Read、Edit 和 Write 直接使用權限系統,而不是通過沙箱執行。請參閱 [permissions](/docs/zh-TW/permissions)。
802* **電腦使用**:當 Claude 打開應用程式並控制您的螢幕時,它在您的實際桌面上執行,而不是在隔離環境中。每個應用程式的權限提示控制每個應用程式。請參閱 [CLI 中的電腦使用](/docs/zh-TW/computer-use) 或 [Desktop 中的電腦使用](/docs/zh-TW/desktop#let-claude-use-your-computer)。1101* **電腦使用**:當 Claude 打開應用程式並控制您的螢幕時,它在您的實際桌面上執行,而不是在隔離環境中。每個應用程式的權限提示控制每個應用程式。請參閱 [CLI 中的電腦使用](/docs/zh-TW/computer-use) 或 [Desktop 中的電腦使用](/docs/zh-TW/desktop#let-claude-use-your-computer)。
803* **環境變數**:沙箱化 Bash 命令預設繼承父流程環境,包括在那裡設定的任何認證。使用 [`sandbox.credentials`](#protect-credentials) 為沙箱化命令取消設定或遮罩特定變數,或設定 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-TW/env-vars) 以從所有子流程中去除認證。1102* **Subagents**:[subagents](/docs/zh-TW/sub-agents) 在與父工作階段相同的程序中執行,並使用相同的沙箱設定。當在父工作階段中啟用沙箱機制時,subagent 內的 Bash 命令會被沙箱化。
804* **子代理**:[subagents](/docs/zh-TW/sub-agents) 在與父工作階段相同的流程中執行,並使用相同的沙箱配置。當在父工作階段中啟用沙箱化時,子代理內的 Bash 命令被沙箱化。1103* **Mods**:[mod](/docs/zh-TW/plugins/mods/overview) 是在 Claude Code 內執行其自有程式碼的外掛,而 mod 啟動的程序會在沙箱外執行。請參閱 [mod 可以存取的範圍](/docs/zh-TW/plugins/mods/overview#what-a-mod-can-reach)。
805 1104
806<Warning>1105<Warning>
807 有效的沙箱化需要同時進行檔案系統和網路隔離。沒有網路隔離,受損的代理可能會洩露敏感檔案,如 SSH 金鑰。沒有檔案系統隔離,無論是來自寬鬆的策略還是來自 [disabling the filesystem layer](#disable-filesystem-isolation),受損的代理可能會後門系統資源以獲得網路存取。當您擴大預設值時,檢查 `allowWrite` 路徑、廣泛的 `allowedDomains` 項目或 `excludedCommands` 例外是否不會撤銷另一側的限制。1106 有效的沙箱機制需要同時進行檔案系統和網路隔離。沒有網路隔離,受損的 agent 可能會洩露敏感檔案,如 SSH 金鑰。沒有檔案系統隔離,無論是來自寬鬆的策略還是來自 [disabling the filesystem layer](#disable-filesystem-isolation),受損的 agent 可能會後門系統資源以獲得網路存取。當您擴大預設值時,檢查 `allowWrite` 路徑、廣泛的 `allowedDomains` 項目或 `excludedCommands` 例外是否不會撤銷另一側的限制。
808</Warning>1107</Warning>
809 1108
810<h2 id="see-also">1109<h2 id="see-also">