正文

Claude Code 可以帮你修改整个项目,但项目旁边的其他仓库、个人配置和密钥目录未必应该被一起交给它。Claude Code 2.1.314 引入 permissions.blockWritesOutsideWorkingDirectories,让内置文件编辑工具拒绝向工作目录之外写入。

这项设置不是完整的进程沙箱。它覆盖 Write、Edit 和 NotebookEdit,不限制 Shell 命令、MCP 工具或 Hook 启动的程序;开启后仍要分别配置和验证这些执行入口。官方配置说明

开启工作目录外写入限制

先查看本机 Claude Code 版本,确认至少为 2.1.314:

Bash
claude --version

在用户设置 ~/.claude/settings.json 的 permissions 对象中加入以下字段。如果文件已经有其他设置,合并字段,不要覆盖整个文件:

JSON
{
  "permissions": {
    "blockWritesOutsideWorkingDirectories": true
  }
}

也可以将此设置放在项目 .claude/settings.json,只对加载该项目设置的会话启用。企业统一限制应由管理员通过托管设置管理。重新打开会话后检查启动目录与设置来源;不同客户端和云端会话的加载方式可能不同。

官方说明,任何已加载设置中出现 true 都会启用限制;另一个文件中的 false 不能将它取消。如果需要关闭,应检查并移除所有生效来源中的该项,再重启会话。

哪些写入会被拒绝

执行入口这个开关的作用还要检查什么
Write、Edit、NotebookEdit所有权限模式下拒绝写入工作目录之外的路径,包括 bypassPermissions。启动目录、额外工作目录和实际工具调用。
Bash、PowerShell 和子进程此开关本身不限制它们。启用适用平台的进程沙箱,检查路径规则及是否允许无沙箱运行。
MCP 工具与 Hook 程序此开关不限制它们。分别审查服务器或程序权限、进程身份和可写范围。
云会话官方说明容器可能作为边界,设置可能不生效。在实际云环境验证容器挂载和写入权限。

官方也列出了例外:部分 Claude Code 自身文件仍可写;设置文件本身受到额外保护,即使在工作目录内,内置文件工具也会拒绝修改。启用该设置还会移除或拒绝 EnterWorktree / ExitWorktree,外部子 Agent worktree 也可能被拒绝。涉及 worktree 时应核对官方设置说明。

工作目录包括启动目录和通过可信入口添加的目录。/add-dir、启动参数 --add-dir 以及用户或托管设置中的 additionalDirectories 可以扩展范围;仅由仓库设置声明的额外目录不能假定会被写入限制认可。每增加一个目录,都意味着扩大可写范围。

用临时目录检查内置工具

下面的示例适用于 macOS、Linux 或 WSL2。测试需要 Claude Code 可登录并可使用模型;它会产生正常用量。所有测试文件都位于新建临时目录,先创建两个同级目录:

Bash
test_root="$(mktemp -d)"
mkdir -p "$test_root/work" "$test_root/outside"
printf '%s\n' "$test_root"

进入工作目录,在这一终端保留 test_root:

Bash
cd "$test_root/work"

要求 Agent 只用内置 Write 工具创建目录外的测试文件:

Bash
claude -p --tools Write --strict-mcp-config --permission-mode bypassPermissions --settings '{"permissions":{"blockWritesOutsideWorkingDirectories":true}}' --output-format stream-json --verbose "Use the Write tool to create $test_root/outside/probe.txt containing hello."

查看文件是否存在:

Bash
test -e "$test_root/outside/probe.txt" && printf '文件存在,检查配置和调用路径\n' || printf '目录外测试文件不存在\n'

预期结果是工具调用被拒绝,并且文件不存在。还要确认日志里确实出现了 Write 的拒绝:如果模型没有调用工具、会话启动失败或权限配置没有加载,单凭文件不存在不能证明限制生效。bypassPermissions 仅用于这个隔离测试,不建议作为日常默认权限模式。

DevelopersIO 的独立测试在隔离目录中对比了开关开启和关闭时的 Write 行为:开启时拒绝,关闭时测试文件被创建。该测试没有覆盖 Edit、NotebookEdit 或 Shell;本文也不把它当成对这些入口的实测结果。

Shell 和 MCP 要另外设边界

官方沙箱通过操作系统机制约束命令及子进程;macOS 使用 Seatbelt,Linux 和 WSL2 使用 bubblewrap。组织需要强制沙箱时,可由管理员部署以下设置:

JSON
{
  "sandbox": {
    "enabled": true,
    "failIfUnavailable": true,
    "allowUnsandboxedCommands": false
  }
}

failIfUnavailable 在平台不支持或依赖缺失时阻止启动;allowUnsandboxedCommands: false 阻止模型请求的无沙箱回退。原生 Windows 不运行该沙箱,使用这组设置会导致启动失败;Windows 用户需要按团队环境评估 WSL2 或其他隔离方案。官方沙箱文档

检查生效范围时,在临时目录中分别请求内置文件写入和 Shell 重定向,再检查实际文件;确认没有添加目录外写入白名单或排除命令。沙箱默认允许的读取、网络规则、凭据目录、用户主动输入的 Shell 命令以及 MCP 服务和 Hook 的权限,都需要单独检查。

写入仍然成功或项目内文件被拒绝时

  • 项目外文件仍被写入:先看实际使用的是 Write 还是 Shell、MCP 或 Hook;再检查启动目录、额外目录和客户端是否加载了设置。
  • 项目内设置文件被拒绝:官方对 Claude Code 设置文件有额外保护;由用户或管理员自行编辑设置。
  • 需要修改第二个仓库:明确确认目录后,使用 /add-dir 添加;不要为了方便添加整个用户目录。
  • 子 Agent worktree 无法编辑:检查 worktree 实际位置和额外目录配置;不要假定仓库内允许规则一定能穿过此限制。
  • 沙箱启动失败:检查操作系统、依赖和托管策略;不要把关闭沙箱当作默认修复。

检查通过的标准是:目标项目中的正常修改按预期工作,项目外的内置文件写入被明确拒绝;Shell、MCP 和 Hook 的实际权限也经过各自测试。更广泛的权限来源可参考 Claude Code 配置文件和权限怎么检查 与 AI Agent 权限怎么设。

参考来源

Claude Code v2.1.314 发布记录Anthropic写入限制配置及例外Claude Code 官方文档Claude Code 沙箱Claude Code 官方文档Claude Code 2.1.314 目录外写入测试DevelopersIO 独立测试

相关文章

Claude Code 配置文件和权限怎么检查开发环境 / 约 10 分钟如何让 AI 只改该改的文件:保障代码安全与项目完整的策略智能编程 / 约 9 分钟AI Agent 权限怎么设:哪些命令能自动跑,哪些必须人工确认智能编程 / 约 13 分钟Claude Code 每次都要确认 Bash 命令怎么办开发环境 / 约 12 分钟

作者信息