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-CN/sandbox-environments)。要减少 Bash 以外工具的权限提示,请参阅 [permission modes](/docs/zh-CN/permission-modes)。16 本页介绍您自己计算机上围绕 shell 命令的沙箱。其他页面涵盖相关问题:
17
18 * 有关云端会话如何隔离,请参阅[安全与隔离](/docs/zh-CN/claude-code-on-the-web#security-and-isolation)
19 * 要比较开发容器、自定义容器和虚拟机等其他隔离方法,请参阅[沙箱环境](/docs/zh-CN/sandbox-environments)
20 * 要减少 Bash 以外工具的权限提示,请参阅[权限模式](/docs/zh-CN/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`,或在 `~/.claude/settings.json` 等[设置文件](/docs/zh-CN/settings)中将 [`sandbox.enabled`](/docs/zh-CN/settings-reference#sandbox-enabled) 设置为 `true`。
28
29下表列出了沙箱化命令默认可以访问的内容,以及可更改各项默认值的设置。
30
31| 访问 | 默认值 | 更改方式 |
32| :- | :- | :- |
33| 写入 | 工作目录、每个用户独立的临时目录,以及[您添加的目录](/docs/zh-CN/permissions#additional-directories-grant-file-access-not-configuration)。[受保护路径](#protected-paths)始终禁止写入 | [`filesystem.allowWrite`](/docs/zh-CN/settings-reference#sandbox-filesystem-allowwrite)、[`filesystem.denyWrite`](/docs/zh-CN/settings-reference#sandbox-filesystem-denywrite) |
34| 读取 | 机器上的大部分内容,包括 `~/.ssh` 和 `~/.aws/credentials` 等凭据文件 | [`filesystem.denyRead`](/docs/zh-CN/settings-reference#sandbox-filesystem-denyread)、[`credentials`](#protect-credentials) |
35| 网络 | 没有直接的出站路由。连接会经过您机器上的代理,该代理会根据您允许的域名检查每个主机,允许的域名列表初始为空。您的权限模式决定了[其他主机的处理方式](#hosts-outside-your-allowed-domains) | [`network.allowedDomains`](/docs/zh-CN/settings-reference#sandbox-network-alloweddomains)、[`network.deniedDomains`](/docs/zh-CN/settings-reference#sandbox-network-denieddomains) |
36| 环境变量 | 继承自 Claude Code,包括其环境中的任何机密信息 | [`credentials`](#protect-credentials)、[`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-CN/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* **内置文件和 Web 工具**:Read、Edit、Write、WebFetch 和 WebSearch 等工具改为遵循[权限规则](/docs/zh-CN/permissions)。`denyRead` 条目不会阻止 Read 工具,`allowedDomains` 也不会限制 WebFetch
47* **Claude Code 启动的其他进程**:命令 [hook](/docs/zh-CN/hooks)、本地 [MCP 服务器](/docs/zh-CN/mcp)、[插件监视器](/docs/zh-CN/plugins/components#monitors)、[LSP 服务器](/docs/zh-CN/tools-reference#lsp-tool-behavior),以及您的[状态栏](/docs/zh-CN/statusline)命令和 `apiKeyHelper` 等辅助命令,都以您的完整访问权限运行
48
49根据您的设置,某些 shell 命令也会在沙箱之外运行:
50
51* **您自己输入的命令**:在大多数会话中,您在 [`!` shell 模式提示符](/docs/zh-CN/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-CN/sandbox-environments)中运行 Claude Code 进程本身。
56
15<h2 id="get-started">57<h2 id="get-started">
16 入门58 开始使用
17</h2>59</h2>
18 60
19沙箱内置于 Claude Code 中,在 macOS、Linux 和 WSL2 上运行。不支持原生 Windows。在 Windows 上,在 WSL2 发行版内运行 Claude Code。61沙箱内置于 Claude Code 中。需要安装的内容取决于您的平台:
20 62
21在 macOS 上,无需安装任何内容:沙箱使用内置的 Seatbelt 框架。在 Linux 和 WSL2 上,沙箱依赖两个包,详见 [设置 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 这会打开沙箱面板,有三个选项卡,在 Linux 上缺少可选的 seccomp 过滤器时还有一个 Dependencies 选项卡:74 这会打开包含三个选项卡的沙箱面板;在 Linux 上,如果缺少可选的 seccomp 过滤器,还会额外显示一个 Dependencies 选项卡:
32 75
33 * **Mode**:选择沙箱化命令的批准方式,在下一步中介绍76 * **Mode**:选择沙箱命令的批准方式,详见下一步
34 * **Overrides**:选择在沙箱下失败的命令是否可以回退到运行非沙箱化。这是 [`allowUnsandboxedCommands`](/docs/zh-CN/settings-reference#sandbox-allowunsandboxedcommands) 设置77 * **Overrides**:选择在沙箱中失败的命令是否可以回退到在沙箱外运行。这对应 [`allowUnsandboxedCommands`](/docs/zh-CN/settings-reference#sandbox-allowunsandboxedcommands) 设置
35 * **Config**:查看已解析的沙箱设置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 选项卡上,选择自动允许或常规权限。自动允许在不提示的情况下运行沙箱化命令,常规权限即使在命令沙箱化时也保持常规权限提示。有关在自动允许模式下仍会提示哪些命令,请参阅 [沙箱模式](#sandbox-modes)。84 在 Mode 选项卡中,选择自动允许或常规权限。自动允许会在不提示的情况下运行沙箱命令,而常规权限即使在命令处于沙箱中时也会保留常规权限提示。有关在自动允许模式下仍会提示的命令,请参阅[沙箱模式](#sandbox-modes)。
42 </Step>85 </Step>
43 86
44 <Step title="运行 Bash 命令">87 <Step title="运行 Bash 命令">
45 要求 Claude 运行一个命令,例如构建或测试套件。默认情况下,沙箱内的命令可以写入工作目录、[每用户临时目录](/docs/zh-CN/env-vars) 以及任何你用 `--add-dir`、`/add-dir` 或 `permissions.additionalDirectories` [添加的目录](/docs/zh-CN/permissions#additional-directories-grant-file-access-not-configuration)。88 让 Claude 运行一个命令,例如构建或测试套件。默认情况下,沙箱内的命令可以写入工作目录、[每用户临时目录](/docs/zh-CN/env-vars),以及通过 `--add-dir`、`/add-dir` 或 `permissions.additionalDirectories` [添加的任何目录](/docs/zh-CN/permissions#additional-directories-grant-file-access-not-configuration)。
46 89
47 命令第一次需要新的网络域时,Claude Code 会提示批准;在 [自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 中,Claude 改为在 [命令本身上命名](#per-command-allowed-domains-in-auto-mode) 命令需要的主机供分类器与其一起审查。90 当命令首次需要访问新的网络域名时,Claude Code 会请求批准;在[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)下,Claude 则会[在命令本身上](#per-command-allowed-domains-in-auto-mode)列出该命令所需的主机,供分类器连同命令一起审查。
48 91
49 无法沙箱化运行的命令会回退到常规权限流程。Claude Code 将其权限提示标题为"Bash 命令(非沙箱化)"而不是"Bash 命令",这样你可以看出哪些命令在沙箱外运行。要扩大或缩小沙箱允许的范围,请参阅 [配置沙箱](#configure-sandboxing)。92 要扩大或缩小沙箱允许的范围,请参阅[配置沙箱隔离](#configure-sandboxing)。
50 93
51 如果沙箱化命令在容器内因 `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。要在所有项目中启用沙箱,请在 `~/.claude/settings.json` 的用户设置中将 [`sandbox.enabled`](/docs/zh-CN/settings-reference#sandbox-enabled) 设置为 `true`。要为组织中的每个开发者强制执行沙箱,请使用 [托管设置](#enforce-sandboxing-with-managed-settings)。98当您在面板中选择模式时,Claude Code 会将其保存到项目的本地设置 `.claude/settings.local.json` 中,该设置适用于当前项目。Claude Code 在该文件中保存设置时,会将其添加到您的全局 gitignore 中。要在所有项目中启用沙箱,请在用户设置 `~/.claude/settings.json` 中将 [`sandbox.enabled`](/docs/zh-CN/settings-reference#sandbox-enabled) 设置为 `true`。要为组织中的每位开发者强制启用沙箱隔离,请使用[托管设置](#enforce-sandboxing-with-managed-settings)。
56 99
57要在一个会话中更改沙箱而不写入设置文件,请使用 [`--settings`](/docs/zh-CN/settings#change-a-setting-for-one-session) 启动 Claude Code。例如,此命令启动一个沙箱化会话,其中 Claude 无法在沙箱外重试被阻止的命令:100要在不写入设置文件的情况下为单个会话更改沙箱,请使用 [`--settings`](/docs/zh-CN/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 默认情况下,如果沙箱因缺少依赖项或不支持的平台而无法启动,Claude Code 会显示警告并在没有沙箱的情况下运行命令。要使其成为硬失败,请将 [`sandbox.failIfUnavailable`](/docs/zh-CN/settings-reference#sandbox-failifunavailable) 设置为 `true`。这适用于需要沙箱作为安全门的托管部署。107 默认情况下,如果由于缺少依赖或平台不受支持而导致沙箱无法启动,Claude Code 会在不使用沙箱的情况下运行命令。要让 Claude Code 改为在启动时退出,请将 [`sandbox.failIfUnavailable`](/docs/zh-CN/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 上,沙箱依赖两个包:127在 Linux 和 WSL2 上,沙箱依赖以下软件包:
72 128
73* [`bubblewrap`](https://github.com/containers/bubblewrap):无特权沙箱工具,强制执行文件系统隔离129* [`bubblewrap`](https://github.com/containers/bubblewrap):用于强制执行文件系统隔离的非特权沙箱隔离工具
74* [`socat`](http://www.dest-unreach.org/socat/):用于通过沙箱代理路由网络流量的中继130* [`socat`](http://www.dest-unreach.org/socat/):用于将网络流量通过沙箱代理进行路由的中继
75 131
76使用你的发行版的包管理器安装它们:132使用您的发行版的包管理器安装它们:
77 133
78<Tabs>134<Tabs>
79 <Tab title="Ubuntu/Debian">135 <Tab title="Ubuntu/Debian">
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 域套接字的阻止。如果缺少该过滤器,请使用 `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`,请添加一个 AppArmor 配置文件,授予 `bwrap` 此功能: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` 本身,不适用于在沙箱内运行的命令。重新加载 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 使用 PowerShell 中的 `wsl -l -v` 检查你的 WSL 版本。如果你看到 `Sandboxing requires WSL2`,你的发行版运行的是 WSL1。将其升级到 WSL2 或在没有沙箱的情况下运行 Claude Code。180 在 PowerShell 中使用 `wsl -l -v` 检查您的 WSL 版本。如果看到 `Sandboxing requires WSL2`,则说明您的发行版运行的是 WSL1。请将其升级到 WSL2,或在不使用沙箱隔离的情况下运行 Claude Code。
125 181
126 在 WSL2 上,WSL 通过 Unix 套接字将 Windows 二进制文件(如 `cmd.exe`、`powershell.exe` 或 `/mnt/c/` 下的任何内容)的启动交给 Windows 主机,因此沙箱化命令是否可以启动一个取决于沙箱的 [Unix 套接字设置](/docs/zh-CN/settings-reference#sandbox-network-allowunixsockets):必须安装可选的 seccomp 过滤器才能首先阻止套接字。要允许这些启动,请设置 `allowAllUnixSockets`;要将它们完全排除在沙箱外,请将命令添加到 [`excludedCommands`](/docs/zh-CN/settings-reference#sandbox-excludedcommands)。182 在 WSL2 上,WSL 会通过 Unix 套接字将 Windows 二进制文件(例如 `cmd.exe`、`powershell.exe` 或 `/mnt/c/` 下的任何内容)的启动交给 Windows 主机处理,因此沙箱命令能否启动这些程序取决于沙箱的 [Unix 套接字设置](/docs/zh-CN/settings-reference#sandbox-network-allowunixsockets):必须先安装可选的 seccomp 过滤器,才能阻止该套接字。要允许这些启动,请设置 `allowAllUnixSockets`,这会向沙箱命令开放所有 Unix 套接字。
127 </Accordion>183 </Accordion>
128</AccordionGroup>184</AccordionGroup>
129 185
131 沙箱模式187 沙箱模式
132</h3>188</h3>
133 189
134Claude Code 提供两种沙箱模式。在两种模式中,沙箱都强制执行相同的文件系统和网络限制;区别仅在于沙箱化命令是自动批准还是需要明确权限。190Claude Code 提供两种沙箱模式。在这两种模式下,沙箱都会强制执行相同的文件系统和网络限制;区别仅在于沙箱命令是自动批准还是需要明确的权限。
135 191
136<h4 id="auto-allow-mode">192<h4 id="auto-allow-mode">
137 自动允许模式193 自动允许模式
138</h4>194</h4>
139 195
140当命令可以沙箱化时,Claude Code 在沙箱内运行它并自动批准,无需询问你的权限。无法沙箱化的命令(例如需要访问非允许主机的网络访问的命令)会回退到常规权限流程,其中 Claude Code 检查你的 [权限规则](/docs/zh-CN/permissions) 并为这些规则不允许的任何命令提示,在 Manual 模式下提示。196当命令在沙箱内运行时,Claude Code 会自动批准该命令,不会提示。当命令因匹配 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands) 或因 Claude [在沙箱外重试](#the-unsandboxed-retry-escape-hatch)而在沙箱外运行时,它会经过常规的[权限流程](/docs/zh-CN/permissions)。
197
198连接到您未允许的主机的沙箱命令仍会留在沙箱中。[允许域名之外的主机](#hosts-outside-your-allowed-domains)介绍了由谁决定是否放行该连接。
141 199
142即使在自动允许模式下,以下仍然适用:200即使在自动允许模式下,以下规则仍然适用:
143 201
144* 显式 [拒绝规则](/docs/zh-CN/permissions) 始终被尊重202* 始终遵守明确的[拒绝规则](/docs/zh-CN/permissions)
145* 针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 或 `rmdir` 命令仍会通过常规权限流程203* 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的 `rm` 或 `rmdir` 命令仍会经过常规权限流程
146* 内容范围的 [询问规则](/docs/zh-CN/permissions)(如 `Bash(git push *)`)仍会强制提示,即使对于沙箱化命令204* 限定内容范围的[询问规则](/docs/zh-CN/permissions)(如 `Bash(git push *)`)即使对沙箱命令也仍会强制提示
147* 裸 `Bash` 询问规则,或等效的 `Bash(*)` 形式,对于运行沙箱化的命令会被跳过;它仍然适用于回退到常规权限流程的命令。在 [Plan Mode](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode) 中,该规则不会被跳过:它也会对沙箱化命令提示,包括只读命令。在 v2.1.212 之前,跳过也适用于 Plan Mode205* 单独的 `Bash` 询问规则或等效的 `Bash(*)` 形式,对于在沙箱中运行的命令会被跳过;对于回退到常规权限流程的命令仍然适用。在[计划模式](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)下,该规则不会被跳过:它同样会对沙箱命令进行提示,包括只读命令
148 206
149<Info>207<Info>
150 自动允许模式独立于你的权限模式设置工作,除了在 [Plan Mode](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode) 中,以及在自动模式中,对于携带 [per-command allowed domains](#per-command-allowed-domains-in-auto-mode) 的命令,以及 [服务器端分类器审查](/docs/zh-CN/permission-modes#how-the-classifier-evaluates-actions) 自动模式中的沙箱化命令。即使你不在"接受编辑"模式中,启用自动允许时沙箱化的 Bash 命令也会自动运行。这意味着在沙箱边界内修改文件的 Bash 命令将执行而不提示,即使在 Manual 模式下,文件编辑工具会提示。208 自动允许模式独立于您的权限模式设置运行,但有三个例外:[计划模式](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)、带有[每命令允许域名](#per-command-allowed-domains-in-auto-mode)的自动模式命令,以及自动模式下对沙箱命令的[服务器端分类器审查](/docs/zh-CN/permission-modes#how-the-classifier-evaluates-actions)。即使您未处于"接受编辑"模式,启用自动允许后,沙箱 Bash 命令也会自动运行。这意味着,即使在 Manual 模式下(此时文件编辑工具会提示),在沙箱边界内修改文件的 Bash 命令也会在不提示的情况下执行。
151 209
152 在 Plan Mode 中,自动允许不会扩大批准;请参阅 [Plan Mode](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode) 了解 Claude Code 如何在你计划时限制命令。在 v2.1.212 之前,自动允许在 Plan Mode 中也无需提示地运行沙箱化命令。210 在计划模式下,自动允许不会扩大批准范围;有关 Claude Code 在您制定计划时如何管控命令,请参阅[计划模式](/docs/zh-CN/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 命令都通过常规权限流程,即使沙箱化也是如此。这提供了更多控制,但需要更多批准。217所有 Bash 命令都会经过常规权限流程,即使在沙箱中也是如此。这提供了更多控制,但需要更多批准。
160 218
161<h4 id="the-unsandboxed-retry-escape-hatch">219<h4 id="the-unsandboxed-retry-escape-hatch">
162 非沙箱化重试逃生舱220 沙箱外重试逃生通道
221</h4>
222
223沙箱外重试是为在沙箱内失败的命令(例如与沙箱不兼容的工具)提供的逃生通道。当沙箱阻止网络连接时,Claude Code 会在命令结果中指明被拒绝的主机,从而让 Claude 了解被阻止的内容。Claude 会分析失败原因,并可能使用 `dangerouslyDisableSandbox` 参数重试该命令。
224
225重试的命令在沙箱外运行。在交互式终端会话中,由谁批准取决于您的权限模式:
226
227* **`bypassPermissions` 模式**:重试在不提示的情况下运行
228* **Manual 模式和 `acceptEdits` 模式**:您会收到标题为"Bash command (unsandboxed)"的提示
229* **[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)**:由一个独立的分类器模型评估底层命令
230* **`dontAsk` 模式**:Claude Code 拒绝该重试
231* **计划模式**:请参阅 [Claude Code 在您制定计划时如何管控命令](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)
232
233以下规则和设置会改变由谁批准重试:
234
235* **匹配的允许规则**:如果诸如 `Bash(curl *)` 之类的允许规则与命令匹配,它也会批准重试,因此该命令会在沙箱外运行且不提示
236* **针对该参数的询问规则**:为 `Bash(dangerouslyDisableSandbox:true)` 添加[询问规则](/docs/zh-CN/permissions#match-by-input-parameter),即可在 Bash 重试时收到提示。在自动模式和 `bypassPermissions` 模式下您也会收到提示,并且该规则优先于匹配的允许规则
237* **[`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-CN/settings-reference#permissions-blockreadsoutsideworkingdirectories)**:[任何模式都不会自动批准的操作](/docs/zh-CN/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某些命令根本无法在沙箱内运行,例如与其不兼容的工具或需要你未允许的主机的工具。Claude Code 在被阻止命令的结果中报告沙箱违规,命名沙箱拒绝的路径或主机,因此 Claude 看到沙箱阻止了什么。与其让任务失败或要求你关闭沙箱,Claude Code 包括一个逃生舱:Claude 分析违规并可能使用 `dangerouslyDisableSandbox` 参数重试命令。243您可以在[沙箱设置](/docs/zh-CN/settings-reference#sandbox-settings)中设置 `"allowUnsandboxedCommands": false` 来禁用沙箱外重试。禁用重试后,Claude Code 会忽略 `dangerouslyDisableSandbox` 参数。此后,在沙箱运行期间,Claude 运行的命令都会在沙箱中执行,除非它们匹配 `excludedCommands` 条目。要防止 Claude Code 在沙箱无法启动时在沙箱外运行命令,还需设置 [`failIfUnavailable`](/docs/zh-CN/settings-reference#sandbox-failifunavailable)。`/sandbox` 的 **Overrides** 选项卡将此设置显示为 **Strict sandbox mode**。
166 244
167重试的命令在沙箱外运行,因此通过常规权限流程进行。在 Manual 模式下你会获得确认提示。在 [自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 中,分类器评估基础命令。当 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-CN/settings-reference#permissions-blockreadsoutsideworkingdirectories) 打开时,需要批准才能在沙箱外运行的重试会提示你。要在自动模式下的每次非沙箱化重试时都被提示,请为 `Bash(dangerouslyDisableSandbox:true)` 添加一个 [询问规则](/docs/zh-CN/permissions#match-by-input-parameter)。245即使项目设置中设置了 `true`,在您的用户设置、`--settings` 或托管设置中设置的 `false` 仍然有效。用户设置中的 `false` 不会使沙箱成为管理员强制要求的,因此项目的其他沙箱设置仍然适用。在 v2.1.285 之前,项目的 `true` 会覆盖您用户设置中的 `false`。
168 246
169你可以通过在 [沙箱设置](/docs/zh-CN/settings-reference#sandbox-settings) 中设置 `"allowUnsandboxedCommands": false` 来禁用此逃生舱。禁用逃生舱后,Claude Code 忽略 `dangerouslyDisableSandbox` 参数,Claude 运行的每个命令都必须沙箱化运行,除非你已在 `excludedCommands` 中列出它。`/sandbox` **Overrides** 选项卡将此设置显示为 **Strict sandbox mode**。247如果您或您的管理员在托管设置中或通过 `--settings` 标志禁用了重试,沙箱将成为管理员强制要求的。此时 Claude Code 会忽略仓库文件中放宽沙箱的设置,包括 `excludedCommands` 条目。[管理员强制沙箱下的仓库设置](#repository-settings-under-an-admin-required-sandbox)列出了这些设置。
170 248
171严格沙箱模式适用于 Claude 运行的命令。你在 [`!` shell-mode 提示符](/docs/zh-CN/interactive-mode#shell-mode-with-prefix) 处自己输入的命令在沙箱外运行,除非会话是以下之一:249严格沙箱模式适用于 Claude 运行的命令。您自己在 [`!` shell 模式提示符](/docs/zh-CN/interactive-mode#shell-mode-with-prefix)处输入的命令会在沙箱外运行,除非会话属于以下情况之一:
172 250
173* **一个 [后台会话](/docs/zh-CN/agent-view)**:严格沙箱模式也覆盖 shell-mode 命令251* **[后台会话](/docs/zh-CN/agent-view)**:严格沙箱模式也涵盖 shell 模式命令
174* **一个设置了 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-CN/env-vars#variables) 的 Linux 会话**:每个命令都沙箱化运行,包括 shell-mode 命令252* **设置了 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-CN/env-vars#variables) 的 Linux 会话**:所有命令都在沙箱中运行,包括 shell 模式命令
175 253
176在 v2.1.260 之前,严格沙箱模式在每个会话中沙箱化 shell-mode 命令。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会话临时目录在沙箱内默认可写,与工作目录一起。除非你 [禁用文件系统隔离](#disable-filesystem-isolation),Claude Code 为沙箱化命令设置 `$TMPDIR` 为此目录,因此写入临时文件的工具无需额外配置即可工作。非沙箱化命令继承你的 shell 的 `$TMPDIR` 不变,因此当文件系统隔离打开时,沙箱化和非沙箱化命令将 `$TMPDIR` 解析为不同的目录。如果你的 shell 将 `$TMPDIR` 留空或未设置,引用 `$TMPDIR` 的非沙箱化命令会接收你的 [`CLAUDE_CODE_TMPDIR`](/docs/zh-CN/env-vars) 覆盖,或当你未设置覆盖或覆盖是长路径时接收操作系统的临时目录,因此变量不会展开为空字符串。要在两者之间传递临时文件,请改为在工作目录下写入它们。260默认情况下,除工作目录外,每用户临时目录在沙箱内也是可写的。除非您[禁用文件系统隔离](#disable-filesystem-isolation),否则 Claude Code 会为沙箱命令将 `$TMPDIR` 设置为此目录,因此写入临时文件的工具无需额外配置即可正常工作。
261
262沙箱外命令在您的 shell 设置了 `$TMPDIR` 时会继承该值,因此在启用文件系统隔离时,沙箱命令和沙箱外命令会将 `$TMPDIR` 解析为不同的目录。如果您的 shell 未设置 `$TMPDIR` 或将其设为空,引用 `$TMPDIR` 的沙箱外命令会获得您的 [`CLAUDE_CODE_TMPDIR`](/docs/zh-CN/env-vars) 覆盖值;如果您未设置该覆盖值或覆盖值是一个较长的路径,则会获得操作系统的临时目录,因此该变量不会展开为空字符串。要在两者之间传递临时文件,请改为将其写入工作目录下。
183 263
184<h2 id="configure-sandboxing">264<h2 id="configure-sandboxing">
185 配置沙箱265 配置沙箱隔离
186</h2>266</h2>
187 267
188通过 `settings.json` 文件自定义沙箱行为。有关完整的配置参考,请参阅 [Settings](/docs/zh-CN/settings-reference#sandbox-settings)。268通过 `settings.json` 文件自定义沙箱行为。完整的配置参考请参阅[设置](/docs/zh-CN/settings-reference#sandbox-settings)。
189 269
190默认情况下,沙箱化命令可以写入当前工作目录、会话临时目录以及任何[你已添加](/docs/zh-CN/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-CN/permissions#additional-directories-grant-file-access-not-configuration)。如果 `kubectl`、`terraform` 或 `npm` 等子进程命令需要写入这些目录之外的位置,请使用 `sandbox.filesystem.allowWrite` 授予对特定路径的访问权限:
191 271
192```json theme={null}272```json theme={null}
193{273{
200}280}
201```281```
202 282
203这些路径在操作系统级别强制执行,因此在沙箱内运行的所有命令(包括其子进程)都尊重它们。这是推荐的方法,当工具需要对特定位置的写入访问时,而不是使用 `excludedCommands` 将工具从沙箱中完全排除。283这些路径在操作系统层面强制执行,因此在沙箱内运行的所有命令(包括其子进程)都会遵守这些限制。当某个工具需要对特定位置的写入权限时,推荐使用这种方法,而不是使用 `excludedCommands` 将该工具完全排除在沙箱之外。
204
205当在多个 [settings scopes](/docs/zh-CN/settings#settings-precedence) 中定义相同的文件系统数组时,Claude Code 会合并它们,组合来自每个范围的路径,而不是用另一个范围的数组替换一个范围的数组。
206 284
207如果你在 CLI 上使用 [`--setting-sources`](/docs/zh-CN/cli-reference) 或在 Agent SDK 中使用 [`settingSources`](/docs/zh-CN/agent-sdk/claude-code-features#control-filesystem-settings-with-settingsources) 排除一个源,Claude Code 会在构建沙箱配置时忽略其 `sandbox.filesystem` 条目、其 `Edit` 权限规则以及其 `Read` 拒绝规则。需要 Claude Code v2.1.246 或更高版本。285当您在多个[设置作用域](/docs/zh-CN/settings#settings-precedence)中定义同一个文件系统数组时,Claude Code 会将它们合并,组合来自每个作用域的路径,而不是用一个作用域的数组替换另一个作用域的数组。
208 286
209当你在会话期间编辑这些文件系统列表时,Claude Code [将更改应用于运行中的会话](/docs/zh-CN/settings#when-edits-take-effect),因此下一个沙箱化命令在新路径下运行。287如果您在 CLI 上使用 [`--setting-sources`](/docs/zh-CN/cli-reference) 或在 Agent SDK 中使用 [`settingSources`](/docs/zh-CN/agent-sdk/claude-code-features#control-filesystem-settings-with-settingsources) 排除了某个来源,Claude Code 在构建沙箱配置时会忽略该来源的 `sandbox.filesystem` 条目、`Edit` 权限规则以及 `Read` 拒绝规则。需要 Claude Code v2.1.246 或更高版本。
210 288
211路径前缀控制路径的解析方式:289当您在会话期间编辑这些文件系统列表时,Claude Code 会[将更改应用到正在运行的会话](/docs/zh-CN/settings#when-edits-take-effect),因此下一条沙箱命令将在新路径下运行。
212
213| 前缀 | 含义 | 示例 |
214| :- | :- | :- |
215| `/` | 从文件系统根目录的绝对路径 | `/tmp/build` 保持 `/tmp/build` |
216| `~/` | 相对于主目录 | `~/.kube` 变为 `$HOME/.kube` |
217| `./` 或无前缀 | 对于项目设置相对于项目根目录,或对于用户设置相对于 `~/.claude` | `.claude/settings.json` 中的 `./output` 解析为 `<project-root>/output` |
218 290
219此语法与 [Read and Edit permission rules](/docs/zh-CN/permissions#read-and-edit) 不同,后者使用 `//path` 表示绝对路径,`/path` 表示项目相对路径。沙箱文件系统路径使用标准约定:`/tmp/build` 是绝对路径。有关 Claude Code 如何处理这些路径中的尾部斜杠或通配符,请参阅 [Sandbox path prefixes](/docs/zh-CN/settings-reference#sandbox-path-prefixes)。291沙箱文件系统路径使用标准约定:`/tmp/build` 是绝对路径,`~/.kube` 相对于您的主目录。这与 [Read 和 Edit 权限规则](/docs/zh-CN/permissions#read-and-edit)不同,后者使用 `//path` 表示绝对路径,使用 `/path` 表示相对于项目的路径。有关相对路径、末尾斜杠和通配符,请参阅[沙箱路径前缀](/docs/zh-CN/settings-reference#sandbox-path-prefixes)。
220 292
221你也可以使用 `sandbox.filesystem.denyWrite` 和 `sandbox.filesystem.denyRead` 拒绝写入或读取访问,以及使用 `sandbox.filesystem.allowRead` 重新允许被拒绝区域内的特定路径。当读取规则重叠时,更具体的路径获胜:293您还可以使用 `sandbox.filesystem.denyWrite` 和 `sandbox.filesystem.denyRead` 拒绝写入或读取访问,并使用 `sandbox.filesystem.allowRead` 在被拒绝的区域内重新允许特定路径。当读取规则重叠时,路径范围更窄的规则生效:
222 294
223| 示例规则 | 结果 |295| 示例规则 | 结果 |
224| :- | :- |296| :- | :- |
225| `"denyRead": ["~/"]` 与 `"allowRead": ["~/projects"]` | `~/projects` 可读,主目录的其余部分保持被阻止。更窄的允许重新打开被拒绝区域的该部分 |297| `"denyRead": ["~/"]` 搭配 `"allowRead": ["~/projects"]` | `~/projects` 可读,主目录的其余部分仍被阻止。范围更窄的允许规则重新开放了被拒绝区域中的这一部分 |
226| `"allowRead": ["~/"]` 与 `"denyRead": ["~/.env"]` | `~/.env` 保持被阻止,主目录的其余部分可读。精确的拒绝在更广泛的允许内部保持有效,因此广泛的允许无法悄悄地重新暴露秘密 |298| `"allowRead": ["~/"]` 搭配 `"denyRead": ["~/.env"]` | `~/.env` 仍被阻止,主目录的其余部分可读。拒绝规则在更宽的允许规则内依然有效,因此宽泛的允许规则不会悄无声息地重新暴露机密 |
227| `"allowRead": ["~/"]` 与 `"denyRead": ["~/**/.env"]` | 主目录下的每个 `.env` 保持被阻止,其余部分可读。[通配符拒绝](/docs/zh-CN/settings-reference#sandbox-path-prefixes)在更广泛的允许内部保持有效,就像精确路径一样 |299| `"allowRead": ["~/"]` 搭配 `"denyRead": ["~/**/.env"]` | 主目录下的每个 `.env` 都仍被阻止,其余部分可读。[通配符拒绝规则](/docs/zh-CN/settings-reference#sandbox-path-prefixes)在更宽的允许规则内的效果与精确路径相同 |
228 300
229下面的示例阻止从整个主目录读取,同时仍允许从当前项目读取。将其放在你的项目的 `.claude/settings.json` 中,因为相对路径 `.` 仅在配置位于项目设置中时才解析为项目根目录:301下面的示例阻止读取整个主目录,同时仍允许读取当前项目。请将其放在项目的 `.claude/settings.json` 中,因为只有当配置位于项目设置中时,相对路径 `.` 才会解析为项目根目录:
230 302
231```json theme={null}303```json theme={null}
232{304{
240}312}
241```313```
242 314
243如果你将相同的配置放在 `~/.claude/settings.json` 中,`.` 将解析为 `~/.claude`,项目文件将保持被 `denyRead` 规则阻止。315如果您将相同的配置放在 `~/.claude/settings.json` 中,`.` 将解析为 `~/.claude`,项目文件将仍被 `denyRead` 规则阻止。
316
317要拒绝沙箱命令对主目录和挂载卷的读取访问,同时保持工作目录可读,请设置 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-CN/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-CN/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-CN/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-CN/settings-reference#sandbox-excludedcommands)列出了更多会保持在沙箱中的调用
342* **条目的保存位置可能很重要**:当沙箱为[管理员强制要求](#repository-settings-under-an-admin-required-sandbox)时,Claude Code 会忽略 `.claude/settings.json` 和 `.claude/settings.local.json` 中的条目
244 343
245要拒绝沙箱化命令对主目录和挂载卷的读取访问,同时保持工作目录可读,请改为设置 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-CN/settings-reference#permissions-blockreadsoutsideworkingdirectories),而不是编写路径规则。344被排除的命令会经过常规的权限流程:
345
346* [只读命令](/docs/zh-CN/permissions#read-only-commands)以及您的允许规则所覆盖的命令无需确认提示即可运行
347* 在自动模式下,分类器会审查其他被排除的命令
348* 在 `bypassPermissions` 模式下,被排除的命令无需确认提示即可运行,除非有询问规则与之匹配
349
350要确认某个条目是否匹配,请切换到 Manual 模式,并让 Claude 运行一条会更改内容的匹配命令,例如 `docker compose up -d`。权限提示的标题为“Bash command (unsandboxed)”。
351
352<Warning>
353 被排除的命令以您的全部访问权限运行。诸如 `docker *` 这样宽泛的条目涵盖了该工具能做的一切。如果您编写的模式涵盖了解释器、工作目录中的脚本,或者作用于该目录中某个文件的工具(正如 `docker compose` 作用于其 compose 文件那样),Claude 就可以写入该文件,然后在沙箱外运行它。范围更窄的模式会减少 Claude 可以在沙箱外运行的内容。
354</Warning>
246 355
247<h3 id="disable-filesystem-isolation">356<h3 id="disable-filesystem-isolation">
248 禁用文件系统隔离357 禁用文件系统隔离
249</h3>358</h3>
250 359
251设置 `sandbox.filesystem.disabled` 为 `true` 以跳过文件系统隔离,同时保持网络隔离。下面的示例关闭文件系统隔离,同时保持网络域的允许列表:360将 `sandbox.filesystem.disabled` 设置为 `true` 可跳过文件系统隔离,同时保留网络隔离。下面的示例关闭了文件系统隔离,同时保留网络域名的允许列表:
252 361
253```json theme={null}362```json theme={null}
254{363{
264}373}
265```374```
266 375
267沙箱有两个独立的层:[文件系统隔离](#filesystem-isolation)控制沙箱化命令可以读写哪些路径,[网络隔离](#network-isolation)控制它们可以到达哪些域。关闭文件系统层后,沙箱化命令获得对主机文件系统的无限制读写访问权限,同时其网络出站流量仍然限制在你允许的域内。当你沙箱化以控制命令连接的位置而不是它们写入的内容时,请关闭该层。376沙箱有两个相互独立的层:[文件系统隔离](#filesystem-isolation)控制沙箱命令可以读写哪些路径,[网络隔离](#network-isolation)控制它们可以访问哪些域名。关闭文件系统层后,沙箱命令将获得对主机文件系统不受限制的读写访问权限,而其网络出站流量仍限于您允许的域名。当您使用沙箱的目的是控制命令连接到哪里,而不是控制它们写入什么时,请关闭该层。
268 377
269该设置默认关闭,适用于沙箱运行的平台:macOS、Linux 和 WSL2。需要 Claude Code v2.1.216 或更高版本。378`sandbox.filesystem.disabled` 默认为 `false`。需要 Claude Code v2.1.216 或更高版本。
270 379
271<Warning>380<Warning>
272 关闭文件系统隔离且命令自动允许时,沙箱化命令可以写入文件,这些文件稍后可能被其他命令运行或读取,例如 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) 锁定网络域名可以降低风险,但无法消除风险,因为该锁定仅适用于在沙箱内运行的命令。
273</Warning>382</Warning>
274 383
275<h4 id="which-settings-can-disable-it">384<h4 id="which-settings-can-disable-it">
276 哪些设置可以禁用它385 哪些设置可以禁用它
277</h4>386</h4>
278 387
279由于关闭文件系统隔离会扩大沙箱化命令可以做的事情,Claude Code 仅从这些设置源中遵守 `filesystem.disabled`:388由于关闭文件系统隔离会扩大沙箱命令的能力范围,Claude Code 仅接受来自以下设置来源的 `filesystem.disabled`:
280
281* 用户设置、托管设置和 `--settings` CLI 标志可以设置它。`.claude/settings.json` 和 `.claude/settings.local.json` 中的项目设置不能,因此已检出的项目无法关闭文件系统隔离。
282* 当托管设置配置 `sandbox.filesystem` 时,或列出任何 `sandbox.credentials.files` 条目且 `"mode": "deny"` 时,仅托管设置可以设置该键。这保持管理员部署的文件系统限制有效;要放松此类部署,请在托管设置中设置 `"disabled": true`。
283* 当设置 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-CN/env-vars) 时,Claude Code 会忽略来自每个源(包括托管设置)的 `filesystem.disabled`,并保持文件系统隔离开启。
284 389
285托管 `credentials.files` 条目是否固定 `filesystem.disabled`(将键锁定到托管设置,以便开发人员无法关闭文件系统隔离)取决于条目的 `mode` 以及沙箱启动时条目发生的情况:390* 用户设置、托管设置和 `--settings` CLI 标志可以设置它。`.claude/settings.json` 和 `.claude/settings.local.json` 中的项目设置不能设置它,因此检出的项目无法关闭文件系统隔离。
391* 当托管设置配置了任何 `sandbox.filesystem` 内容,或列出了任何 `"mode": "deny"` 的 `sandbox.credentials.files` 条目时,只有托管设置可以设置该键。这可确保管理员部署的文件系统限制保持有效;要放宽此类部署,请在托管设置中设置 `"disabled": true`。
392* 当设置了 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-CN/env-vars) 时,Claude Code 会忽略来自所有来源(包括托管设置)的 `filesystem.disabled`,并保持文件系统隔离开启。
286 393
287| 托管条目 | 固定 `filesystem.disabled` | 隔离关闭时保护文件的内容 |394[有效的](/docs/zh-CN/settings-reference#invalid-credential-entries-in-managed-settings) `mask` 条目不会锁定该键,即使 Claude Code 在启动时对其[回退为 `deny`](#mask-credential-files) 也是如此。请将无法掩码的路径(例如凭据目录)在托管设置中列为显式的 `deny` 条目,这样会锁定该键。
288| - | - | - |
289| `"mode": "deny"` | 是 | 无:读取块是文件系统层的一部分 |
290| `"mode": "mask"`,应用为掩盖 | 否 | 掩盖本身:Linux 和 WSL2 上的[哨兵副本和代理](#mask-credential-files),macOS 上沙箱自己的读取规则 |
291| `"mode": "mask"`,[在设置时回退到 `deny`](#mask-credential-files) | 否 | 无,与 `deny` 相同。将无法掩盖的路径(如目录)列为显式 `deny` 条目,这会固定该键 |
292| `"mode": "mask"`,[由验证降级为 `deny`](/docs/zh-CN/managed-settings#invalid-entries-in-managed-settings) | 是,如显式 `deny` | 无,与 `deny` 相同 |
293
294回退发生在沙箱启动时,在 Claude Code 已读取设置后,固定检查运行,因此回退条目永远不会固定。验证在设置加载时将无效条目重写为 `deny`,因此降级条目的固定方式与你写为 `deny` 的条目相同。
295 395
296<h4 id="what-changes-when-filesystem-isolation-is-off">396<h4 id="what-changes-when-filesystem-isolation-is-off">
297 文件系统隔离关闭时的变化397 关闭文件系统隔离后的变化
298</h4>398</h4>
299 399
300设置 `filesystem.disabled` 会解除文件系统层本身强制执行的保护。其他层强制执行的保护继续适用:400设置 `filesystem.disabled` 会解除文件系统层本身强制执行的保护。由其他层强制执行的保护仍然有效:
301 401
302| 保护 | 文件系统隔离关闭时 |402| 保护 | 文件系统隔离关闭时 |
303| - | - |403| - | - |
304| `filesystem.denyRead` 和 [`credentials.files`](#protect-credentials) `deny` 读取块 | 未强制执行。文件系统层应用两者 |404| `filesystem.denyRead` 和 [`credentials.files`](#protect-credentials) `deny` 读取阻止 | 不强制执行。两者都由文件系统层应用 |
305| `credentials.envVars` `deny` 和 `mask` 条目 | 强制执行。环境变量清理独立于文件系统层 |405| `credentials.envVars` `deny` 和 `mask` 条目 | 强制执行。环境变量清除独立于文件系统层 |
306| [`credentials.files` `mask` 条目](#mask-credential-files)应用为掩盖 | 强制执行:掩盖独立于文件系统层。[回退到 `deny`](#mask-credential-files) 的条目未被强制执行,如任何 `deny` 条目 |406| 以掩码方式应用的 [`credentials.files` `mask` 条目](#mask-credential-files) | 强制执行:掩码独立于文件系统层。[已回退为 `deny`](#mask-credential-files) 的条目与任何 `deny` 条目一样不强制执行 |
307 407
308另外两件事会改变:408另外还有两项变化:
309 409
310* 沙箱化命令继承你的 shell 的 `$TMPDIR`,而不是会话临时目录,因为每个临时目录都是可写的,Claude Code 不再将命令重定向到会话临时目录。410* 沙箱命令会继承您 shell 的 `$TMPDIR`,而不是每用户临时目录,因为所有临时目录都可写,Claude Code 不再将命令重定向到每用户临时目录。
311 411
312 在 Linux 上,该变量通常在父 shell 中未设置。Bash 工具指导告诉 Claude 使用 `mktemp -d` 创建临时目录,而不是依赖 `$TMPDIR`。412 在 Linux 上,父 shell 中通常未设置该变量。Bash 工具指引会告诉 Claude 使用 `mktemp -d` 创建临时工作目录,而不是依赖 `$TMPDIR`。
313* [`autoAllowBashIfSandboxed`](/docs/zh-CN/settings-reference#sandbox-autoallowbashifsandboxed) 仍默认为 `true`,因此沙箱化命令继续运行而无需提示。设置为 `false` 以提示沙箱化命令。413* [`autoAllowBashIfSandboxed`](/docs/zh-CN/settings-reference#sandbox-autoallowbashifsandboxed) 默认仍为 `true`,因此沙箱命令会继续在无确认提示的情况下运行。将其设置为 `false` 可对沙箱命令进行确认提示。
314 414
315<h3 id="protect-credentials">415<h3 id="protect-credentials">
316 保护凭证416 保护凭据
317</h3>417</h3>
318 418
319`sandbox.credentials` 设置声明凭证文件和环境变量,以保护其免受沙箱化命令的访问。每个条目命名一个文件路径或环境变量以及一个 `mode`。专用的 `credentials` 块将凭证规则分组在一起,并与常规文件系统规则分开。419`sandbox.credentials` 设置声明需要防范沙箱命令访问的凭据文件和环境变量。每个条目指定一个文件路径或一个环境变量以及一个 `mode`。专用的 `credentials` 块使凭据规则集中在一起,并与通用文件系统规则分开。
320 420
321对于 `"mode": "deny"` 的条目,文件路径在沙箱内被拒绝读取,与 `filesystem.denyRead` 应用的限制相同,环境变量在每个沙箱化命令运行前被取消设置。文件保护是文件系统层的一部分,因此如果你[禁用文件系统隔离](#disable-filesystem-isolation),它不适用;环境变量保护仍然适用。421对于 `"mode": "deny"` 的条目,文件路径在沙箱内被拒绝读取(与 `filesystem.denyRead` 施加的限制相同),环境变量则在每条沙箱命令运行前被取消设置。文件保护属于文件系统层,因此如果您[禁用文件系统隔离](#disable-filesystem-isolation),它将不再生效;而环境变量保护仍然有效。
322 422
323下面的示例阻止读取 AWS 凭证文件和 SSH 目录,并从沙箱化命令的环境中删除 `GITHUB_TOKEN` 和 `NPM_TOKEN`:423下面的示例阻止读取 AWS 凭据文件和 SSH 目录,并从沙箱命令的环境中移除 `GITHUB_TOKEN` 和 `NPM_TOKEN`:
324 424
325```json theme={null}425```json theme={null}
326{426{
340}440}
341```441```
342 442
343环境变量条目和文件条目也接受 `"mode": "mask"`,如下所述 [Mask credentials](#mask-credentials)。443环境变量条目和文件条目也接受 `"mode": "mask"`,详见[掩码凭据](#mask-credentials)。
344 444
345文件路径遵循与 `sandbox.filesystem.*` 设置相同的[前缀规则](/docs/zh-CN/settings-reference#sandbox-path-prefixes)。445文件路径遵循与 `sandbox.filesystem.*` 设置相同的[前缀规则](/docs/zh-CN/settings-reference#sandbox-path-prefixes)。
346 446
347Claude Code 合并来自会话加载的每个 [settings scope](/docs/zh-CN/settings#settings-precedence) 的 `deny` 条目。`deny` 条目只会缩小访问权限,因此任何范围都可以添加一个,但没有任何范围可以删除另一个范围添加的条目。447Claude Code 会合并会话所加载的每个[设置作用域](/docs/zh-CN/settings#settings-precedence)中的 `deny` 条目。`deny` 条目只会收窄访问权限,因此任何作用域都可以添加此类条目,但任何作用域都无法移除其他作用域添加的条目。
348 448
349当你[排除一个设置源](#configure-sandboxing)时:449当您[排除某个设置来源](#configure-sandboxing)时:
350 450
351* **项目或本地设置**:Claude Code 不应用它们的任何 `credentials` 条目。需要 Claude Code v2.1.246 或更高版本。451* **项目或本地设置**:Claude Code 不会应用其中的任何 `credentials` 条目。需要 Claude Code v2.1.246 或更高版本。
352* **用户设置**: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)。
353 453
354没有内置的凭证拒绝列表,因此只有你列出的文件和变量被限制。454没有内置的凭据拒绝列表,因此只有您列出的文件和变量会受到限制。
355 455
356`sandbox.credentials` 仅影响沙箱化的 Bash 命令。要从所有子进程中删除凭证,无论是否进行沙箱处理,请设置 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-CN/env-vars)。456`sandbox.credentials` 仅影响沙箱中的 Bash 命令。要从所有子进程中清除凭据(无论是否使用沙箱),请设置 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-CN/env-vars)。
357 457
358<h3 id="mask-credentials">458<h3 id="mask-credentials">
359 掩盖凭证459 掩码凭据
360</h3>460</h3>
361 461
362掩盖比 [Protect credentials](#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),而不是对其进行掩码。
363
364<h4 id="mask-environment-variables">
365 掩盖环境变量
366</h4>
367
368`"mode": "mask"` 保护凭证,同时保持使用它进行身份验证的工具正常工作。`deny` 完全删除变量,这也会破坏需要它的工具,例如 `gh` 或 `npm`。需要 Claude Code v2.1.199 或更高版本。
369 463
370使用 `mask`,沙箱化命令看到的是每个会话的哨兵值,而不是真实值。每个 `mask` 条目可以列出 `injectHosts`,真实值被允许到达的主机。当请求离开沙箱前往其中一个主机时,[沙箱代理](#network-isolation)将哨兵值替换为真实值。命令及其记录的任何内容都不会持有真实凭证,但其请求仍然进行身份验证。464掩码环境变量需要 Claude Code v2.1.199 或更高版本。[`sandbox.credentials`](/docs/zh-CN/settings-reference#sandbox-credentials) 参考列出了所有字段。
371 465
372代理在请求内容中替换凭证,因此它必须看到它们。设置 [`network.tlsTerminate`](/docs/zh-CN/settings-reference#sandbox-network-tlsterminate) 以便代理自己终止 TLS。466掩码需要满足以下条件:
373 467
374没有它,掩盖会失败关闭:命令仍然只看到哨兵值,但哨兵值不变地到达服务器,身份验证失败。Claude Code 在启动时报告此配置错误。468* **TLS 终止**:代理在请求内容中替换真实值,因此它必须能够看到请求内容。请设置 [`network.tlsTerminate`](/docs/zh-CN/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-CN/settings-reference#sandbox-credentials-allowplaintextinject)、`awsPairs` 和 `sigv4`。它会忽略仓库的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的这些设置。当您的管理员通过服务器托管设置下发 `mask` 条目、`network.tlsTerminate` 或 `credentials.allowPlaintextInject` 时,它们属于[需要批准的设置](/docs/zh-CN/server-managed-settings#security-approval-dialogs)。
375 471
376替换涵盖标头和请求体。使用从凭证派生的签名进行身份验证的请求,而不是凭证本身,需要在代理处重新签名;[Re-sign AWS requests](#re-sign-aws-requests) 涵盖这对 AWS 的工作原理。472<h4 id="mask-environment-variables">
473 掩码环境变量
474</h4>
377 475
378代理仅在[域允许列表](#network-isolation)允许的连接上注入,因此每个 `injectHosts` 目标也必须通过 `network.allowedDomains` 可达。476要对环境变量进行掩码,请在其 `credentials.envVars` 条目上设置 `"mode": "mask"`。命令及其记录的任何日志都不会持有真实凭据,但其请求仍能通过身份验证。当同一变量在任何作用域中以 `deny` 列出时,`deny` 优先。
379 477
380下面的示例掩盖两个令牌。`GH_TOKEN` 仅在对 `api.github.com` 的请求上被替换,而 `NPM_TOKEN` 没有 `injectHosts`,在对 `network.allowedDomains` 中每个主机的请求上被替换。478下面的示例对两个令牌进行掩码。`GH_TOKEN` 仅在发往 `api.github.com` 的请求中被替换,而 `NPM_TOKEN` 没有 `injectHosts`,因此会在发往 `network.allowedDomains` 中每个主机的请求中被替换:
381 479
382```json theme={null}480```json theme={null}
383{481{
397}495}
398```496```
399 497
400<span id="ipv6-destinations-in-injecthosts" />在两个列表中以不同方式拼写 IPv6 目标,因为每个列表都有自己的匹配器:498默认情况下,掩码会替换整个值。对于具有结构的值(例如 `DATABASE_URL` 连接字符串或 JWT),请使用 [`extract`、`decode`、`maskClaims` 和 `onExtractNoMatch` 字段](/docs/zh-CN/settings-reference#sandbox-credentials-envvars),使解析该值的工具继续正常工作。
401
402* **`network.allowedDomains`**:[括号形式域列表使用](#ipv6-addresses-in-domain-lists),例如 `"[::1]"`。代理检查此列表以允许连接。
403* **`injectHosts`**:其规范压缩形式中的裸地址,例如 `"::1"` 或 `"2001:db8::1"`。代理将每个条目与连接的裸目标地址匹配,忽略端口,因此括号、区域 ID 或不同压缩的拼写永远不会匹配,代理永远不会在那里注入凭证。
404
405`claude doctor` 标记 `injectHosts` 条目,这些条目永远无法与警告 `Sandbox credential injectHosts entries can never match their destination` 匹配。此检查需要 Claude Code v2.1.229 或更高版本。
406 499
407与 `deny` 不同,掩盖授权代理将你的真实凭证发送到列出的主机,因此 Claude Code 仅从你或你的管理员控制的设置中遵守它:用户设置、托管设置和 `--settings` CLI 标志。Claude Code 忽略存储库的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的 `mask` 条目。在这些文件中,它也忽略 `network.tlsTerminate` 和 [`credentials.allowPlaintextInject`](/docs/zh-CN/settings-reference#sandbox-credentials-allowplaintextinject),允许代理将凭证注入未加密请求的设置。如果你[排除用户设置](#configure-sandboxing),Claude Code 也会删除 `~/.claude/settings.json` 中的环境变量 `mask` 条目。500<span id="ipv6-destinations-in-injecthosts" />对于 IPv6 目标,在两个列表中的地址写法不同:
408 501
409当你的管理员通过服务器托管设置交付 `mask` 条目、`network.tlsTerminate` 或 `credentials.allowPlaintextInject` 时,它们计为[需要批准的设置](/docs/zh-CN/server-managed-settings#security-approval-dialogs)。502* **`network.allowedDomains`**:使用方括号形式,例如 `"[::1]"`
503* **`injectHosts`**:使用规范压缩形式的裸地址,例如 `"::1"`
410 504
411当相同的变量在任何范围中以 `deny` 列出时,`deny` 优先。505代理将每个 `injectHosts` 条目与连接的裸目标地址进行匹配,忽略端口,因此带方括号、带区域 ID 或采用其他压缩方式的写法永远不会匹配。`claude doctor` 会使用警告 `Sandbox credential injectHosts entries can never match their destination` 标记永远无法匹配的条目。此检查需要 Claude Code v2.1.229 或更高版本。
412
413掩盖默认替换变量的整个值,这适合裸令牌。可选条目字段(需要 Claude Code v2.1.224 或更高版本)处理具有结构的值:
414
415* `extract`:Claude Code 在整个值上应用的正则表达式,仅替换每个匹配的第 1 组捕获的文本,因此解析值的工具(如 `DATABASE_URL` 连接字符串)仍在沙箱内工作。模式必须包含至少一个捕获组。
416* `onExtractNoMatch` 控制模式匹配不到任何内容时发生的情况:
417 * `warn`,默认值,警告并不掩盖地传递变量
418 * `deny` 在沙箱内取消设置变量
419 * `error` 停止沙箱设置,直到你修复配置
420* `decode: "jwt"`:对于持有 JSON Web Token (JWT) 的变量。Claude Code 验证值是 JWT 并将其替换为结构上有效的假令牌,因此沙箱内解码令牌的代码继续工作。添加 `maskClaims` 以列出要单独掩盖的顶级有效负载声明,而不是替换整个令牌;其他声明保持可读。当值未验证为 JWT 或没有列出的声明匹配时,Claude Code 会以警告不掩盖地传递变量。`decode` 不能与 `extract` 组合。
421
422有关完整字段列表,请参阅[设置参考中的 `credentials.envVars[]` 行](/docs/zh-CN/settings-reference#sandbox-settings)。
423 506
424<h4 id="re-sign-aws-requests">507<h4 id="re-sign-aws-requests">
425 重新签名 AWS 请求508 重新签名 AWS 请求
426</h4>509</h4>
427 510
428AWS 请求在请求内容上携带 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 处失败。
429
430当你掩盖它们的整个值时,Claude Code 会自动将常规 `AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY` 和 `AWS_SESSION_TOKEN` 变量链接到一个凭证中。如果你的 AWS 凭证位于其他名称的变量中,请使用 [`credentials.awsPairs`](/docs/zh-CN/settings-reference#sandbox-credentials-awspairs) 自己分组,这需要 Claude Code v2.1.224 或更高版本。此示例将配对添加到已掩盖 `MY_KEY_ID`、`MY_SECRET_KEY` 和 `MY_SESSION_TOKEN` 整个值的配置中,如上面的[掩盖配置](#mask-environment-variables)所示:
431
432```json theme={null}
433{
434 "sandbox": {
435 "credentials": {
436 "awsPairs": [
437 {
438 "accessKeyIdVar": "MY_KEY_ID",
439 "secretAccessKeyVar": "MY_SECRET_KEY",
440 "sessionTokenVar": "MY_SESSION_TOKEN"
441 }
442 ]
443 }
444 }
445}
446```
447
448每个条目遵循这些规则:
449 512
450* `accessKeyIdVar` 和 `secretAccessKeyVar` 命名持有访问密钥 ID 和秘密密钥的掩盖 `envVars` 条目。可选的 `sessionTokenVar` 命名持有临时凭证会话令牌的条目;设置时,代理在重新签名的请求上将真实令牌作为 `x-amz-security-token` 发送。513当您对常规的 `AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY` 和 `AWS_SESSION_TOKEN` 变量的整个值进行掩码时,Claude Code 会自动将它们关联为一个凭据。如果您的 AWS 凭据存储在其他名称的变量中,请使用 [`credentials.awsPairs`](/docs/zh-CN/settings-reference#sandbox-credentials-awspairs) 对它们进行分组,这需要 Claude Code v2.1.224 或更高版本。
451* 每个命名的变量必须是掩盖其整个值的 `mask` 条目,不带 `extract` 或 `decode`。
452* 代理在访问密钥 ID 条目的 `injectHosts` 中列出的主机上重新签名请求。
453* 在对中命名任何常规变量会替换自动配对。
454 514
455与 `mask` 条目一样,`awsPairs` 仅从用户设置、托管设置和 `--settings` CLI 标志中遵守。515流式上传、预签名 URL 和 SigV4A 请求携带代理无法重新计算的签名。当此类请求使用已掩码凭据对的占位符签名时,代理会使其失败,而不是转发损坏的签名。使用未掩码凭据签名的请求不受影响。请使用 [`credentials.sigv4`](/docs/zh-CN/settings-reference#sandbox-credentials-sigv4)(需要 Claude Code v2.1.224 或更高版本)来转发这些请求形式之一。AWS 仍会拒绝该请求,因此调用工具会收到 AWS 自身的拒绝响应,而不是代理错误。
456
457三种 AWS 请求形式携带代理无法重新计算的签名。当此类请求使用掩盖对的占位符签名时,代理会失败它而不是转发损坏的签名;使用未掩盖凭证签名的请求永远不会受到影响。[`credentials.sigv4`](/docs/zh-CN/settings-reference#sandbox-credentials-sigv4) 设置(需要 Claude Code v2.1.224 或更高版本)放松每种形式:将形式的键设置为 `passthrough` 会转发带有其占位符派生签名的请求,因此调用工具接收 AWS 自己的拒绝响应而不是代理错误。与 `awsPairs` 一样,`sigv4` 仅从用户设置、托管设置和 `--settings` CLI 标志中遵守。
458
459| 请求形式 | `sigv4` 键 | 代理无法重新签名的原因 |
460| :- | :- | :- |
461| aws-chunked 流式上传 | `streaming` | 每个块签名链接到种子签名,因此重新签名需要重写正文 |
462| 预签名 URL | `presigned` | 签名位于 URL 本身,没有 `Authorization` 标头 |
463| SigV4A 非对称签名 | `sigv4a` | 没有共享密钥 HMAC 可重新计算 |
464 516
465<h4 id="mask-credential-files">517<h4 id="mask-credential-files">
466 掩盖凭证文件518 掩码凭据文件
467</h4>519</h4>
468 520
469文件条目也接受 `"mode": "mask"`,这需要 Claude Code v2.1.221 或更高版本。沙箱化命令看到的内容取决于平台:521要对凭据文件进行掩码,请在其 `credentials.files` 条目上设置 `"mode": "mask"`。掩码文件需要 Claude Code v2.1.221 或更高版本。沙箱命令看到的内容取决于平台:
470
471* **Linux 和 WSL2**:沙箱化命令读取文件的哨兵副本,一个替代品,其秘密被替换为占位符值,[沙箱代理](#network-isolation)在出站时替换真实值。
472* **macOS**:沙箱化命令根本无法读取列出的文件。Claude Code 不构建哨兵副本,也不在出站时替换任何内容,因此使用文件进行身份验证的工具在沙箱内不工作,与 `deny` 的效果相同。与 `deny` 条目不同,即使你[禁用文件系统隔离](#disable-filesystem-isolation),读取块也保持有效。
473 522
474在每个平台上,Claude Code 应用 [`network.tlsTerminate`](/docs/zh-CN/settings-reference#sandbox-network-tlsterminate) 要求和 `injectHosts` 的方式与[掩盖环境变量](#mask-environment-variables)相同,并以相同方式忽略存储库设置。如果你[排除用户设置](#configure-sandboxing),Claude Code 将 `~/.claude/settings.json` 中的文件 `mask` 条目保持为限制,但条目不再授权代理替换真实值。523* **Linux 和 WSL2**:沙箱命令读取的是该文件的[哨兵](#mask-credentials)副本,代理会在出站请求中替换为真实值。
524* **macOS**:沙箱命令完全无法读取该文件。Claude Code 不会构建哨兵副本,因此使用该文件进行身份验证的工具无法在沙箱内工作,效果与 `deny` 相同。即使您[禁用文件系统隔离](#disable-filesystem-isolation),该读取阻止仍然有效。
475 525
476下面的示例掩盖存储在 `~/.config/gh/hosts.yml` 中的 GitHub 令牌;`extract` 模式(如下所述)告诉 Claude Code 文件的哪一部分是秘密。在 Linux 和 WSL2 上,读取文件的沙箱化命令获得令牌位置的哨兵,代理在对 `api.github.com` 的请求上替换真实令牌:526下面的示例对存储在 `~/.config/gh/hosts.yml` 中的 GitHub 令牌进行掩码。`extract` 模式标记文件的哪一部分是机密,因此在 Linux 和 WSL2 上,`gh` 仍能解析其配置的其余部分:
477 527
478```json theme={null}528```json theme={null}
479{529{
497}547}
498```548```
499 549
500要确认掩盖处于活动状态,请要求 Claude 在沙箱化命令中运行 `cat ~/.config/gh/hosts.yml`:在 Linux 和 WSL2 上,输出显示令牌位置的哨兵值,在 macOS 上,读取失败。550要确认掩码是否生效,请让 Claude 在沙箱命令中运行 `cat ~/.config/gh/hosts.yml`。在 Linux 和 WSL2 上,输出会显示一个替代令牌的哨兵值;在 macOS 上,读取则会失败。
501
502在 Linux 和 WSL2 上,`extract` 模式是保持 `hosts.yml` 其余部分可读的原因。Claude Code 在整个文件上应用正则表达式,仅替换每个匹配的第 1 组捕获的文本,因此 `gh` 仍然解析其配置,仅令牌是占位符。对任何工具解析的结构化文件使用 `extract`,例如 `.netrc`、JSON 或 YAML;模式必须包含至少一个捕获组。没有 `extract`,Claude Code 将整个文件内容替换为一个哨兵值,这适合持有单个裸秘密且没有其他内容的文件。
503
504对于持有 JSON Web Token (JWT) 的文件,设置 `decode: "jwt"` 而不是或与 `extract` 一起。`decode` 需要 Claude Code v2.1.224 或更高版本。Claude Code 使用内置模式或你的 `extract` 模式(设置时)查找 JWT 候选项,验证每个候选项是 JWT,并将其替换为结构上有效的假令牌,因此在沙箱内解码令牌的代码继续工作。添加 `maskClaims` 以仅掩盖每个验证令牌内的命名顶级有效负载声明,并保持其他声明可读。当没有候选项验证或没有命名声明匹配时,下面的 `onExtractNoMatch` 字段控制结果,就像模式匹配不到任何内容一样。
505 551
506两个可选字段细化匹配行为。两者仅在 `mode` 为 `mask` 且 `extract` 或 `decode` 设置时适用。在 macOS 上,当文件系统隔离开启时,Claude Code 在模式运行前将 `mask` 条目应用为 `deny`,因此这些字段和下面的不匹配结果仅在[文件系统隔离关闭](#disable-filesystem-isolation)时在那里生效:552如果不使用 `extract` 或 `decode`,Claude Code 会用一个哨兵值替换整个文件,这适用于只包含单个裸机密的文件。请使用 [`extract`、`decode`、`maskClaims`、`onExtractNoMatch` 和 `maskDuplicates` 字段](/docs/zh-CN/settings-reference#sandbox-credentials-files)来控制部分掩码,以及模式未匹配到任何内容时的处理方式。
507 553
508* `onExtractNoMatch` 控制匹配在文件中找不到任何内容要掩盖时发生的情况:554<Warning>
509 555 当匹配未找到任何可掩码的内容时,默认的 `onExtractNoMatch` 值 `warn` 会跳过该条目,因此沙箱命令可以读取未掩码的真实文件。在 macOS 上,只要文件系统隔离开启,Claude Code 就会在模式运行之前将 `mask` 条目作为 `deny` 应用,因此未匹配处理结果仅在[文件系统隔离关闭](#disable-filesystem-isolation)时才在 macOS 上生效。默认值适用于可能合法缺失的凭据。如果机密可能存在但模式可能漏匹配,请使用 [`deny`](/docs/zh-CN/settings-reference#mask-fields-for-files)。
510 * `warn`,默认值,警告并跳过条目,因此沙箱化命令可以不掩盖地读取真实文件。默认值适合凭证可能合法不存在的情况;如果秘密可能存在但模式可能错过它,使用 `deny`556</Warning>
511 * `deny` 使文件改为不可读
512 * `error` 停止沙箱设置,直到你修复配置
513
514 当读取块不会被强制执行时,Claude Code 将 `deny` 视为 `error`:当你[禁用文件系统隔离](#disable-filesystem-isolation)时,以及当任何设置源中的 `filesystem.allowRead` 条目重新打开文件的路径时。
515* `maskDuplicates` 也替换每个掩盖凭证值的逐字副本,一个 `extract` 捕获或 `decode` 验证的令牌,在匹配跨度外找到,对于在匹配无法到达的地方重复的秘密。它匹配原始子字符串,因此短或常见的值会被替换到处出现;为长、高熵秘密保留它。默认值:false。
516 557
517`mask` 适用于单个文件,因此单独列出每个凭证文件。Claude Code 回退到 `deny` 对于它无法安全掩盖的 `mask` 条目:目录路径、glob 模式、大于 8 MiB 的文件或非 UTF-8 文本文件。改为将目录写为显式 `deny` 条目;[Which settings can disable it](#which-settings-can-disable-it) 下的表格涵盖每种形式是否固定 `filesystem.disabled` 以及它在文件系统隔离关闭时的行为。558`mask` 仅适用于单个文件,因此请逐个列出每个凭据文件。对于无法安全掩码的 `mask` 条目,Claude Code 会回退为 `deny`:目录路径、glob 模式、大于 8 MiB 的文件,或非 UTF-8 文本的文件。
518 559
519<h2 id="how-sandboxing-works">560<h2 id="how-sandboxing-works">
520 沙箱如何工作561 沙箱隔离的工作原理
521</h2>562</h2>
522 563
523<h3 id="filesystem-isolation">564<h3 id="filesystem-isolation">
524 文件系统隔离565 文件系统隔离
525</h3>566</h3>
526 567
527沙箱化 Bash 工具将文件系统访问限制在特定目录:568沙箱化的 Bash 工具将文件系统访问限制在特定目录内:
528 569
529* **默认写入行为**:对当前工作目录及其子目录的读写访问,加上使用 `--add-dir`、`/add-dir` 或 [`permissions.additionalDirectories`](/docs/zh-CN/settings-reference#permissions-additionaldirectories) 添加的任何目录,以及 `$TMPDIR` 指向的会话临时目录570* **默认写入行为**:对当前工作目录及其子目录、通过 `--add-dir`、`/add-dir` 或 [`permissions.additionalDirectories`](/docs/zh-CN/settings-reference#permissions-additionaldirectories) 添加的任何目录,以及 `$TMPDIR` 所指向的每用户临时目录拥有读写权限
530* **默认读取行为**:对整个计算机的读取访问,除了某些被拒绝的目录。注意此默认仍允许读取凭证文件,例如 `~/.aws/credentials` 和 `~/.ssh/`。使用 [`sandbox.credentials`](#protect-credentials) 阻止读取这些文件并取消设置密钥环境变量,或将路径添加到 `denyRead`。571* **默认读取行为**:对整台计算机拥有读取权限,但某些被拒绝的目录除外。此默认设置仍允许读取凭据文件,因此请[保护凭据](#protect-credentials),防止命令读取您不希望其读取的凭据。
531* **读取阻止**:启用 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-CN/settings-reference#permissions-blockreadsoutsideworkingdirectories) 时,沙箱化命令也会失去对你的主目录和其他保存用户文件的目录的读取访问权限,除了 [Sandboxed commands under the block](/docs/zh-CN/settings-reference#sandboxed-commands-under-the-block) 列出的路径。该部分也说明了此阻止部分何时不适用。572* **读取阻止**:启用 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-CN/settings-reference#permissions-blockreadsoutsideworkingdirectories) 后,沙箱化的命令也会失去对您的主目录以及其他存放用户文件的目录的读取权限,[阻止状态下的沙箱化命令](/docs/zh-CN/settings-reference#sandboxed-commands-under-the-block)中列出的路径除外。该部分还说明了此部分阻止在何种情况下不适用。
532* **被阻止的访问**:无法在没有明确权限的情况下修改工作目录、添加的目录和会话临时目录外的文件,包括 shell 配置文件(例如 `~/.bashrc`)和 `/bin/` 中的系统二进制文件573* **Git worktree**:当工作目录是[链接的 git worktree](/docs/zh-CN/worktrees) 时,沙箱还允许写入主仓库共享的 `.git` 目录,以便 `git commit` 等命令能够更新 ref 和索引。对该目录内 `hooks/` 和 `config` 的写入仍被拒绝。
533* **Git worktrees**:当工作目录是[链接的 git worktree](/docs/zh-CN/worktrees)时,沙箱还允许写入主存储库的共享 `.git` 目录,以便 `git commit` 等命令可以更新引用和索引。对该目录内的 `hooks/` 和 `config` 的写入仍然被拒绝。
534* **可配置**:通过设置定义自定义允许和拒绝的路径
535 574
536要完全跳过文件系统隔离同时保持网络隔离,请设置 [`sandbox.filesystem.disabled`](#disable-filesystem-isolation)。575要完全跳过文件系统隔离而保留网络隔离,请设置 [`sandbox.filesystem.disabled`](#disable-filesystem-isolation)。
537 576
538<h3 id="protected-paths">577<h3 id="protected-paths">
539 受保护的路径578 受保护的路径
540</h3>579</h3>
541 580
542在沙箱化命令可以写入的目录内,沙箱仍然拒绝对 Claude Code 从中加载配置和代码的文件进行写入。可以编辑这些文件的命令可能会授予自己权限,或添加 Claude Code 在沙箱外运行的 hook 或 MCP 服务器。权限系统有自己的[受保护路径](/docs/zh-CN/permission-modes#protected-paths),它控制 Claude Code 在工具运行前批准的内容;沙箱的列表适用于已经运行的命令。它涵盖四组路径:581在沙箱化命令可写入的目录中,沙箱仍会拒绝写入 Claude Code 从中加载配置和代码的文件。能够编辑这些文件的命令可能会为自己授予权限,或添加由 Claude Code 在沙箱之外运行的 hook 或 MCP 服务器。权限系统有其自己的[受保护的路径](/docs/zh-CN/permission-modes#protected-paths),用于控制 Claude Code 在工具运行之前批准的内容;而沙箱的列表适用于已经在运行的命令。它涵盖四组路径:
543 582
544* **在你的工作目录及其上方的目录中**:`.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`
545* **仅在你的工作目录中**:shell 启动文件,例如 `.bashrc` 和 `.zshrc`、`.gitconfig`、`.vscode` 和 `.idea` 目录,以及 `.git` 内的 `hooks` 和 `config`584* **仅在您的工作目录中**:shell 启动文件(例如 `.bashrc` 和 `.zshrc`)、`.gitconfig`、`.vscode` 和 `.idea` 目录,以及 `.git` 内的 `hooks` 和 `config`
546* **会将你的工作目录变成裸 git 存储库的文件**:顶级的 `HEAD`、`objects` 和 `refs`,加上 `config` 和 `hooks`(当它们已经存在时)。即使 `config` 文件没有 `HEAD` 也会被拒绝。在 Linux 和 WSL2 上,沙箱删除在沙箱化命令运行时出现的顶级 `HEAD` 文件或 `objects` 或 `refs` 目录585* **会将您的工作目录变成裸 git 仓库的文件**:顶层的 `HEAD`、`objects` 和 `refs`,以及当旁边存在 `HEAD` 时,该处已有的 `config` 和 `hooks` 条目。即使没有 `HEAD`,名为 `config` 的文件也会被拒绝。在 Linux 和 WSL2 上,如果沙箱化命令运行期间出现顶层 `HEAD` 文件或 `objects`、`refs` 目录,沙箱会将其删除
547* **在 `~/.claude` 中,或 `CLAUDE_CONFIG_DIR` 指向的目录中**:其大部分内容,加上 `~/.claude.json` 和 `.credentials.json` 凭证存储586* **在 `~/.claude` 或 `CLAUDE_CONFIG_DIR` 所指向的目录中**:其中的大部分内容,以及 `~/.claude.json` 和 `.credentials.json` 凭据存储
548 587
549如果在会话期间受保护设置文件的路径处出现符号链接,沙箱也会拒绝对其指向的文件进行写入,从下一个命令开始。588如果会话期间在受保护设置文件的路径上出现符号链接,沙箱还会从下一条命令开始拒绝写入该符号链接所指向的文件。
550 589
551无法豁免这些路径之一:覆盖该路径的 `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` 条目混合显示。
552 591
553如果 `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)。
554 593
555<h3 id="network-isolation">594<h3 id="network-isolation">
556 网络隔离595 网络隔离
557</h3>596</h3>
558 597
559网络访问通过在沙箱外运行的代理服务器进行控制:598沙箱化的命令没有直接通往网络的路径:
599
600* **Linux 和 WSL2**:命令在一个独立的网络命名空间中运行,该命名空间与您的网络没有连接
601* **macOS**:Seatbelt 沙箱框架默认阻止除连接到沙箱代理之外的其他连接
602
603Claude Code 在您的计算机上、沙箱之外运行沙箱代理,并通过 `HTTP_PROXY`、`HTTPS_PROXY`、`ALL_PROXY` 及相关环境变量将命令引导至该代理。代理会根据您允许和拒绝的域名检查每个连接的主机名。
604
605工具能够访问的内容取决于它是否使用代理:
560 606
561* **域名限制**:Claude Code 默认不预先允许任何域名。命令第一次需要新的域名时,Claude Code 会提示批准;在[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)中,Claude 会根据[按命令允许的域名](#per-command-allowed-domains-in-auto-mode)在命令本身上命名命令需要的主机。607* **读取代理变量的工具**:`curl`、`npm`、基于 HTTPS 的 `git` 以及类似工具在其主机被允许后即可连接。不带端口的 `allowedDomains` 条目会允许该主机上的所有端口
562* **批准选择**:如果在提示时选择"是",Claude Code 会在当前会话的其余时间内允许该主机,之后连接到同一主机时不会再次提示。如果选择"是,以后不再询问",Claude Code 会将 `WebFetch(domain:...)` 允许规则保存到你的[本地设置](/docs/zh-CN/permissions#permission-system),因此该主机在未来会话中保持允许。608* **忽略代理变量的工具**:普通的 `ssh`、大多数数据库驱动程序以及类似工具无法连接,即使是连接到被允许的主机也不行。请参阅[数据库客户端或其他非 HTTP 工具无法访问被允许的主机](#a-database-client-or-other-non-http-tool-fails-to-reach-an-allowed-host)
563* **预先允许的域名**:使用 [`allowedDomains`](/docs/zh-CN/settings-reference#sandbox-network-alloweddomains) 预先允许域名以完全避免提示。Claude Code 也预先允许来自 `WebFetch(domain:...)` 允许规则的域名,如[权限规则](#permission-rules)中所述。609* **任何非 TCP 的流量**:UDP、基于 QUIC 的 HTTP/3 以及 `ping` 等 ICMP 工具无法离开沙箱
564* **严格允许列表**:如果在用户、托管或 CLI `--settings` 设置中将 [`strictAllowlist`](/docs/zh-CN/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 或更高版本。
565* **托管锁定**:如果在托管设置中设置了 [`allowManagedDomainsOnly`](/docs/zh-CN/settings-reference#sandbox-network-allowmanageddomainsonly),非允许的域名会自动被阻止而不是提示,只有来自托管设置的 `allowedDomains` 和 `WebFetch(domain:...)` 允许规则被尊重。
566* **企业代理**:当你的网络要求出站流量通过企业代理时,按照[代理配置](/docs/zh-CN/network-config#proxy-configuration)的描述在你的设置的 `env` 块中设置 `HTTPS_PROXY`、`HTTP_PROXY` 和 `NO_PROXY`,以便[后台代理](/docs/zh-CN/network-config#set-network-variables-in-settings-not-the-shell)也能获得它们,或在你启动 Claude Code 的环境中设置。Claude Code 强制执行域名允许列表,然后通过该上游代理隧道允许的连接。
567* **自定义代理支持**:高级用户可以在出站流量上实现自定义规则
568* **全面覆盖**:限制适用于所有脚本、程序和由命令生成的子进程
569 610
570在 `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-CN/permissions#permission-system)中,使该主机在以后的会话中保持允许状态。当沙箱处于[管理员要求](#repository-settings-under-an-admin-required-sandbox)状态时,Claude Code 会将该规则保存到您的用户设置中,使其在每个项目中都生效。
615* **预先允许的域名**:使用 [`allowedDomains`](/docs/zh-CN/settings-reference#sandbox-network-alloweddomains) 预先允许域名,以完全避免提示。Claude Code 还会预先允许来自 `WebFetch(domain:...)` 允许规则的域名,如[权限规则](#permission-rules)中所述。
616* **严格允许列表**:如果您在用户设置、托管设置或 CLI `--settings` 设置中将 [`strictAllowlist`](/docs/zh-CN/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-CN/settings-reference#sandbox-network-allowmanageddomainsonly),未被允许的域名会被自动阻止而不会提示,并且只有托管设置中的 `allowedDomains` 和 `WebFetch(domain:...)` 允许规则会生效。
618* **企业代理**:当您的网络要求出站流量通过企业代理时,请按照[代理配置](/docs/zh-CN/network-config#proxy-configuration)中的说明设置 `HTTPS_PROXY`、`HTTP_PROXY` 和 `NO_PROXY`,可以设置在您设置的 `env` 块中,以便[后台 Agent](/docs/zh-CN/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.*)`)仍可匹配抓取请求,但对沙箱化命令没有任何作用。
571 621
572<Note>622<Note>
573 内置代理基于请求的主机名强制执行允许列表,默认情况下不会终止或检查 TLS 流量。实验性的 [`network.tlsTerminate`](/docs/zh-CN/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-CN/settings-reference#sandbox-network-tlsterminate) 设置(在 Claude Code v2.1.199 及更高版本中可用)会让内置代理自行终止 TLS,这是 [`mask` 凭据条目](#mask-credentials)所必需的。有关默认行为的影响,请参阅[安全限制](#security-limitations);如果您的威胁模型要求进行 TLS 检查,请参阅[自定义代理配置](#custom-proxy-configuration)。
574</Note>624</Note>
575 625
626<h4 id="hosts-outside-your-allowed-domains">
627 允许域名之外的主机
628</h4>
629
630当沙箱化命令连接到不在您允许域名中的主机时,该命令会留在沙箱中并等待决定。在交互式终端会话中,该决定取决于您的权限模式:
631
632| 权限模式 | 连接会发生什么 |
633| :- | :- |
634| `bypassPermissions` 模式,以及[可绕过权限](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)时的计划模式 | 无需提示即被允许 |
635| 手动模式、`acceptEdits` 模式,以及其他情况下的计划模式 | 您会收到提示 |
636| 自动模式 | 被拒绝,除非命令[列出了该主机](#per-command-allowed-domains-in-auto-mode)且分类器批准了该列表 |
637| `dontAsk` 模式 | 被拒绝 |
638
639启用 [`strictAllowlist`](/docs/zh-CN/settings-reference#sandbox-network-strictallowlist) 或 [`allowManagedDomainsOnly`](/docs/zh-CN/settings-reference#sandbox-network-allowmanageddomainsonly) 后,内置沙箱代理会在所有权限模式下拒绝该连接。在 `bypassPermissions` 模式下,除非启用了其中之一,否则允许域名之外的主机会被允许。[非沙箱重试逃生通道](#the-unsandboxed-retry-escape-hatch)介绍了在该模式下命令何时可以离开沙箱。连接到 [`deniedDomains`](/docs/zh-CN/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
576<h4 id="per-command-allowed-domains-in-auto-mode">651<h4 id="per-command-allowed-domains-in-auto-mode">
577 自动模式中按命令允许的域名652 自动模式下的逐命令允许域名
578</h4>653</h4>
579 654
580在启用沙箱的[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)中,Claude 会在命令本身上命名命令需要的主机,而不是为每个连接触发网络批准。在沙箱中运行的每个 Bash、PowerShell 或[监视器](/docs/zh-CN/tools-reference#monitor-tool)命令都可以携带超出沙箱允许列表的主机列表:一个域名,例如 `registry.npmjs.org`,一个通配符,例如 `*.pythonhosted.org`,或一个 IP 地址,每个都带有可选的 `:port`。分类器将主机与命令一起审查。需要 Claude Code v2.1.271 或更高版本。655在启用沙箱隔离的[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)下,Claude 会在命令本身上指明该命令所需的主机,而不是为每个连接触发网络批准。在沙箱中运行的每个 Bash、PowerShell 或 [Monitor](/docs/zh-CN/tools-reference#monitor-tool) 命令都可以携带一个超出沙箱允许列表的主机列表:可以是 `registry.npmjs.org` 等域名、`*.pythonhosted.org` 等通配符或 IP 地址,每项均可带有可选的 `:port`。分类器会将这些主机与命令一起审查。需要 Claude Code v2.1.271 或更高版本。
581 656
582批准的列表仅为该一个命令打开这些主机,只要它运行。没有任何内容被添加到你的会话允许的主机或你的设置;下一个命令命名它自己的主机。657经批准的列表仅对该单条命令开放这些主机,并在其运行期间有效。不会向会话允许的主机或您的设置中添加任何内容;下一条命令会指明它自己的主机。
583 658
584携带主机的命令会进入分类器,而不是由权限规则或沙箱的[自动允许模式](#sandbox-modes)批准。如果[询问规则](/docs/zh-CN/permissions#manage-permissions)强制对命令进行提示,你的终端中的权限对话框会在其旁边列出主机,在那里批准会同时覆盖两者。659携带主机的命令会交给分类器处理,而不是由权限规则或沙箱的[自动允许模式](#sandbox-modes)批准。如果某条[询问规则](/docs/zh-CN/permissions#manage-permissions)强制对该命令进行提示,终端中的权限对话框会在命令旁列出这些主机,在此处批准即同时涵盖两者。
585 660
586按命令列表仅扩大沙箱默认拒绝的内容。[`deniedDomains`](/docs/zh-CN/settings-reference#sandbox-network-denieddomains) 条目仍然会阻止。当 [`strictAllowlist`](/docs/zh-CN/settings-reference#sandbox-network-strictallowlist) 或 [`allowManagedDomainsOnly`](/docs/zh-CN/settings-reference#sandbox-network-allowmanageddomainsonly) 锁定允许列表时,Claude Code 拒绝按命令列表。661逐命令列表只会放宽沙箱默认拒绝的内容。[`deniedDomains`](/docs/zh-CN/settings-reference#sandbox-network-denieddomains) 条目仍会阻止访问。当 [`strictAllowlist`](/docs/zh-CN/settings-reference#sandbox-network-strictallowlist) 或 [`allowManagedDomainsOnly`](/docs/zh-CN/settings-reference#sandbox-network-allowmanageddomainsonly) 锁定允许列表时,Claude Code 会拒绝逐命令列表。
587 662
588当按命令列表适用时,Claude Code 拒绝连接到没有批准命令列出的主机,没有提示或分类器检查。拒绝在命令的结果中命名主机,Claude 会重新运行添加了主机的命令。663在逐命令列表生效期间,Claude Code 会拒绝连接到任何未被已批准命令列出的主机,既不提示也不经过分类器检查。拒绝信息会在命令结果中指明该主机,Claude 会在添加该主机后重新运行命令。
589 664
590<h4 id="ipv6-addresses-in-domain-lists">665<h4 id="ipv6-addresses-in-domain-lists">
591 域名列表中的 IPv6 地址666 域名列表中的 IPv6 地址
592</h4>667</h4>
593 668
594沙箱的域名列表是 `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 或更高版本。
595 670
596当你在 IPv6 地址的网络批准提示处选择"是,以后不再询问"时,Claude Code 会使用括号地址保存 `WebFetch(domain:...)` 规则,因此该规则在未来会话中继续匹配该地址。671不带方括号的条目(例如 `::1:443`)存在歧义,既可能是一个地址,也可能是一个地址加端口:
597 672
598未括号的条目有两个或更多冒号是模糊的:`::1:443` 既是完整的 IPv6 地址,也是后跟端口的地址。Claude Code 保守地强制执行模糊的拼写,而不是猜测你的意思是哪种读法:673* **拒绝列表**:Claude Code 会拒绝该条目可解析出的每一种含义,因此无论您指的是哪种含义都会被阻止。对于无法解析出任何含义的条目,Claude Code 不会阻止任何内容
674* **允许列表**:Claude Code 绝不会允许超出您所写的内容。当主机加端口的含义能够被清晰解析时,它会将有歧义的条目改写为该含义;它也可能会完全丢弃该条目,而不是扩大允许列表
599 675
600* **拒绝列表**:Claude Code 拒绝条目解析为的每种读法,因此无论你的意思是哪种读法都被阻止。对于没有可解析读法的条目,Claude Code 不阻止任何内容。676要查找有歧义的条目,请在终端中运行 `claude doctor` 并查看 `Sandbox network domain entries have unreliable spellings` 警告。将每个有歧义的条目改写为方括号形式。
601* **允许列表**:Claude Code 永远不允许超过你写的内容。当主机和端口读法干净地解析时,它会将模糊条目重写为其主机和端口读法,并可能完全删除条目,而不是扩大允许列表。
602
603在你的终端中运行 `claude doctor` 以找到受影响的条目:`Sandbox network domain entries have unreliable spellings` 警告命名最多三个条目并计算其余的。将每个条目重写为括号形式以清除警告。警告也命名拼写不可靠的条目,原因包括 `@`、路径或查询字符,或括号内的通配符。
604 677
605<h3 id="os-level-enforcement">678<h3 id="os-level-enforcement">
606 操作系统级强制执行679 操作系统级强制执行
607</h3>680</h3>
608 681
609沙箱化 Bash 工具使用操作系统安全原语:682沙箱化的 Bash 工具使用操作系统安全原语:
610 683
611* **macOS**:使用 Seatbelt 进行沙箱强制执行684* **macOS**:使用 Seatbelt 进行沙箱强制执行
612* **Linux**:使用 [bubblewrap](https://github.com/containers/bubblewrap) 进行隔离685* **Linux**:使用 [bubblewrap](https://github.com/containers/bubblewrap) 进行隔离
613* **WSL2**:使用 bubblewrap,与 Linux 相同686* **WSL2**:使用 bubblewrap,与 Linux 相同
614 687
615不支持 WSL1,因为 bubblewrap 需要仅在 WSL2 中可用的内核功能。688您也可以单独运行 [`@anthropic-ai/sandbox-runtime`](https://github.com/anthropics/sandbox-runtime) 包来包装 Claude Code 进程。请参阅[沙箱运行时](/docs/zh-CN/sandbox-environments#sandbox-runtime)。
616
617这些相同的原语作为独立的 [`@anthropic-ai/sandbox-runtime`](https://github.com/anthropic-experimental/sandbox-runtime) 包提供,[Sandbox environments](/docs/zh-CN/sandbox-environments#sandbox-runtime) 页面将其作为包装整个 Claude Code 进程的单独方法进行介绍。
618 689
619<h2 id="how-sandboxing-relates-to-permissions-and-permission-modes">690<h2 id="how-sandboxing-relates-to-permissions-and-permission-modes">
620 沙箱隔离与权限和权限模式的关系691 沙箱隔离与权限和权限模式的关系
666沙箱的[自动允许模式](#sandbox-modes)与[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)分开:自动允许批准 Bash 命令是因为沙箱边界包含它们,而自动模式使用分类器来审查操作。这两者独立工作,可以组合,但[沙箱模式](#sandbox-modes)下列出的例外除外。要为无人值守运行选择隔离边界,请参阅[沙箱环境](/docs/zh-CN/sandbox-environments#how-isolation-relates-to-permission-modes)。有关常见权限模式和沙箱配对及启动每个配对的标志的表格,请参阅[常见设置](/docs/zh-CN/permission-modes#common-setups)。737沙箱的[自动允许模式](#sandbox-modes)与[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)分开:自动允许批准 Bash 命令是因为沙箱边界包含它们,而自动模式使用分类器来审查操作。这两者独立工作,可以组合,但[沙箱模式](#sandbox-modes)下列出的例外除外。要为无人值守运行选择隔离边界,请参阅[沙箱环境](/docs/zh-CN/sandbox-environments#how-isolation-relates-to-permission-modes)。有关常见权限模式和沙箱配对及启动每个配对的标志的表格,请参阅[常见设置](/docs/zh-CN/permission-modes#common-setups)。
667 738
668<h2 id="configure-the-sandbox-for-your-organization">739<h2 id="configure-the-sandbox-for-your-organization">
669 为你的组织配置沙箱740 为您的组织配置沙箱
670</h2>741</h2>
671 742
672管理员可以为每个用户要求沙箱,防止开发者扩大策略,并通过公司代理路由沙箱流量。743管理员可以为每个用户强制要求沙箱隔离,防止开发者扩大策略,并通过公司代理路由沙箱流量。
673 744
674<h3 id="enforce-sandboxing-with-managed-settings">745<h3 id="enforce-sandboxing-with-managed-settings">
675 使用托管设置强制执行沙箱746 使用托管设置强制执行沙箱隔离
676</h3>747</h3>
677 748
678要为每个开发者要求沙箱,通过 [managed settings](/docs/zh-CN/managed-settings#delivery-mechanisms) 提供 `sandbox` 密钥,可以是由你的 MDM 管理的文件,也可以是通过 claude.ai 上的 [server-managed settings](/docs/zh-CN/server-managed-settings)。749要为每个开发者强制要求沙箱,请通过[托管设置](/docs/zh-CN/managed-settings#delivery-mechanisms)下发 `sandbox` 设置项,可以是由您的 MDM 管理的文件,也可以是通过 claude.ai 上的[服务器托管设置](/docs/zh-CN/server-managed-settings)。
679 750
680以下托管设置配置启用沙箱,如果沙箱无法初始化则拒绝启动 Claude Code,并防止模型在沙箱外重试命令:751以下托管设置配置会启用沙箱,在平台不受支持或缺少依赖时拒绝启动 Claude Code,并防止模型在沙箱外重试命令:
681 752
682```json theme={null}753```json theme={null}
683{754{
689}760}
690```761```
691 762
692超过 `enabled` 的两个密钥控制沙箱无法运行命令时会发生什么:763除 `enabled` 之外的两个设置项控制沙箱无法运行命令时会发生什么:
693 764
694* **`failIfUnavailable`**:缺少的依赖项(例如 Linux 上的 bubblewrap)会阻止 Claude Code 启动,而不是显示警告并回退到非沙箱化执行765* **`failIfUnavailable`**:缺少依赖(例如 Linux 上的 bubblewrap)时会阻止 Claude Code 启动,而不是回退到非沙箱化执行
695* **`allowUnsandboxedCommands: false`**:Claude Code 忽略 `dangerouslyDisableSandbox` 逃生舱,因此在沙箱下失败的命令无法在其外重试766* **`allowUnsandboxedCommands: false`**:Claude Code 忽略 `dangerouslyDisableSandbox` 逃生舱,因此当命令在沙箱下失败时,Claude 无法在沙箱外重试该命令
696 767
697值得考虑与它们一起添加两个补充。为任何必须在没有隔离的情况下运行的组织批准的工具添加 `excludedCommands`。为凭证目录(例如 `~/.aws` 和 `~/.ssh`)和秘密环境变量添加 [`sandbox.credentials`](#protect-credentials) 条目,因为默认读取策略仍允许这些。768请考虑同时添加以下内容:
698 769
699此配置对 Claude 运行的命令进行沙箱化。开发者仍然可以在 [`!` shell 模式提示符](/docs/zh-CN/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) 条目,因为默认读取策略仍允许访问这些内容
700 772
701沙箱不在原生 Windows 上运行,因此如果你的队伍包括 Windows 主机,请将此配置的范围限制在 macOS 和 Linux,或让这些用户在 WSL2 或容器内运行 Claude Code。773此配置对 Claude 运行的命令进行沙箱化。开发者仍然可以在 [`!` shell 模式提示符](/docs/zh-CN/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-CN/managed-settings#delivery-mechanisms)进行部署。[服务器托管设置](/docs/zh-CN/server-managed-settings#current-limitations)适用于组织中的所有用户
778* **将 Windows 用户迁移到受支持的环境**:让他们在 WSL2 或容器内运行 Claude Code
702 779
703<h3 id="keep-developers-from-widening-the-policy">780<h3 id="keep-developers-from-widening-the-policy">
704 防止开发者扩大策略781 防止开发者扩大策略
705</h3>782</h3>
706 783
707对于布尔密钥(例如 `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-CN/settings-reference#sandbox-enableweakernestedsandbox)
789* [`enableWeakerNetworkIsolation`](/docs/zh-CN/settings-reference#sandbox-enableweakernetworkisolation)
790* [`network.allowAllUnixSockets`](/docs/zh-CN/settings-reference#sandbox-network-allowallunixsockets)
791* [`network.allowLocalBinding`](/docs/zh-CN/settings-reference#sandbox-network-allowlocalbinding)
792* [`allowAppleEvents`](/docs/zh-CN/settings-reference#sandbox-allowappleevents),仓库无法启用此项
793
794在托管设置中将 `allowManagedReadPathsOnly` 设置为 `true`,以便仅采用来自托管设置的 `allowRead` 条目。这可以防止开发者将读取访问权限扩大到组织批准的路径之外。
795
796要以相同的方式将网络域锁定为托管值,请设置 [`allowManagedDomainsOnly`](/docs/zh-CN/settings-reference#sandbox-network-allowmanageddomainsonly)。启用此锁定后,只有托管设置可以设置[代理端口](#custom-proxy-configuration)。
797
798当托管设置配置了 `sandbox.filesystem` 或列出任何带有 `"mode": "deny"` 的 `sandbox.credentials.files` 条目时,仅托管设置可以设置 [`filesystem.disabled`](#disable-filesystem-isolation),因此开发者无法关闭管理员部署的文件系统限制。[有效的](/docs/zh-CN/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-CN/settings-reference#sandbox-allowunsandboxedcommands) 在托管设置中设置为 `false`,或通过 `--settings` 标志设置为 `false`(除非托管设置将其设置为 `true`)
807* [`allowManagedDomainsOnly`](/docs/zh-CN/settings-reference#sandbox-network-allowmanageddomainsonly) 在托管设置中设置为 `true`
708 808
709在托管设置中将 `allowManagedReadPathsOnly` 设置为 `true`,以便仅尊重来自托管设置的 `allowRead` 条目。这防止开发者扩大读取访问权限超过组织批准的路径。要以相同的方式将网络域锁定到托管值,请设置 [`allowManagedDomainsOnly`](/docs/zh-CN/settings-reference#sandbox-network-allowmanageddomainsonly)。809这些设置不会启用沙箱,因此还需设置 `enabled`。
710 810
711当托管设置配置 `sandbox.filesystem` 或列出任何带有 `"mode": "deny"` 的 `sandbox.credentials.files` 条目时,仅托管设置可以设置 [`filesystem.disabled`](#disable-filesystem-isolation),因此开发者无法关闭管理员部署的文件系统限制。`mask` 条目是否固定密钥取决于它如何解析;[Which settings can disable it](#which-settings-can-disable-it) 下的表格涵盖了四种情况。811当沙箱为管理员强制要求时,Claude Code 仅从托管设置、`--settings` 标志以及每个开发者的 `~/.claude/settings.json` 中读取放宽沙箱的设置。它会忽略仓库的 `.claude/settings.json` 和 `.claude/settings.local.json` 中的以下设置:
712 812
713`excludedCommands` 没有等效的仅托管锁定,因此开发者总是可以追加在沙箱外运行其他命令的条目。保持托管列表狭窄。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` | 当开发者的 `~/.claude/settings.json` 设置为 `true` 时的 `false` |
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 的文件工具仍遵循仓库的规则和附加目录。
714 844
715<h3 id="custom-proxy-configuration">845<h3 id="custom-proxy-configuration">
716 自定义代理配置846 自定义代理配置
717</h3>847</h3>
718 848
719对于需要高级网络安全的组织,你可以实现自定义代理以:849要使用您自己的工具检查、过滤或记录沙箱流量,请将内置的沙箱代理替换为您在同一台机器上运行的代理。
720 850
721* 解密和检查 HTTPS 流量851要通过网络中其他位置的公司代理路由沙箱流量,请改为设置 `HTTPS_PROXY`,如[网络隔离](#network-isolation)下的**公司代理**条目所述。这样,Claude Code 的允许列表仍然适用。
722* 应用自定义过滤规则
723* 记录所有网络请求
724* 与现有安全基础设施集成
725 852
726要将 Claude Code 指向你的代理,请在 [sandbox settings](/docs/zh-CN/settings-reference#sandbox-settings) 中设置代理端口:853要将沙箱化命令定向到您的代理,请在[沙箱设置](/docs/zh-CN/settings-reference#sandbox-settings)中设置代理监听的 localhost 端口:
727 854
728```json theme={null}855```json theme={null}
729{856{
736}863}
737```864```
738 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
739<h2 id="troubleshooting">880<h2 id="troubleshooting">
740 故障排除881 故障排除
741</h2>882</h2>
742 883
743某些命令在沙箱内失败,即使它们在沙箱外工作。下面的修复涵盖最常见的情况。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)。
744 889
745* **命令因主机不允许错误而失败**:许多 CLI 工具需要到达特定的主机。在提示时授予权限会将主机添加到你的允许列表,以便该工具在将来在沙箱内运行。890<h3 id="commands-fail-with-a-host-not-allowed-error">
746* **`jest` 挂起或失败**:`watchman` 与沙箱不兼容。改为运行 `jest --no-watchman`。891 命令因主机不允许错误而失败
747* **Go 基础 CLI 在 macOS 上 TLS 验证失败**:`gh`、`gcloud` 和 `terraform` 等工具在 Seatbelt 下可能无法进行 TLS 验证。在 [`excludedCommands`](/docs/zh-CN/settings-reference#sandbox-excludedcommands) 中列出这些工具。如果你使用 `httpProxyPort` 与 MITM 代理和自定义 CA,请改为将 [`enableWeakerNetworkIsolation`](/docs/zh-CN/settings-reference#sandbox-enableweakernetworkisolation) 设置为 `true`。892</h3>
748* **`open`、`osascript` 或基于浏览器的身份验证流在 macOS 上因错误 `-600` 失败**:沙箱默认阻止 Apple Events。在你的用户、托管或 CLI 设置中将 [`allowAppleEvents`](/docs/zh-CN/settings-reference#sandbox-allowappleevents) 设置为 `true` 以允许它们。项目设置对此密钥被忽略。启用它会移除代码执行隔离,因为沙箱化命令随后可以在没有用户提示的情况下启动其他未沙箱化的应用程序,并向运行的应用程序发送 AppleScript 命令,受 macOS 自动化同意提示 (TCC) 的约束。或者,将命令添加到 [`excludedCommands`](/docs/zh-CN/settings-reference#sandbox-excludedcommands)。893
749* **`docker` 命令失败**:`docker` 与沙箱不兼容。将 `docker *` 添加到 [`excludedCommands`](/docs/zh-CN/settings-reference#sandbox-excludedcommands)。894许多 CLI 工具需要访问特定的主机。在出现提示时批准该主机,或将其添加到 [`allowedDomains`](/docs/zh-CN/settings-reference#sandbox-network-alloweddomains)。如果您的组织使用 `allowManagedDomainsOnly` 锁定了允许列表,则不会出现提示,因此请让您的管理员添加该主机。
750* **`pbcopy`、`xclip` 或 `wl-copy` 不更新剪贴板**:这些剪贴板实用程序可能无法从沙箱内到达系统剪贴板,在这种情况下,管道传输到它们的文本不会到达。
751 895
752 要将 Claude 的输出放在你的剪贴板上,请要求 Claude 在其响应中打印它,然后运行 [`/copy`](/docs/zh-CN/commands)。`/copy` 从 Claude Code 进程而不是从沙箱化命令写入剪贴板。896<h3 id="jest-hangs-or-fails">
897 `jest` 挂起或失败
898</h3>
753 899
754 当 Claude 将文本管道传输到这些工具之一时,将该工具添加到 [`excludedCommands`](/docs/zh-CN/settings-reference#sandbox-excludedcommands) 本身不会将该调用从沙箱中取出。900`watchman` 与沙箱不兼容。改为运行 `jest --no-watchman`。
755* **git 命令因 `unable to unlink old` 失败**:`git merge`、`git checkout` 和类似命令在需要替换沙箱拒绝写入的文件时以这种方式失败,无论该文件是在 [protected path](#protected-paths) 下(如 `.claude/skills`),在你的 `denyWrite` 条目之一下,还是在沙箱允许命令写入的目录之外。在 Linux 和 WSL2 上,错误以 `Read-only file system` 结尾。
756 901
757 失败后,Claude 可能会 [提供在沙箱外重新运行命令](#the-unsandboxed-retry-escape-hatch);批准该重试,或在另一个终端中自己运行 git 命令。如果你已将 `allowUnsandboxedCommands` 设置为 `false`,Claude 无法提供重试,所以自己运行该命令。如果相同的 git 命令经常失败,将其添加到 [`excludedCommands`](/docs/zh-CN/settings-reference#sandbox-excludedcommands)。902<h3 id="go-based-clis-fail-tls-verification-on-macos">
758* **Bubblewrap 在容器内启动失败**:在无特权容器中,bubblewrap 无法挂载新的 `/proc` 文件系统,所以沙箱化命令因 `bwrap` 错误(如 `Can't mount proc on /newroot/proc: Operation not permitted`)失败。将 [`enableWeakerNestedSandbox`](/docs/zh-CN/settings-reference#sandbox-enableweakernestedsandbox) 设置为 `true`,以便内部沙箱绑定挂载容器的现有 `/proc`。仅在外部容器已提供你需要的隔离边界时使用此设置,因为它向沙箱化命令公开进程信息,而新的 `/proc` 挂载会隐藏这些信息。903 基于 Go 的 CLI 在 macOS 上 TLS 验证失败
759* **0 字节只读文件出现在 `.claude` 设置路径,"是的,不要再问"不保存**:在 Linux 和 WSL2 上,沙箱通过在沙箱化命令运行时在那里创建 0 字节只读占位符来对不存在的文件持有写入拒绝。沙箱在之后移除占位符。如果会话在该清理运行之前被杀死,例如通过 SIGKILL,占位符会留下。后续会话在每次启动时再次将它们绑定为只读,所以设置写入(如保存权限选择)在其中一个坐着的地方失败。904</h3>
905
906`gh`、`gcloud` 和 `terraform` 等工具在 [Seatbelt](#os-level-enforcement) 下可能无法通过 TLS 验证。要在沙箱外运行这些工具,请为每个工具向 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands) 添加一个模式,例如 `gh *`。这样该工具将以您的完整访问权限及其存储的凭据运行。如果您将 `httpProxyPort` 与 MITM 代理和自定义 CA 一起使用,请改为将 [`enableWeakerNetworkIsolation`](/docs/zh-CN/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-CN/settings-reference#sandbox-allowappleevents) 设置为 `true` 以允许它们。Claude Code 会忽略项目设置中的此键。
913
914启用 `allowAppleEvents` 会移除代码执行隔离,因为沙箱化命令随后可以在没有用户提示的情况下启动其他未沙箱化的应用程序,并向正在运行的应用程序发送 AppleScript 命令,但受 macOS 自动化同意提示 (TCC) 的约束。或者,向 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands) 添加一个模式,例如 `open *`。这样每次 `open` 调用都会经过权限流程,而 `open` 可以启动任何文件或应用,包括 Claude 编写的文件或应用。
915
916<h3 id="docker-commands-fail">
917 `docker` 命令失败
918</h3>
760 919
761 运行 `claude doctor` 以列出剩余的占位符文件。[`Stale sandbox mask files left by a killed session`](/docs/zh-CN/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` 命令可以访问什么。模式越窄,移出沙箱的命令就越少。
762* **`--dangerously-skip-permissions` 以 root 身份失败**:当在 Linux 和 macOS 上以 root 身份或通过 sudo 运行时,此标志被阻止,因为 root 访问加上没有权限提示可以修改系统上的任何文件或服务。检查在识别的沙箱内自动跳过。要在容器中自主运行,请使用 [dev container](/docs/zh-CN/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-CN/commands)。`/copy` 从 Claude Code 进程而不是从沙箱化命令写入剪贴板。
929
930当 Claude 将文本通过管道传给这些工具之一时,将该工具添加到 [`excludedCommands`](/docs/zh-CN/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-CN/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-CN/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` 套接字,而针对 `~/.ssh` 的 `denyRead` 或 `credentials` 条目会隐藏您的密钥文件
969
970在 macOS 上,将远程仓库切换为 HTTPS,这需要 HTTPS 凭据,例如个人访问令牌:
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-CN/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-CN/settings-reference#sandbox-network-allowlocalbinding) 设置为 `true`。这样沙箱化命令就可以监听网络端口并连接到 localhost 上的任何端口,包括在那里监听的所有其他服务。不需要身份验证的 localhost 服务(例如调试器)随后可以代表该命令在沙箱外执行操作,而在非回环地址上监听的命令会接受来自其他机器的连接
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-CN/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-CN/settings#change-a-setting-for-one-session) 启动了 Claude Code,请检查您传入的文件或 JSON 是否设置了上述某个键。如果是,请在那里更改该值,或在不带这些键的情况下重新启动 Claude Code。
1072* **`Enterprise managed settings`**:已加载您的组织的托管设置。如果它们设置了上述某个键,您无法通过 `/sandbox` 或您控制的任何设置文件更改该键,因此请联系您的管理员。
763 1073
764<h2 id="limitations">1074<h2 id="limitations">
765 限制1075 限制
771 安全限制1081 安全限制
772</h3>1082</h3>
773 1083
774* **网络过滤**:沙箱限制进程可以连接的域。默认情况下,内置代理不会终止或检查出站流量上的 TLS,因此不会检查加密连接的内容。实验性的 [`network.tlsTerminate`](/docs/zh-CN/settings-reference#sandbox-network-tlsterminate) 设置在代理处终止 TLS 以进行 [`mask` 凭证替换](#mask-credentials),但不添加内容过滤。你负责确保只有受信任的域在你的策略中被允许。1084* **网络过滤**:沙箱限制进程可以连接的域。默认情况下,内置代理不会终止或检查出站流量上的 TLS,因此不会检查加密连接的内容。实验性的 [`network.tlsTerminate`](/docs/zh-CN/settings-reference#sandbox-network-tlsterminate) 设置在代理处终止 TLS 以进行 [`mask` 凭据替换](#mask-credentials),但不添加内容过滤。您负责确保策略中只允许受信任的域。
775 1085
776<Warning>1086<Warning>
777 允许广泛的域名(例如 `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 感知网络隔离是一个活跃的开发领域。
778</Warning>1088</Warning>
779 1089
780* **通过 Unix 套接字的权限提升**:`allowUnixSockets` 配置可能会无意中授予对可能导致沙箱绕过的系统服务的访问权限。例如,允许访问 `/var/run/docker.sock` 有效地通过 Docker 套接字授予对主机系统的访问权限。仔细考虑你通过沙箱允许的任何 Unix 套接字。1090* **通过 Unix 套接字的权限提升**:`allowUnixSockets` 配置可能会无意中授予对可能导致沙箱绕过的系统服务的访问权限。例如,允许访问 `/var/run/docker.sock` 有效地通过 Docker 套接字授予对主机系统的访问权限。请仔细考虑通过沙箱允许的任何 Unix 套接字。
781* **文件系统权限提升**:过于宽泛的文件系统写入权限可能导致权限提升攻击。允许写入包含 `$PATH` 中的可执行文件、系统配置目录或用户 shell 配置文件(例如 `.bashrc` 或 `.zshrc`)的目录可能导致当其他用户或系统进程访问这些文件时在不同的安全上下文中执行代码。1091* **文件系统权限提升**:过于宽泛的文件系统写入权限可能导致权限提升攻击。允许写入包含 `$PATH` 中的可执行文件、系统配置目录或用户 shell 配置文件(例如 `.bashrc` 或 `.zshrc`)的目录可能导致当其他用户或系统进程访问这些文件时在不同的安全上下文中执行代码。
782* **Linux 沙箱强度**:Linux 实现提供强大的文件系统和网络隔离,但包括一个 `enableWeakerNestedSandbox` 模式,使其能够在 Docker 环境中工作而无需特权命名空间,或在禁用无特权用户命名空间的 Linux 主机上。此选项大大削弱了安全性,应仅在其他隔离被强制执行时使用。1092* **Linux 沙箱强度**:Linux 实现提供强大的文件系统和网络隔离,但包括一个 `enableWeakerNestedSandbox` 模式,使其能够在 Docker 环境中工作而无需特权命名空间。此选项大大削弱了安全性,应仅在其他隔离被强制执行时使用。
783* **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 设置中被遵守。项目设置无法启用它。
784 1094
785<h3 id="platform-and-tool-compatibility">
786 平台和工具兼容性
787</h3>
788
789* **平台支持**:支持 macOS、Linux 和 WSL2。不支持 WSL1 和原生 Windows。
790* **性能开销**:最小,但某些文件系统操作可能稍慢。
791* **工具兼容性**:某些需要特定系统访问模式的工具可能需要配置调整,或可能需要在沙箱外运行。
792
793<h3 id="scope">1095<h3 id="scope">
794 范围1096 范围
795</h3>1097</h3>
796 1098
797沙箱隔离 Bash 子进程。其他工具在不同的边界下运行:1099沙箱隔离 shell 命令及其子进程。[在沙箱外运行的内容](#what-runs-outside-the-sandbox)列出了它不涵盖的工具和辅助进程。计算机使用和子代理与沙箱的关系如下:
798 1100
799* **内置文件工具**:Read、Edit 和 Write 直接使用权限系统,而不是通过沙箱运行。请参阅 [permissions](/docs/zh-CN/permissions)。1101* **计算机使用**:当 Claude 打开应用程序并控制您的屏幕时,它在您的实际桌面上运行,而不是在隔离的环境中。每个应用程序的权限提示控制每个应用程序。请参阅 [CLI 中的计算机使用](/docs/zh-CN/computer-use) 或 [Desktop 中的计算机使用](/docs/zh-CN/desktop#let-claude-use-your-computer)。
800* **计算机使用**:当 Claude 打开应用程序并控制你的屏幕时,它在你的实际桌面上运行,而不是在隔离的环境中。每个应用程序的权限提示控制每个应用程序。请参阅 [CLI 中的计算机使用](/docs/zh-CN/computer-use) 或 [Desktop 中的计算机使用](/docs/zh-CN/desktop#let-claude-use-your-computer)。1102* **子代理**:[子代理](/docs/zh-CN/sub-agents) 在与父会话相同的进程中运行,并使用相同的沙箱配置。当在父会话中启用沙箱隔离时,子代理内的 Bash 命令被沙箱化。
801* **环境变量**:沙箱化 Bash 命令默认继承父进程环境,包括在那里设置的任何凭证。使用 [`sandbox.credentials`](#protect-credentials) 为沙箱化命令取消设置或掩盖特定变量,或设置 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/zh-CN/env-vars) 以从所有子进程中删除凭证。1103* **Mods**:[mod](/docs/zh-CN/plugins/mods/overview) 是一种在 Claude Code 内运行自身代码的插件,由 mod 启动的进程在沙箱外运行。请参阅 [mod 可以访问的内容](/docs/zh-CN/plugins/mods/overview#what-a-mod-can-reach)。
802* **子代理**:[subagents](/docs/zh-CN/sub-agents) 在与父会话相同的进程中运行,并使用相同的沙箱配置。当在父会话中启用沙箱时,子代理内的 Bash 命令被沙箱化。
803 1104
804<Warning>1105<Warning>
805 有效的沙箱需要同时进行文件系统和网络隔离。没有网络隔离,被破坏的代理可能会泄露敏感文件,如 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` 例外是否会撤销另一侧的限制。
806</Warning>1107</Warning>
807 1108
808<h2 id="see-also">1109<h2 id="see-also">