跳转到主要内容
Claude Code 支持细粒度权限,因此您可以精确指定代理允许执行的操作和不允许执行的操作。权限设置可以检入版本控制并分发给组织中的所有开发人员,也可以由个别开发人员自定义。

权限系统

Claude Code 使用分层权限系统来平衡功能和安全性: 在 Bash 或 PowerShell 权限提示上,按 Ctrl+E 显示命令的说明:它的作用、Claude 为什么运行它,以及可能出现的问题,标记为低风险中风险高风险。Claude Code 仅在您按 Ctrl+E 时将命令和 Claude 自己对调用的描述发送给模型以生成说明,而不是在每个提示上都发送。显示说明不会运行命令;再次按 Ctrl+E 隐藏它。 要关闭快捷键,请在 ~/.claude.json 中将 permissionExplainerEnabled 设置为 false

管理权限

您可以使用 /permissions 查看和管理 Claude Code 的工具权限。此 UI 列出所有权限规则和它们来自的 settings.json 文件。
  • Allow 规则让 Claude Code 使用指定的工具而无需手动批准。
  • Ask 规则在 Claude Code 尝试使用指定工具时提示确认。
  • Deny 规则防止 Claude Code 使用指定的工具。
规则按顺序评估:deny、ask,然后 allow。该顺序中的第一个匹配项决定结果,规则特异性不会改变顺序。 一个宽泛的 deny 规则(如 Bash(aws *))会阻止每个匹配的调用,包括也匹配更具体的 allow 规则(如 Bash(aws s3 ls))的调用,因此 deny 规则不能包含允许列表例外。ask 和 allow 之间也适用相同的优先级:匹配的 ask 规则即使更具体的 allow 规则也匹配同一调用,也会提示。 Deny 规则的行为取决于它们是命名工具还是在工具内范围化模式。像 Bash 这样的裸工具名称会将工具从 Claude 的上下文中完全移除,因此 Claude 永远看不到它。像 Bash(rm *) 这样的范围化规则会保留工具的可用性,并在 Claude 尝试时阻止匹配的调用。
权限规则由 Claude Code 强制执行,而不是由模型强制执行。您的提示或 CLAUDE.md 中的说明会影响 Claude 尝试执行的操作,但它们不会改变 Claude Code 允许的操作。要授予或撤销访问权限,请使用 /permissions、此处描述的规则、权限模式PreToolUse hook

权限模式

Claude Code 支持多种权限模式来控制工具的批准方式。请参阅权限模式了解何时使用每种模式。在您的设置文件中设置 defaultMode
bypassPermissions 模式跳过权限提示,包括对 .git.config/git.claude.vscode.idea.husky.cargo.devcontainer.yarn.mvn 的写入。仅在隔离环境(如容器或虚拟机)中使用此模式,其中 Claude Code 无法造成损害。此模式中仍会触发一些提示。显式 ask 规则、连接器工具您的组织设置为 ask和标记为 requiresUserInteraction 的 MCP 工具仍会提示。针对文件系统根目录或主目录的删除操作(如 rm -rf /rm -rf ~)也会作为断路器提示以防止模型错误,包括当命令包含带 $(...) 或反引号的命令替换或带 <(...) 的进程替换时。在 v2.1.208 之前,仅当以纯形式(如 rm -rf ~ 作为其自己的命令输入)时才会提示;通过替换到达删除操作的命令不会提示。
为了防止 bypassPermissionsauto 模式被使用,在任何设置文件中将 permissions.disableBypassPermissionsModepermissions.disableAutoMode 设置为 "disable"。这些在托管设置中最有用,因为它们无法被覆盖。

权限规则语法

权限规则遵循格式 ToolTool(specifier)

匹配工具的所有使用

要匹配工具的所有使用,只需使用工具名称而不带括号: Bash(*) 等同于 Bash 并匹配所有 Bash 命令。作为拒绝规则,两种形式都会从 Claude 的上下文中移除该工具。

使用说明符进行细粒度控制

在括号中添加说明符以匹配特定的工具使用:

按输入参数匹配

拒绝和询问规则可以使用 Tool(param:value) 匹配任何工具上的顶级输入参数。当 Claude 调用该工具且该参数设置为该确切值时,规则匹配。一个参数值的允许规则不会确立该调用总体上是安全的,因此允许规则继续使用每个工具自己的说明符语法。这适用于工具接受的任何标量参数: 参数匹配遵循以下规则:
  • 参数名称必须是工具输入的直接字段,例如 Agent 工具上的 model。嵌套在对象或数组内的字段不可匹配
  • 每个规则命名一个参数。要对 modelisolation 进行门控,请编写两个规则 Agent(model:opus)Agent(isolation:worktree),而不是在一个规则中组合它们
  • 该值支持 * 作为通配符,匹配任何字符序列,因此 Agent(isolation:*) 匹配任何显式隔离值。没有 * 时匹配是精确的
  • 模型省略的参数永远不会被匹配,因此 Agent(model:*) 不匹配留下 model 未设置的调用
  • 该值与 Claude 发送的文字输入进行比较,在任何规范化之前。Agent(model:opus) 匹配别名 opus 但不匹配完整模型 ID。使用 --verbose 运行以查看每个工具调用中的确切参数名称和值
  • 冒号周围的空格被忽略
工具已经用自己的规范化规则匹配的字段不能以这种方式匹配:Bash 和 PowerShell 的 command、Read、Edit 和 Write 的 file_path、Grep 和 Glob 的 path、NotebookEdit 的 notebook_path 和 WebFetch 的 url。像 Bash(command:rm *) 这样的规则可以通过复合命令绕过,因此 Claude Code 会忽略它并在启动时发出警告。改用 Bash(rm *)Read(./path)WebFetch(domain:host)

通配符模式

Bash 规则支持带有 * 的 glob 模式。通配符可以出现在命令中的任何位置。此配置允许 npm 和 git commit 命令,同时阻止 git push:
* 前的空格很重要:Bash(ls *) 匹配 ls -la 但不匹配 lsof,而 Bash(ls*) 匹配两者。:* 后缀是编写尾部通配符的等效方式,因此 Bash(ls:*) 匹配与 Bash(ls *) 相同的命令。 当您为命令前缀选择”是,不再询问”时,权限对话框会写入空格分隔的形式。:* 形式仅在模式末尾被识别。在像 Bash(git:* push) 这样的模式中,冒号被视为文字字符,不会匹配 git 命令。

工具名称通配符

拒绝和询问规则也接受工具名称位置中的 glob 模式。该模式必须匹配完整的工具名称:"*" 匹配每个工具,"mcp__*" 匹配所有服务器中的每个 MCP 工具。由裸名称 glob 拒绝规则匹配的工具会从 Claude 的上下文中移除,与裸工具名称相同。此配置拒绝每个 MCP 工具:
允许规则仅在文字 mcp__<server>__ 前缀之后接受工具名称 glob。服务器段必须不含 glob,以便规则命名您配置的特定服务器。mcp__puppeteer__* 匹配来自 puppeteer 服务器的每个工具,mcp__github__get_* 匹配其 get_ 工具。未锚定的允许 glob(如 "*""B*""mcp__*")会被跳过并显示警告,不会自动批准任何内容。 工具名称不匹配任何已知工具的拒绝或询问规则会在启动时产生警告以捕获拼写错误。包含 _* 的工具名称不受此检查的约束。 转录本和权限对话框中为工具显示的标签可能与其规范名称不同。例如,转录本中标记为 Stop Task 的工具具有规范名称 TaskStop。权限规则和 hook 匹配器 仅匹配规范名称,因此写作为 Stop Task 的规则不匹配。对于拒绝和询问规则,上面的启动警告会捕获不匹配。使用 工具参考 中列出的规范名称。

工具特定的权限规则

Bash

Bash 权限规则支持带有 * 的通配符匹配。通配符可以出现在命令中的任何位置,包括开头、中间或结尾:
  • Bash(npm run build) 匹配确切的 Bash 命令 npm run build
  • Bash(npm run test *) 匹配以 npm run test 开头的 Bash 命令
  • Bash(npm *) 匹配任何以 npm 开头的命令
  • Bash(* install) 匹配任何以 install 结尾的命令
  • Bash(git * main) 匹配 git checkout maingit log --oneline main 等命令
单个 * 匹配任何字符序列,包括空格,因此一个通配符可以跨越多个参数。Bash(git *) 匹配 git log --oneline --allBash(git * main) 匹配 git push origin main 以及 git merge main * 出现在末尾且前面有空格时(如 Bash(ls *)),它强制执行单词边界,要求前缀后跟空格或字符串结尾。例如,Bash(ls *) 匹配 ls -la 但不匹配 lsof。相比之下,Bash(ls*) 没有空格匹配 ls -lalsof 两者,因为没有单词边界约束。

复合命令

Claude Code 知道 shell 运算符,所以像 Bash(safe-cmd *) 这样的规则不会给它权限运行命令 safe-cmd && other-cmd。识别的命令分隔符是 &&||;||&& 和换行符。规则必须独立匹配每个子命令。
当您使用”是,不再询问”批准复合命令时,Claude Code 会为需要批准的每个子命令保存一个单独的规则,而不是为完整的复合字符串保存单个规则。例如,批准 git status && npm test 会为 npm test 保存一个规则,因此将来的 npm test 调用被识别,无论 && 前面是什么。诸如 cd 进入子目录之类的子命令会为该路径生成自己的 Read 规则。单个复合命令最多可能保存 5 个规则。

进程包装器

在匹配 Bash 规则之前,Claude Code 会剥离一组固定的进程包装器,因此像 Bash(npm test *) 这样的规则也匹配 timeout 30 npm test。识别的包装器是 timeouttimenicenohupstdbuf xargs 也被剥离,所以 Bash(grep *) 匹配 xargs grep pattern。剥离仅在 xargs 没有标志时适用:像 xargs -n1 grep pattern 这样的调用被匹配为 xargs 命令,因此为内部命令编写的规则不涵盖它。 此包装器列表是内置的,不可配置。开发环境运行器,如 direnv execdevbox runmise execnpxdocker exec 不在列表中。因为这些工具将其参数作为命令执行,像 Bash(devbox run *) 这样的规则匹配 run 之后的任何内容,包括 devbox run rm -rf .。要批准环境运行器内的工作,请编写一个包含运行器和内部命令的特定规则,如 Bash(devbox run npm test)。为您想要允许的每个内部命令添加一个规则。 Exec 包装器,如 watchsetsidioniceflock 总是提示,无法通过像 Bash(watch *) 这样的前缀规则自动批准。同样适用于带有 -exec-deletefindBash(find *) 规则不涵盖这些形式。要批准特定调用,请为完整命令字符串编写精确匹配规则。

只读命令

Claude Code 将一组内置 Bash 命令识别为只读,并在每种模式下无需权限提示即可运行它们。这些包括 lscatechopwdheadtailgrepfindwcwhichdiffstatducdgit 的只读形式。该集合不可配置;要对其中一个命令要求提示,请为其添加 askdeny 规则。 对于每个标志都是只读的命令,允许未引用的 glob 模式,因此 ls *.tswc -l src/*.py 无需提示即可运行。带有写入能力或执行能力标志的命令,如 findsortsedgit,在存在未引用的 glob 时仍然提示,因为 glob 可能扩展为像 -delete 这样的标志。 cd 进入工作目录或其他目录内的路径也是只读的。像 cd packages/api && ls 这样的复合命令在每个部分都符合条件时无需提示即可运行。在一个复合命令中组合 cdgit 时,当 cd 改变到不同目录时会提示,因为在新目录中运行 git 可以执行该目录的钩子。cd 的目标解析到当前工作目录是无操作的,不会触发此提示。 在一个复合命令中组合 cd 和输出重定向时,当 Claude Code 无法确定在 cd 运行后重定向目标解析到哪个目录时也会提示。仅重定向目标为 /dev/null 的命令,如 cd app; grep -r pattern . 2>/dev/null,不会触发此提示,因为 /dev/null 不依赖于工作目录。在 v2.1.207 之前,包含 cd 的复合命令会对任何输出重定向提示,包括仅重定向目标为 /dev/null 的重定向。
尝试约束命令参数的 Bash 权限模式很脆弱。例如,Bash(curl http://github.com/ *) 旨在将 curl 限制为 GitHub URL,但不会匹配以下变体:
  • URL 前的选项:curl -X GET http://github.com/...
  • 不同的协议:curl https://github.com/...
  • 重定向:curl -L http://bit.ly/xyz,重定向到 GitHub
  • 变量:URL=http://github.com && curl $URL
  • 额外空格:curl http://github.com
为了更可靠的 URL 过滤,请考虑:
  • 限制 Bash 网络工具:使用 deny 规则阻止 curlwget 和类似命令,然后对允许的域使用带有 WebFetch(domain:github.com) 权限的 WebFetch 工具
  • 使用 PreToolUse hooks:实现一个 hook 来验证 Bash 命令中的 URL 并阻止不允许的域
  • 添加 CLAUDE.md 指导:在 CLAUDE.md 中描述您允许的 curl 模式。这会影响 Claude 尝试的内容,但不会强制执行边界,因此请将其与上述选项之一配对
请注意,仅使用 WebFetch 不会阻止网络访问。如果允许 Bash,Claude 仍然可以使用 curlwget 或其他工具来访问任何 URL。

PowerShell

PowerShell 权限规则使用与 Bash 规则相同的形式。带有 * 的通配符可以在任何位置匹配,:* 后缀等同于尾部 *,而裸 PowerShellPowerShell(*) 匹配每个命令。此配置允许 Get-ChildItemgit commit 命令,同时阻止 Remove-Item
常见别名在匹配前被规范化。为 cmdlet 名称编写的规则也匹配其别名,因此 PowerShell(Get-ChildItem *) 匹配 gcilsdir。匹配不区分大小写。 Claude Code 解析 PowerShell AST 并独立检查复合命令中的每个命令。管道运算符 |、语句分隔符 ; 和 PowerShell 7+ 上的链运算符 &&|| 将复合命令分割为子命令。规则必须匹配每个子命令才能允许复合命令。

Read 和 Edit

Edit 规则适用于所有编辑文件的内置工具。Claude 尽力将 Read 规则应用于所有读取文件的内置工具,如 Grep 和 Glob,以及您提示中的 @file 提及,以及连接的 IDE 与 Claude 共享的选择和打开文件上下文。 Read deny 规则也会阻止同一路径上的 Edit 工具,包括在那里创建新文件。Write 和 NotebookEdit 不被覆盖,因此为任何工具都不能更改的路径添加 Edit deny 规则。需要 Claude Code v2.1.208 或更高版本。
Read 和 Edit deny 规则适用于 Claude 的内置文件工具和 Claude Code 在 Bash 中识别的文件命令,如 catheadtailsed。它们不适用于间接读取或写入文件的任意子进程,如打开文件本身的 Python 或 Node 脚本。为了获得阻止所有进程访问路径的 OS 级别强制执行,请启用沙箱
Read 和 Edit 规则都遵循 gitignore 规范,具有四种不同的模式类型:
/Users/alice/file 这样的模式不是绝对路径。单个前导斜杠锚定在设置源,而不是文件系统根目录。对于绝对路径,使用 //Users/alice/file
/path 模式锚定在与定义它的设置文件关联的目录,因此相同的规则根据您放置它的位置匹配不同的位置: Read(/secrets/**) 这样的 deny 规则在用户设置中阻止 ~/.claude/secrets/**,而不是您项目中的 secrets 目录。要在用户设置中编写适用于每个项目内部的规则,请改用 // 绝对路径或 ~/ 主目录相对路径。 在 Windows 上,路径在匹配前被规范化为 POSIX 形式。C:\Users\alice 变成 /c/Users/alice,因此使用 //c/**/.env 来匹配该驱动器上的 .env 文件。要在所有驱动器上匹配,使用 //**/.env 示例:
  • Edit(/docs/**):编辑 <project>/docs/ 中的文件(不是 /docs/ 也不是 <project>/.claude/docs/
  • Read(~/.zshrc):读取您主目录的 .zshrc
  • Edit(//tmp/scratch.txt):编辑绝对路径 /tmp/scratch.txt
  • Read(src/**):从 <current-directory>/src/ 读取
一个规则只匹配其锚点下的文件,因此锚点决定了 deny 规则的范围。裸文件名遵循 gitignore 语义并在任何深度匹配,因此 Read(.env)Read(**/.env) 是等价的:
在 gitignore 模式中,* 匹配单个路径段内的文本,可以出现在模式中的任何位置,而 ** 匹配跨目录。要允许所有文件访问,只需使用工具名称而不带括号:ReadEditWrite
当您使用”是,不再询问”批准文件路径时,Claude Code 会转义该路径中的 gitignore 模式字符,如 []*,因此生成的规则仅匹配您批准的字面路径。您自己编写的规则不会被转义。在 v2.1.202 之前,Claude Code 保存未转义的路径,因此为名为 [2024-06] Reports 的目录生成的规则可能无法匹配其自己的路径或匹配意外的兄弟目录。 当 Claude 访问符号链接时,权限规则检查两个路径:符号链接本身和它解析到的文件。Allow 和 deny 规则对该对的处理方式不同:allow 规则回退到提示您,而 deny 规则直接阻止。
  • Allow 规则:仅在符号链接路径及其目标都匹配时适用。允许目录内的符号链接指向其外部仍然会提示您。
  • Deny 规则:当符号链接路径或其目标匹配时适用。指向被拒绝文件的符号链接本身被拒绝。
例如,使用 Read(./project/**) 允许和 Read(~/.ssh/**) 拒绝,./project/key 处的符号链接指向 ~/.ssh/id_rsa 被阻止:目标未通过 allow 规则,并匹配 deny 规则。

WebFetch

WebFetch 规则使用 domain: 前缀并针对请求的 URL 的主机名进行匹配。匹配不区分大小写,支持 * 通配符,并从规则和主机名中剥离尾部 .,因此 example.com.example.com 被视为相同。
  • WebFetch(domain:example.com) 匹配对 example.com 的请求
  • WebFetch(domain:*.example.com) 匹配任何深度的任何子域,如 api.example.coma.b.example.com,但不匹配 example.com 本身
  • WebFetch(domain:*) 匹配每个域,等同于裸 WebFetch 规则
在前导 *. 或裸 * 以外的任何位置,通配符仅匹配两个点之间的文本。WebFetch(domain:example.*) 匹配 example.org,其中 * 变成 org,但不匹配 example.evil.com,其中 * 必须变成 evil.com 并跨越一个点。这防止尾部通配符匹配攻击者可以注册的域。

MCP

MCP 规则使用在 Claude Code 中配置的服务器名称,可选地后跟该服务器提供的工具的名称。
  • mcp__puppeteer 匹配由 puppeteer 服务器提供的任何工具
  • mcp__puppeteer__* 使用通配符语法,也匹配来自 puppeteer 服务器的所有工具
  • mcp__puppeteer__puppeteer_navigate 匹配由 puppeteer 服务器提供的 puppeteer_navigate 工具
如果您的组织已设置claude.ai 连接器工具为 ask,该工具的 allow 规则不会生效:Claude Code 在每次调用时都会提示,即使在 autobypassPermissions 模式下。在 dontAsk 模式下(从不提示),Claude Code 会拒绝调用。连接器工具显示为 mcp__claude_ai_<server>__<tool>

Agent(subagents)

使用 Agent(AgentName) 规则来控制 Claude 可以使用哪些子代理
  • Agent(Explore) 匹配 Explore 子代理
  • Agent(Plan) 匹配 Plan 子代理
  • Agent(my-custom-agent) 匹配名为 my-custom-agent 的自定义子代理
将这些规则添加到您的设置中的 deny 数组,或使用 --disallowedTools CLI 标志来禁用特定代理。要禁用 Explore 代理:

Cd

Cd 规则控制 /cd 命令可以将会话移动到哪些目录。Cd 不是模型可调用的工具:Claude 无法调用它,规则仅在您自己运行 /cd 时适用。 Cd deny 规则完全禁用 /cdCd(<path-pattern>) deny 规则阻止匹配的目标。Deny 规则检查目标的每个拼写,包括它解析的每个符号链接跳跃,因此为一个路径编写的规则也会阻止解析到它的目标。 添加任何 Cd allow 规则会将 /cd 切换到允许列表模式:解析的目标目录必须匹配您的一个 allow 规则,否则 /cd 拒绝。如果没有配置 Cd 规则,/cd 保持其默认行为并提示您信任不熟悉的目录。 路径模式共享来自 Read 和 Edit 规则//~// 锚点,但匹配锚定到整个目录路径而不是 gitignore 风格。* 匹配恰好一个路径段,** 匹配跨段。尾部 /** 也匹配其命名的根。

使用 hooks 扩展权限

Claude Code hooks 提供了一种方法来注册自定义 shell 命令以在运行时执行权限评估。当 Claude Code 进行工具调用时,PreToolUse hooks 在权限提示之前运行。hook 输出可以拒绝工具调用、强制提示或跳过提示以让调用继续。 Hook 决定不会绕过权限规则。Claude Code 评估 deny 和 ask 规则,无论 PreToolUse hook 返回什么:匹配的 deny 规则会阻止调用,匹配的 ask 规则即使在 hook 返回 "allow""ask" 时仍然会提示。这保留了管理权限中描述的 deny 优先级,包括在托管设置中设置的 deny 规则。 连接器工具您的组织设置为 ask和标记为 requiresUserInteraction 的 MCP 工具在 hook 返回 "allow" 时仍然会提示。 阻止 hook 也优先于 allow 规则。以退出代码 2 退出的 hook 在权限规则被评估之前停止工具调用,因此即使 allow 规则会让调用继续,阻止也适用。要运行所有 Bash 命令而无需提示,除了您想要阻止的少数几个,将 "Bash" 添加到您的 allow 列表,并注册一个 PreToolUse hook 来拒绝那些特定命令。请参见阻止对受保护文件的编辑以获取您可以调整的 hook 脚本。

工作目录

默认情况下,Claude 可以访问启动它的目录中的文件。您可以扩展此访问:
  • 启动期间:使用 --add-dir <path> CLI 参数
  • 会话期间:使用 /add-dir 命令
  • 持久配置:添加到设置文件中的 additionalDirectories
其他目录中的文件遵循与原始工作目录相同的权限规则:它们变为可读的而无需提示,文件编辑权限遵循当前权限模式。 在 macOS 上的后台会话中,会话主机会单独从您的终端请求访问受保护的文件夹(如 ~/Desktop~/Documents~/Downloads),当 Claude 需要在那里读取或写入文件时;如果读取失败并显示 Operation not permitted,请参阅如何向后台会话授予文件夹访问权限 要改变会话的主工作目录而不是添加另一个目录,请使用 /cd/cd 命令需要 Claude Code v2.1.169 或更高版本。与 /add-dir 不同,它重新定位会话:新目录的 CLAUDE.md 被加载,--resume 从那里找到会话。

其他目录授予文件访问权限,而不是配置

添加目录扩展 Claude 可以读取和编辑文件的位置。它不会使该目录成为完整的配置根目录:大多数 .claude/ 配置不是从其他目录发现的,尽管有几种类型作为例外被加载。 这些例外仅适用于使用 --add-dir 标志或 /add-dir 命令添加的目录。在设置文件中的 permissions.additionalDirectories 中列出的目录仅授予文件访问权限,不加载以下任何配置。 以下配置类型从 --add-dir 目录加载: 命令和输出样式从当前工作目录及其父目录、您在 ~/.claude/ 的用户目录和托管设置中发现。Hooks 和其他 settings.json 键从当前工作目录的 .claude/ 文件夹加载,没有父目录回退,同时从您的用户 ~/.claude/settings.json 和托管设置加载。要在项目间共享该配置,请使用以下方法之一:
  • 用户级配置:将文件放在 ~/.claude/agents/~/.claude/output-styles/~/.claude/settings.json 中,使其在每个项目中可用
  • 插件:将配置打包并分发为插件,团队可以安装
  • 从配置目录启动:从包含您想要的 .claude/ 配置的目录运行 Claude Code

权限如何与沙箱交互

权限和沙箱是互补的安全层:
  • 权限控制 Claude Code 可以使用哪些工具以及它可以访问哪些文件或域。它们适用于所有工具,包括 Bash、Read、Edit、WebFetch 和 MCP。
  • 沙箱提供 OS 级别的强制执行,限制 Bash 工具的文件系统和网络访问。它仅适用于 Bash 命令及其子进程。
使用两者进行深度防御:
  • 权限 deny 规则阻止 Claude 甚至尝试访问受限资源
  • 沙箱限制防止 Bash 命令到达定义边界之外的资源,即使提示注入绕过 Claude 的决策制定
  • 沙箱中的文件系统限制结合 sandbox.filesystem 设置与 Read 和 Edit deny 规则;两者都合并到最终的沙箱边界中
  • 网络限制结合 WebFetch 权限规则与沙箱的 allowedDomainsdeniedDomains 列表
当沙箱启用 autoAllowBashIfSandboxed: true(这是默认值)时,沙箱化的 Bash 命令无需提示即可运行,即使您的权限包括裸 Bash ask 规则,或等效的 Bash(*) 形式:沙箱边界替代了该整体工具提示。这些检查仍然适用:
  • 内容范围的 ask 规则(如 Bash(git push *))仍然强制提示
  • 显式 deny 规则仍然适用
  • 针对 /、您的主目录或其他关键系统路径的 rmrmdir 命令仍然会触发提示
不会在沙箱中运行的命令(如排除的命令)按照通常的方式遵守裸 Bash ask 规则。请参见沙箱模式以更改此行为。

托管设置

对于需要对 Claude Code 配置进行集中控制的组织,管理员可以部署无法被用户或项目设置覆盖的托管设置。这些策略设置遵循与常规设置文件相同的格式,可以通过 MDM/OS 级别策略、托管设置文件、服务器托管设置或自托管的 Claude apps gateway 传递。有关传递机制和文件位置,请参见设置文件

仅托管设置

以下设置仅在托管设置中有效。将它们放在用户或项目设置文件中无效。 disableBypassPermissionsMode 通常放在托管设置中以强制执行组织策略,但它可以从任何范围工作。用户可以在自己的设置中设置它以将自己锁定在绕过模式之外。
在 Team 和 Enterprise 计划上,Owner 在Claude Code 管理设置中启用或禁用远程控制网络会话组织范围内的设置。远程控制还可以通过 disableRemoteControl 设置按设备禁用。网络会话没有按设备托管设置密钥。

设置优先级

权限规则遵循与所有其他 Claude Code 设置相同的设置优先级
  1. 托管设置:无法被任何其他级别覆盖,包括命令行参数
  2. 命令行参数:临时会话覆盖
  3. 本地项目设置.claude/settings.local.json
  4. 共享项目设置.claude/settings.json
  5. 用户设置~/.claude/settings.json
如果工具在任何级别被拒绝,没有其他级别可以允许它。例如,托管设置 deny 无法被 --allowedTools 覆盖,--disallowedTools 可以添加超出托管设置定义的限制。 同样的规则也适用于设置范围:如果用户设置允许某个权限而项目设置拒绝它,deny 规则会阻止它。反之亦然:用户级别的 deny 会阻止项目级别的 allow,因为来自任何范围的 deny 规则在 allow 规则之前被评估。 嵌入主机可以在 parentSettingsBehavior 设置为 "merge" 时,通过 SDK managedSettings 选项提供额外的托管策略;嵌入器值可以收紧策略但不能放松它。

项目允许规则和工作区信任

项目的 .claude/settings.json 中的 permissions.allow 规则和 permissions.additionalDirectories 条目授予功能,因此 Claude Code 仅在您接受该工作区的工作区信任对话框后才应用它们。在此之前,Claude Code 会读取规则但不应用它们。信任对话框列出了该文件夹将授予的允许规则和其他目录,以便您可以在接受前查看它们。denyask 规则不受影响,因为它们仅限制。 Claude Code 按工作区保存信任,以 git 存储库根目录为键,或在存储库外,以您启动 Claude Code 的目录为键。当您从主目录启动时,信任仅在当前会话期间保持,不会写入磁盘;请参阅其他保护措施说明。信任父目录不会应用嵌套项目的允许规则。 .claude/settings.local.json 是您自己的文件,因此工作区信任检查通常不适用于它。当存储库可能提供了该文件时,例如当它提交到 git 或 .claude 是符号链接时,其允许规则和其他目录会像项目设置一样通过信任检查。 Claude Code 运行 git 来检查存储库是否提供了该文件,并且仅在被接受的信任对话框覆盖的文件夹中运行该检查,对于该文件夹或其父目录之一。在您尚未信任的文件夹中的交互式会话中,.claude/settings.local.json 中的允许规则和其他目录会像项目设置一样通过信任检查,直到您接受对话框,除非会话在您自己的配置主目录中运行,如下所述。在以下两个例外中,只有配置主目录例外在对话框之前适用,因为它不需要运行 git。确定目录不在 git 存储库内使用相同的 git 检查,因此不在存储库内的例外在接受覆盖该文件夹的信任对话框后生效。在 v2.1.207 之前,未跟踪的 .claude/settings.local.json 在您接受对话框之前在该文件夹中应用其允许规则。 .claude/settings.local.json 中的允许规则和其他目录在两种情况下也可以在没有工作区信任的情况下应用:
  • 您启动 Claude Code 的目录不在 git 存储库内。
  • 会话在您自己的配置主目录中运行:您的主目录或任何您已将其 .claude 子目录设置为 CLAUDE_CONFIG_DIR 的目录。
在这两种情况下,该文件都是您创建的,而不是存储库可能提供的文件,并且存储库提交的 .claude/settings.local.json 仍然需要工作区信任。版本 2.1.196 至 2.1.199 在这些工作区中将该文件视为存储库提供的文件,忽略其允许规则,并向 stderr 打印 this workspace has not been trusted 警告。上述两个例外与 v2.1.195 及更早版本相匹配,并在 v2.1.200 中恢复。 同样从 v2.1.200 开始,一个工作区的允许规则或其他目录仍未被应用,但由于父目录已被信任而从未显示信任对话框,会在您下次在那里交互式启动 Claude Code 时显示对话框。对话框提供两个选择:
  • Yes, I trust this folder:保存该工作区的信任并在同一会话中应用规则。
  • No, continue without these permissions:继续工作,忽略这些规则。对话框将在下一个会话中再次出现。
非交互模式中使用 -p,不会出现对话框,规则保持被忽略。

示例配置

存储库包括常见部署场景的启动设置配置。将这些用作起点并根据您的需要调整它们。

另请参见

  • Settings:完整的配置参考,包括权限设置表
  • Configure auto mode:告诉自动模式分类器您的组织信任哪些基础设施
  • Sandboxing:Bash 命令的 OS 级文件系统和网络隔离
  • Authentication:设置用户对 Claude Code 的访问
  • Security:安全保障和最佳实践
  • Hooks:自动化工作流并扩展权限评估