命令字典
Slash 命令、CLI 子命令、Hook 事件、启动参数的字典与演进史。
Slash 命令、CLI 子命令、Hook 事件、启动参数的字典与演进史。
切换沙箱模式提高安全性
/sandbox 是 Claude Code 的沙箱控制面板命令。运行后弹出一个交互面板,让你为当前会话的 Bash 工具开启 OS 级别的文件系统与网络隔离。沙箱由操作系统原语(macOS 上为 Seatbelt、Linux/WSL2 上为 bubblewrap)在进程层面强制执行,覆盖 Bash 命令及其所有子进程。
/sandbox不是 权限模式(permission mode)。权限模式决定工具调用"能不能跑",沙箱决定命令跑起来之后"能访问什么"。
平台支持:
| 平台 | 支持情况 | 沙箱实现 |
|---|---|---|
| macOS | 开箱即用,无需安装额外依赖 | Seatbelt(内置) |
| Linux | 需安装 bubblewrap + socat | bubblewrap |
| WSL2 | 需安装 bubblewrap + socat | bubblewrap |
| WSL1 | 不支持 | — |
| Windows(原生) | 不支持 | — |
在任意 Claude Code 会话中直接输入:
/sandbox
面板包含三个 Tab:
allowUnsandboxedCommands)若面板只显示 Dependencies Tab,表示缺少必要依赖,需先安装再重启 Claude Code。
# Ubuntu / Debian
sudo apt-get install bubblewrap socat
# Fedora
sudo dnf install bubblewrap socat
可选——用于 Unix domain socket 阻断的 seccomp filter:
npm install -g @anthropic-ai/sandbox-runtime
Ubuntu 24.04 及更高版本(含 WSL2)的 AppArmor 默认阻止 bubblewrap 创建用户命名空间。检查是否受影响:
sysctl kernel.apparmor_restrict_unprivileged_userns
# 返回 1 时需要以下操作,返回 0 或不存在则跳过
添加允许 bwrap 的 AppArmor profile:
sudo tee /etc/apparmor.d/bwrap > /dev/null <<'EOF'
abi <abi/4.0>,
include <tunables/global>
profile bwrap /usr/bin/bwrap flags=(unconfined) {
userns,
include if exists <local/bwrap>
}
EOF
sudo systemctl reload apparmor
在 Mode Tab 选择以下两种模式之一:
Auto-allow 模式:沙箱内的 Bash 命令自动放行,无需逐条确认。无法在沙箱内运行的命令降级到常规权限流程。
Regular permissions 模式:即使命令在沙箱内运行,仍走常规权限流程逐条提示。控制更精细,但确认次数更多。
选择模式后,Claude Code 将配置写入:
| 作用域 | 文件路径 | 说明 |
|---|---|---|
| 当前项目(不入 git) | .claude/settings.local.json | /sandbox 面板默认写入此处 |
| 用户全局 | ~/.claude/settings.json | 手动设置 sandbox.enabled: true |
| 组织强制 | managed settings | MDM 或 server-managed settings 下发 |
允许子进程写入工作目录之外的路径(如 kubectl、terraform、npm 常需要):
{
"sandbox": {
"enabled": true,
"filesystem": {
"allowWrite": ["~/.kube", "/tmp/build"]
}
}
}
屏蔽读取凭证目录(默认读权限覆盖全盘,含 ~/.aws、~/.ssh):
{
"sandbox": {
"enabled": true,
"filesystem": {
"denyRead": ["~/"],
"allowRead": ["."]
}
}
}
专用凭证保护 sandbox.credentials(v2.1.187+):声明沙箱命令不可访问的凭证文件与环境变量。列出的文件路径在沙箱内被拒绝读取(等同 filesystem.denyRead),列出的环境变量在每条沙箱命令运行前被 unset。该专用块把凭证规则与待 unset 的环境变量集中在一起,与一般文件系统规则分开。每个条目的 mode 仅支持 "deny" 一个值(显式字段是为兼容未来的模式)。注意:默认不存在内置凭证拒绝清单,只有你列出的文件/变量才受限;且仅作用于沙箱内的 Bash 命令。
{
"sandbox": {
"enabled": true,
"credentials": {
"files": [
{ "path": "~/.aws/credentials", "mode": "deny" },
{ "path": "~/.ssh", "mode": "deny" }
],
"envVars": [
{ "name": "GITHUB_TOKEN", "mode": "deny" },
{ "name": "NPM_TOKEN", "mode": "deny" }
]
}
}
}
严格模式(组织强制部署推荐):
{
"sandbox": {
"enabled": true,
"failIfUnavailable": true,
"allowUnsandboxedCommands": false
}
}
自定义代理(用于 HTTPS 流量审计):
{
"sandbox": {
"network": {
"httpProxyPort": 8080,
"socksProxyPort": 8081
}
}
}
沙箱内 Bash 命令默认继承父进程环境变量(含 API 密钥)。要从所有子进程(不限沙箱)中擦除 Anthropic 及云提供商凭证,设置 CLAUDE_CODE_SUBPROCESS_ENV_SCRUB 环境变量(官方 sandboxing/env-vars 页只说 "set CLAUDE_CODE_SUBPROCESS_ENV_SCRUB",未指定具体取值):
export CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1
注:官方文档仅要求「设置该变量」,
=1是常见约定写法,但官方页面未明确规定其值;若需仅针对沙箱命令精确擦除特定变量,优先用上文的sandbox.credentials.envVars。
| 前缀 | 含义 | 示例 |
|---|---|---|
/ | 从根目录起的绝对路径 | /tmp/build |
~/ | 相对于 home 目录 | ~/.kube → $HOME/.kube |
./ 或无前缀 | 相对于项目根(项目设置)或 ~/.claude(用户设置) | ./output |
| 约束 | 说明 |
|---|---|
| 默认写权限范围 | 仅当前工作目录 + 会话临时目录($TMPDIR) |
| 默认读权限范围 | 全盘可读,含 ~/.aws、~/.ssh(需手动 denyRead) |
| 网络:域名预许可 | 无预许可域名,每遇新域名首次触发确认提示 |
| 非 Bash 工具不受沙箱管辖 | Read/Edit/Write 工具、computer use、WebFetch MCP 均走各自权限系统 |
| Subagent 继承父会话沙箱配置 | 子 agent 的 Bash 命令在父会话启用沙箱时同样受沙箱约束 |
| TLS 不检查内容 | 内置代理仅按 hostname 过滤,不终止/检查 TLS 流量 |
settings.json 自动保护 | 沙箱内命令无法修改任何作用域的 settings.json(自动拒绝写入) |
/sandbox | 权限模式(auto mode) | --dangerously-skip-permissions | |
|---|---|---|---|
| 控制什么 | 命令运行后能访问什么 | 工具调用能不能运行 | 工具调用能不能运行 |
| 替代提示的机制 | OS 级沙箱边界(auto-allow 时) | 分类器审查 | 无(仅保留极少数 ask 规则) |
| 能否组合使用 | 可与 auto mode 叠加 | 可与 /sandbox 叠加 | 与沙箱无关联 |
| 覆盖范围 | 仅 Bash 及其子进程 | 所有工具 | 所有工具 |
~/.aws、~/.ssh 加入 denyRead,防止提示注入攻击通过沙箱内命令外泄密钥。failIfUnavailable: true + allowUnsandboxedCommands: false,确保所有开发者 Bash 操作都在沙箱内执行。enableWeakerNestedSandbox: true,允许 bubblewrap 在已有容器隔离边界内工作。jest 挂起或失败:watchman 与沙箱不兼容。改用 jest --no-watchman。
docker 命令失败:docker 与沙箱不兼容。将 docker * 加入 excludedCommands 使其在沙箱外运行。
macOS 上 Go 系 CLI(gh、gcloud、terraform)TLS 验证失败:这些工具在 Seatbelt 下可能出现 TLS 验证错误。将其加入 excludedCommands,或配合 MITM 代理时设置 enableWeakerNetworkIsolation: true。
Ubuntu 24.04+ bubblewrap 启动失败:AppArmor 默认阻止用户命名空间创建,按上方步骤添加 bwrap profile 后重启 Claude Code 和 AppArmor 即可。
WSL1 用户无法使用:/sandbox 面板会提示 Sandboxing requires WSL2。需将发行版升级至 WSL2 或在没有沙箱的情况下运行 Claude Code。
allowWrite 路径被用于权限升级:向含有 $PATH 可执行文件的目录、~/.bashrc/~/.zshrc 等 shell 配置文件开放写权限,可能导致其他进程以不同安全上下文执行恶意代码。开放前需仔细评估目标路径。
宽泛 allowedDomains(如 github.com)可能被域名前置技术绕过:内置代理不做 TLS 检查,domain fronting 等手法可能突破 hostname 过滤。高安全要求场景需配置带 TLS 终止的自定义代理。