12 权限系统12 权限系统
13</h2>13</h2>
14 14
15Claude Code 使用分层权限系统来平衡功能和安全性:15Claude Code 使用分层权限系统来平衡功能和安全性。该表显示了对于每种工具类型,手动模式是否在操作运行前询问。其他[权限模式](#permission-modes)改变了这些提示中的哪些会询问您;在自动模式中,分类器会审查操作而不是您,[分类器如何评估操作](/docs/zh-CN/permission-modes#how-the-classifier-evaluates-actions)列出了它看到的操作。
16 16
17| 工具类型 | 示例 | 需要批准 | "是,不再询问"行为 |17| 工具类型 | 示例 | 需要批准 | "是,不再询问"行为 |
18| :------ | :------------ | :------------------------------------ | :------------ |18| :------ | :------------ | :--------------------------------------------------------------- | :------------ |
19| 只读 | 文件读取、Grep | 否,在[工作目录和其他目录](#working-directories)内 | 不适用 |19| 只读 | 文件读取、Grep | 否,在[工作目录和其他目录](#working-directories)内 | 不适用 |
20| Bash 命令 | Shell 执行 | 是,除了内置的[只读命令](#read-only-commands)集合 | 每个项目目录和命令永久有效 |20| Bash 命令 | Shell 执行 | 是,除了内置的[只读命令](#read-only-commands)集合 | 每个项目目录和命令永久有效 |
21| 文件修改 | Edit/Write 文件 | 是 | 直到会话结束 |21| 文件修改 | Edit/Write 文件 | 是 | 直到会话结束 |
22| Web 获取 | WebFetch | 是,除了内置的[预批准文档域](/docs/zh-CN/tools-reference#webfetch-tool-behavior)集合 | 每个项目目录和域永久有效 |
23| Web 搜索 | WebSearch | 是 | 每个项目目录永久有效 |
22 24
23在 Bash 或 PowerShell 权限提示上,按 `Ctrl+E` 显示命令的说明:它的作用、Claude 为什么运行它,以及可能出现的问题,标记为**低风险**、**中风险**或**高风险**。Claude Code 仅在您按 `Ctrl+E` 时将命令和 Claude 自己对调用的描述发送给模型以生成说明,而不是在每个提示上都发送。显示说明不会运行命令;再次按 `Ctrl+E` 隐藏它。25当您选择"是,不再询问"且批准永久保存时(例如对于 Bash 命令或 WebFetch 域),Claude Code 会将规则保存到 git 项目根目录的 `.claude/settings.local.json`,通过[工作树](/docs/zh-CN/worktrees)解析到主检出。该规则适用于该项目中的未来会话,包括在子目录和工作树中启动的会话。文件修改批准不会保存到文件中:如表所示,它仅持续到会话结束。在某些情况下,例如在 git 项目外或在 Windows 上,Claude Code 不使用项目根目录;[Claude Code 查找每个文件的位置](/docs/zh-CN/settings#where-claude-code-looks-for-each-file)列出了这些情况以及它保存规则的位置。
24 26
25要关闭快捷键,请在 `~/.claude.json` 中将 [`permissionExplainerEnabled`](/docs/zh-CN/settings#global-config-settings) 设置为 `false`。27在 v2.1.211 之前,Claude Code 总是在启动目录中保存规则,因此在工作树或子目录中授予的批准不适用于项目的其余部分。早期版本在子目录或工作树中保存的规则仍然适用于在那里启动的会话。
28
29有时权限提示仅提供一次性批准,没有"不再询问"选项,也没有允许操作在会话的其余部分进行的选项。Claude Code 仅在提示可以向您显示它们允许的所有内容时才提供这些选项,因此您从提示保存的规则仅涵盖其选项命名的内容。
30
31当您启动 Claude Code 的目录是使选项标签过长的原因时,Claude Code 会在标签中缩短它,用 `~` 替换您的主目录,然后用 `…` 替换路径的末尾,并保留该选项。您仍然保存相同的规则。Claude Code 在三种情况下省略选项:
32
33* **命令或编辑:** 太大而无法完整显示。
34* **规则将涵盖的命令或路径:** 标签无法容纳它们全部。
35* **启动目录过长,未缩短:** 它包含 Claude Code 无法安全显示的字符,或者即使是其开头也无法容纳。
36
37批准该操作一次,或在 [`/permissions`](#manage-permissions) 中自己添加规则。
38
39<h3 id="add-a-comment-when-you-answer-a-permission-prompt">
40 在回答权限提示时添加注释
41</h3>
42
43您可以在批准或拒绝单个操作时向 Claude 附加注释。在大多数权限提示上,包括 Bash、PowerShell、文件和 MCP 工具提示,移动到**是**或**否**并按 `Tab` 在该选项上打开注释字段。WebFetch 和浏览器提示不提供该字段。允许操作在会话的其余部分进行或保存规则的选项也不接受注释。
44
45打开字段后,输入注释,然后按以下键之一:
46
47* `Enter`:提交您的答案并附加注释。如果您将字段留空,Claude Code 会提交答案而不附加注释。
48* `Tab`:关闭字段而不回答。Claude Code 保留您输入的文本,如果您使用该选项回答,仍会发送它。
49* `Shift+Tab`:在文件提示上,例如 Edit 或 Write 提示,关闭字段的方式与 `Tab` 相同。在 v2.1.235 之前,在字段内按 `Shift+Tab` 会选择允许操作在会话的其余部分进行的选项,因此 Claude Code 批准了会话其余部分的操作并丢弃了注释。
50
51Claude Code 根据您的回答方式以不同的方式传递注释:
52
53* **是**:Claude Code 运行操作,然后在结果后将您的注释发送给 Claude。
54* **否**:Claude Code 将您的注释作为拒绝原因发送给 Claude,Claude 继续工作。如果您在来自主对话的提示上选择**否**而不附加注释,Claude Code 会停止该轮。
26 55
27<h2 id="manage-permissions">56<h2 id="manage-permissions">
28 管理权限57 管理权限
29</h2>58</h2>
30 59
31您可以使用 `/permissions` 查看和管理 Claude Code 的工具权限。此 UI 列出所有权限规则和它们来自的 `settings.json` 文件。60您可以使用 `/permissions` 查看和管理 Claude Code 的工具权限。此对话框列出所有权限规则和它们来自的 `settings.json` 文件。您可以在 Claude 工作时打开此对话框:当您添加或删除规则时,Claude Code 会从 Claude 在同一轮中的下一个工具调用开始应用更改。在 v2.1.234 之前,Claude Code 会将命令排队直到轮次完成。
32 61
33* **Allow** 规则让 Claude Code 使用指定的工具而无需手动批准。62* **Allow** 规则让 Claude Code 使用指定的工具而无需手动批准。
34* **Ask** 规则在 Claude Code 尝试使用指定工具时提示确认。63* **Ask** 规则在 Claude Code 尝试使用指定工具时提示确认。
38 67
39一个宽泛的 deny 规则(如 `Bash(aws *)`)会阻止每个匹配的调用,包括也匹配更具体的 allow 规则(如 `Bash(aws s3 ls)`)的调用,因此 deny 规则不能包含允许列表例外。ask 和 allow 之间也适用相同的优先级:匹配的 ask 规则即使更具体的 allow 规则也匹配同一调用,也会提示。68一个宽泛的 deny 规则(如 `Bash(aws *)`)会阻止每个匹配的调用,包括也匹配更具体的 allow 规则(如 `Bash(aws s3 ls)`)的调用,因此 deny 规则不能包含允许列表例外。ask 和 allow 之间也适用相同的优先级:匹配的 ask 规则即使更具体的 allow 规则也匹配同一调用,也会提示。
40 69
41Deny 规则的行为取决于它们是命名工具还是在工具内范围化模式。像 `Bash` 这样的裸工具名称会将工具从 Claude 的上下文中完全移除,因此 Claude 永远看不到它。像 `Bash(rm *)` 这样的范围化规则会保留工具的可用性,并在 Claude 尝试时阻止匹配的调用。70Deny 规则的行为取决于它们是命名工具还是在工具内范围化模式。像 `Bash` 这样的裸工具名称会将工具从 Claude 的上下文中完全移除,因此 Claude 永远看不到它。裸名称移除适用于除了 [`EndConversation`](/docs/zh-CN/tools-reference#endconversation-tool-behavior) 之外的每个工具:当任何其他工具仍然存在时,deny 规则无法移除它,ask 规则永远不会为其提示。像 `Bash(rm *)` 这样的范围化规则会保留工具的可用性,并在 Claude 尝试时阻止匹配的调用。
42 71
43<Note>72<Note>
44 权限规则由 Claude Code 强制执行,而不是由模型强制执行。您的提示或 `CLAUDE.md` 中的说明会影响 Claude 尝试执行的操作,但它们不会改变 Claude Code 允许的操作。要授予或撤销访问权限,请使用 `/permissions`、此处描述的规则、[权限模式](/docs/zh-CN/permission-modes) 或 [PreToolUse hook](#extend-permissions-with-hooks)。73 权限规则由 Claude Code 强制执行,而不是由模型强制执行。您的提示或 `CLAUDE.md` 中的说明会影响 Claude 尝试执行的操作,但它们不会改变 Claude Code 允许的操作。要授予或撤销访问权限,请使用 `/permissions`、此处描述的规则、[权限模式](/docs/zh-CN/permission-modes) 或 [PreToolUse hook](#extend-permissions-with-hooks)。
45</Note>74</Note>
46 75
76当 [auto mode](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 对您的会话可用时,此对话框还包括 [auto mode 分类器规则](/docs/zh-CN/auto-mode-config#edit-rules-from-permissions)。选择 **Auto mode** 选项卡以查看它们。
77
47<h2 id="permission-modes">78<h2 id="permission-modes">
48 权限模式79 权限模式
49</h2>80</h2>
50 81
51Claude Code 支持多种权限模式来控制工具的批准方式。请参阅[权限模式](/docs/zh-CN/permission-modes)了解何时使用每种模式。在您的[设置文件](/docs/zh-CN/settings#settings-files)中设置 `defaultMode`:82Claude Code 支持多种权限模式来控制工具调用的批准方式。请参阅[权限模式](/docs/zh-CN/permission-modes)了解何时使用每种模式。要更改会话启动时的模式,请在您的[设置文件](/docs/zh-CN/settings#where-settings-live)中设置 `defaultMode`。[会话启动时的模式](/docs/zh-CN/permission-modes#which-mode-a-session-starts-in)涵盖了每个计划的内置默认值以及 VS Code 扩展读取的内容。
52 83
53| 模式 | 描述 |84| 模式 | 描述 |
54| :------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |85| :------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
55| `default` | 标准行为:在首次使用每个工具时提示权限。在 CLI、VS Code 和 JetBrains 扩展以及桌面应用中标记为 Manual,Claude Code 接受 `manual` 作为别名。标签和别名需要 Claude Code v2.1.200 或更高版本。桌面应用的标签不依赖于您的 CLI 版本 |86| `default` | 在首次使用每个工具时提示权限。在 CLI、VS Code 和 JetBrains 扩展以及桌面应用中标记为 Manual,Claude Code 接受 `manual` 作为别名。标签和别名需要 Claude Code v2.1.200 或更高版本。桌面应用的标签不依赖于您的 CLI 版本 |
56| `acceptEdits` | 自动接受工作目录或 `additionalDirectories` 中路径的文件编辑和常见文件系统命令(`mkdir`、`touch`、`mv`、`cp` 等) |87| `acceptEdits` | 自动接受工作目录或 `additionalDirectories` 中路径的文件编辑和常见文件系统命令,例如 `mkdir`、`touch`、`mv` 和 `cp` |
57| `plan` | Claude 读取文件并运行只读 shell 命令来探索,但不编辑您的源文件。在 CLI 和 VS Code 扩展中标记为 Plan |88| `plan` | Claude 读取文件并运行只读 shell 命令来探索,但不编辑您的源文件;在[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)可用的情况下,分类器批准的命令也会运行。在 CLI 和 VS Code 扩展中标记为 Plan |
58| `auto` | 自动批准工具调用,并进行后台安全检查以验证操作与您的请求一致 |89| `auto` | 自动批准工具调用,并进行后台安全检查以验证操作与您的请求一致 |
59| `dontAsk` | 自动拒绝工具,除非通过 `/permissions` 或 `permissions.allow` 规则预先批准。`AskUserQuestion`、连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)和标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具即使您已允许它们也会被拒绝 |90| `dontAsk` | 自动拒绝工具,除非通过 `/permissions` 或 `permissions.allow` 规则预先批准。`AskUserQuestion`、标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具以及连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)即使您已允许它们也会被拒绝 |
60| `bypassPermissions` | 跳过权限提示,除了由显式 `ask` 规则强制的提示、连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)和标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具。根目录和主目录删除操作(如 `rm -rf /`)仍会作为断路器提示 |91| `bypassPermissions` | 跳过权限提示,除了[任何模式都不会自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves) |
61 92
62<Warning>93<Warning>
63 `bypassPermissions` 模式跳过权限提示,包括对 `.git`、`.config/git`、`.claude`、`.vscode`、`.idea`、`.husky`、`.cargo`、`.devcontainer`、`.yarn` 和 `.mvn` 的写入。仅在隔离环境(如容器或虚拟机)中使用此模式,其中 Claude Code 无法造成损害。94 在 `bypassPermissions` 模式中,Claude Code 跳过权限提示,包括对[受保护路径](/docs/zh-CN/permission-modes#protected-paths)(例如 `.git` 和 `.claude`)的写入。[跨会话消息传递保护措施](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)仍然适用。仅在隔离环境(如容器或虚拟机)中使用此模式,其中 Claude Code 无法造成损害。
64
65 此模式中仍会触发一些提示。显式 `ask` 规则、连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)和标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具仍会提示。针对文件系统根目录或主目录的删除操作(如 `rm -rf /` 和 `rm -rf ~`)也会作为断路器提示以防止模型错误,包括当命令包含带 `$(...)` 或反引号的命令替换或带 `<(...)` 的进程替换时。在 v2.1.208 之前,仅当以纯形式(如 `rm -rf ~` 作为其自己的命令输入)时才会提示;通过替换到达删除操作的命令不会提示。
66</Warning>95</Warning>
67 96
68为了防止 `bypassPermissions` 或 `auto` 模式被使用,在任何[设置文件](/docs/zh-CN/settings#settings-files)中将 `permissions.disableBypassPermissionsMode` 或 `permissions.disableAutoMode` 设置为 `"disable"`。这些在[托管设置](#managed-settings)中最有用,因为它们无法被覆盖。97为了防止 `bypassPermissions` 或 `auto` 模式被使用,在任何[设置文件](/docs/zh-CN/settings#where-settings-live)中将 `permissions.disableBypassPermissionsMode` 或 `permissions.disableAutoMode` 设置为 `"disable"`。这些在[托管设置](#managed-settings)中最有用,因为它们无法被覆盖。
69 98
70<h2 id="permission-rule-syntax">99<h2 id="permission-rule-syntax">
71 权限规则语法100 权限规则语法
72</h2>101</h2>
73 102
74权限规则遵循格式 `Tool` 或 `Tool(specifier)`。103权限规则遵循格式 `Tool` 或 `Tool(specifier)`。括号内的说明符是字面意思,因此包含括号的命令或路径不需要转义。
75 104
76<h3 id="match-all-uses-of-a-tool">105<h3 id="match-all-uses-of-a-tool">
77 匹配工具的所有使用106 匹配工具的所有使用
103 按输入参数匹配132 按输入参数匹配
104</h3>133</h3>
105 134
106拒绝和询问规则可以使用 `Tool(param:value)` 匹配任何工具上的顶级输入参数。当 Claude 调用该工具且该参数设置为该确切值时,规则匹配。一个参数值的允许规则不会确立该调用总体上是安全的,因此允许规则继续使用每个工具自己的说明符语法。这适用于工具接受的任何标量参数:135拒绝和询问规则可以使用 `Tool(param:value)` 匹配任何内置工具上的顶级输入参数。
136
137要匹配 MCP 工具上的参数,请使用 [`--disallowedTools`](/docs/zh-CN/cli-reference#cli-flags) 传递拒绝规则。当 Claude Code 加载设置文件时,它会跳过任何具有括号的 `mcp__` 规则。Claude Code 在交互式会话启动时在无效设置对话框中列出跳过的规则,以及在 [`claude doctor`](/docs/zh-CN/debug-your-config#check-resolved-settings) 输出中列出。
138
139当 Claude 使用该参数设置为该确切值调用工具时,参数规则匹配。一个参数值的允许规则不会确立该调用总体上是安全的,因此允许规则继续使用每个工具自己的说明符语法。这适用于工具接受的任何标量参数:
107 140
108| 规则 | 匹配 |141| 规则 | 匹配 |
109| :----------------------------- | :------------------------- |142| :----------------------------- | :------------------------- |
120* 该值与 Claude 发送的文字输入进行比较,在任何规范化之前。`Agent(model:opus)` 匹配别名 `opus` 但不匹配完整模型 ID。使用 [`--verbose`](/docs/zh-CN/cli-reference) 运行以查看每个工具调用中的确切参数名称和值153* 该值与 Claude 发送的文字输入进行比较,在任何规范化之前。`Agent(model:opus)` 匹配别名 `opus` 但不匹配完整模型 ID。使用 [`--verbose`](/docs/zh-CN/cli-reference) 运行以查看每个工具调用中的确切参数名称和值
121* 冒号周围的空格被忽略154* 冒号周围的空格被忽略
122 155
123工具已经用自己的规范化规则匹配的字段不能以这种方式匹配: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)`。156您不能以这种方式匹配工具的主要内容字段: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)`。
124 157
125<h3 id="wildcard-patterns">158<h3 id="wildcard-patterns">
126 通配符模式159 通配符模式
127</h3>160</h3>
128 161
129Bash 规则支持带有 `*` 的 glob 模式。通配符可以出现在命令中的任何位置。此配置允许 npm 和 git commit 命令,同时阻止 git push:162Bash 规则中的 `*` 匹配任何文本,包括空格,因此一个规则涵盖一系列命令。没有 `*` 的规则匹配一个确切的命令。
163
164<Warning>
165 将 `*` 放在子命令之后。在 `git log --oneline main` 中,`git` 是程序,`log` 是子命令,是确定程序执行什么操作的词。Claude Code 按照编写的方式匹配第一个 `*` 之前的所有内容,因此这些词是限制规则的内容:`Bash(git log *)` 仅允许 `git log` 命令,`Bash(git *)` 允许每个 git 命令。Claude Code [在启动时警告](/docs/zh-CN/errors#has-a-wildcard-before-the-rest-of-the-command)关于在子命令之前有 `*` 的允许规则,例如 `Bash(git * main)`。
166</Warning>
167
168编写您希望 Claude 运行而不询问的命令,并用 `*` 替换变化的部分。使用此配置,Claude Code 运行 npm 脚本和 git 提交而不询问,并拒绝以 `git push` 开头的命令。以另一种方式编写的推送,例如 `git -C . push`,不匹配;请参阅 [Bash 规则不匹配的内容](#bash-rule-limits)。
130 169
131```json theme={null}170```json theme={null}
132{171{
133 "permissions": {172 "permissions": {
134 "allow": [173 "allow": [
135 "Bash(npm run *)",174 "Bash(npm run *)",
136 "Bash(git commit *)",175 "Bash(git commit *)"
137 "Bash(git * main)",
138 "Bash(* --version)",
139 "Bash(* --help *)"
140 ],176 ],
141 "deny": [177 "deny": [
142 "Bash(git push *)"178 "Bash(git push *)"
145}181}
146```182```
147 183
148`*` 前的空格很重要:`Bash(ls *)` 匹配 `ls -la` 但不匹配 `lsof`,而 `Bash(ls*)` 匹配两者。`:*` 后缀是编写尾部通配符的等效方式,因此 `Bash(ls:*)` 匹配与 `Bash(ls *)` 相同的命令。184`*` 可以出现在规则中的任何位置:开始、中间或结尾。每行显示一个规则、它匹配的命令以及附近它不匹配的命令:
185
186| 您编写 | 匹配 | 不匹配 |
187| :--------------------- | :--------------------------------------------------------------------------------- | :------------------------------------ |
188| `Bash(npm run build)` | `npm run build` | `npm run build --watch` |
189| `Bash(npm run *)` | `npm run build`、`npm run test --watch`、`npm run` | `npm install` |
190| `Bash(git log * main)` | `git log --oneline main`、`git log -5 main`、`git log --output=<file> main` | `git log main`、`git push origin main` |
191| `Bash(git * main)` | `git merge main`、`git push origin main`、`git -c core.fsmonitor=<script> diff main` | `git log` |
192| `Bash(* --version)` | `node --version`、`bash -c 'echo hi' --version` | `node -v` |
193| `Bash(ls *)` | `ls -la`、`ls` | `lsof` |
194| `Bash(ls*)` | `ls -la`、`lsof` | |
195| `Bash(* --help *)` | `npm --help x` | `npm --help` |
196
197三个匹配规则产生这些行:
198
199* **`*` 代表其位置上的任何文本。** 在 `Bash(git * main)` 中,它代表子命令,因此 Claude Code 匹配每个 git 子命令和它之前的每个选项。这包括 `-c`,它使 git 运行您命名的程序。在 `Bash(* --version)` 中,`*` 代表程序,因此任何程序都匹配。
200* **末尾的 `*`,前面有空格,也匹配裸命令。** `Bash(ls *)` 匹配 `ls`,`Bash(git log *)` 匹配 `git log`。这仅在尾部 `*` 是规则的唯一通配符时成立:`Bash(* --help *)` 匹配 `npm --help x` 但不匹配 `npm --help`。
201* **尾部 `*` 前的空格是规则的一部分。** `Bash(ls *)` 在 `ls` 后需要一个空格,因此 `lsof` 不匹配。`Bash(ls*)` 没有空格,因此它也匹配 `lsof`。
202
203`:*` 后缀是编写尾部通配符的等效方式,因此 `Bash(ls:*)` 匹配与 `Bash(ls *)` 相同的命令。
149 204
150当您为命令前缀选择"是,不再询问"时,权限对话框会写入空格分隔的形式。`:*` 形式仅在模式末尾被识别。在像 `Bash(git:* push)` 这样的模式中,冒号被视为文字字符,不会匹配 git 命令。205当您为命令前缀选择"是,不再询问"时,权限对话框会写入空格分隔的形式。`:*` 形式仅在模式末尾被识别。在像 `Bash(git:* push)` 这样的模式中,冒号被视为文字字符,不会匹配 git 命令。
151 206
153 工具名称通配符208 工具名称通配符
154</h3>209</h3>
155 210
156拒绝和询问规则也接受工具名称位置中的 glob 模式。该模式必须匹配完整的工具名称:`"*"` 匹配每个工具,`"mcp__*"` 匹配所有服务器中的每个 MCP 工具。由裸名称 glob 拒绝规则匹配的工具会从 Claude 的上下文中移除,与裸工具名称相同。此配置拒绝每个 MCP 工具:211拒绝和询问规则也接受工具名称位置中的 glob 模式。该模式必须匹配完整的工具名称:`"*"` 匹配每个工具,`"mcp__*"` 匹配所有服务器中的每个 MCP 工具。由裸名称 glob 拒绝规则匹配的工具会从 Claude 的上下文中移除,与裸工具名称相同,包括 [`EndConversation`](/docs/zh-CN/tools-reference#endconversation-tool-behavior) 例外:glob 拒绝在任何其他工具保留时无法移除它,glob 询问永远不会提示它。此配置拒绝每个 MCP 工具:
157 212
158```json theme={null}213```json theme={null}
159{214{
169 224
170工具名称不匹配任何已知工具的拒绝或询问规则会在启动时产生警告以捕获拼写错误。包含 `_` 或 `*` 的工具名称不受此检查的约束。225工具名称不匹配任何已知工具的拒绝或询问规则会在启动时产生警告以捕获拼写错误。包含 `_` 或 `*` 的工具名称不受此检查的约束。
171 226
172转录本和权限对话框中为工具显示的标签可能与其规范名称不同。例如,转录本中标记为 `Stop Task` 的工具具有规范名称 `TaskStop`。权限规则和 [hook 匹配器](/docs/zh-CN/hooks) 仅匹配规范名称,因此写作为 `Stop Task` 的规则不匹配。对于拒绝和询问规则,上面的启动警告会捕获不匹配。使用 [工具参考](/docs/zh-CN/tools-reference) 中列出的规范名称。227转录本和权限对话框中为工具显示的标签可能与其规范名称不同。例如,转录本中标记为 `Stop Task` 的工具具有规范名称 `TaskStop`。权限规则和 [hook 匹配器](/docs/zh-CN/hooks) 不匹配标签,因此写作为 `Stop Task` 的规则不匹配。对于拒绝和询问规则,上面的启动警告会捕获不匹配。使用 [工具参考](/docs/zh-CN/tools-reference) 中列出的规范名称。
173 228
174<h2 id="tool-specific-permission-rules">229<h2 id="tool-specific-permission-rules">
175 工具特定的权限规则230 工具特定的权限规则
179 Bash234 Bash
180</h3>235</h3>
181 236
182Bash 权限规则支持带有 `*` 的通配符匹配。通配符可以出现在命令中的任何位置,包括开头、中间或结尾:237Bash 规则匹配整个命令文本,其中 `*` 代表任何文本。[通配符模式](#wildcard-patterns)显示每个规则形状匹配的命令以及在哪里放置 `*`。本节的其余部分涵盖 Claude Code 如何匹配复合命令和包装器、规则不匹配的内容、只读命令和重定向。
183
184* `Bash(npm run build)` 匹配确切的 Bash 命令 `npm run build`
185* `Bash(npm run test *)` 匹配以 `npm run test` 开头的 Bash 命令
186* `Bash(npm *)` 匹配任何以 `npm ` 开头的命令
187* `Bash(* install)` 匹配任何以 ` install` 结尾的命令
188* `Bash(git * main)` 匹配 `git checkout main` 和 `git log --oneline main` 等命令
189
190单个 `*` 匹配任何字符序列,包括空格,因此一个通配符可以跨越多个参数。`Bash(git *)` 匹配 `git log --oneline --all`,`Bash(git * main)` 匹配 `git push origin main` 以及 `git merge main`。
191
192当 `*` 出现在末尾且前面有空格时(如 `Bash(ls *)`),它强制执行单词边界,要求前缀后跟空格或字符串结尾。例如,`Bash(ls *)` 匹配 `ls -la` 但不匹配 `lsof`。相比之下,`Bash(ls*)` 没有空格匹配 `ls -la` 和 `lsof` 两者,因为没有单词边界约束。
193 238
194<h4 id="compound-commands">239<h4 id="compound-commands">
195 复合命令240 复合命令
199 Claude Code 知道 shell 运算符,所以像 `Bash(safe-cmd *)` 这样的规则不会给它权限运行命令 `safe-cmd && other-cmd`。识别的命令分隔符是 `&&`、`||`、`;`、`|`、`|&`、`&` 和换行符。规则必须独立匹配每个子命令。244 Claude Code 知道 shell 运算符,所以像 `Bash(safe-cmd *)` 这样的规则不会给它权限运行命令 `safe-cmd && other-cmd`。识别的命令分隔符是 `&&`、`||`、`;`、`|`、`|&`、`&` 和换行符。规则必须独立匹配每个子命令。
200</Tip>245</Tip>
201 246
247Deny 和 ask 规则在任何子命令匹配它们时适用,包括嵌套在子 shell 中的命令、命令替换或控制流体(如 `for` 循环)中的命令。像 `Bash(git clean *)` 这样的 ask 规则仍然会提示您 `cd /tmp && git clean -f` 或 `echo "$(git clean -f)"`,即使在[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)中。
248
249当 `&&` 或 `||` 后面没有任何内容时,例如在 `npm test &&` 中,Claude Code 将命令视为无法解析,不会将其分割为子命令以进行 allow 规则匹配,因此像 `Bash(npm *)` 这样的规则不会批准它。
250
202当您使用"是,不再询问"批准复合命令时,Claude Code 会为需要批准的每个子命令保存一个单独的规则,而不是为完整的复合字符串保存单个规则。例如,批准 `git status && npm test` 会为 `npm test` 保存一个规则,因此将来的 `npm test` 调用被识别,无论 `&&` 前面是什么。诸如 `cd` 进入子目录之类的子命令会为该路径生成自己的 Read 规则。单个复合命令最多可能保存 5 个规则。251当您使用"是,不再询问"批准复合命令时,Claude Code 会为需要批准的每个子命令保存一个单独的规则,而不是为完整的复合字符串保存单个规则。例如,批准 `git status && npm test` 会为 `npm test` 保存一个规则,因此将来的 `npm test` 调用被识别,无论 `&&` 前面是什么。诸如 `cd` 进入子目录之类的子命令会为该路径生成自己的 Read 规则。单个复合命令最多可能保存 5 个规则。
203 252
204<h4 id="process-wrappers">253<h4 id="process-wrappers">
205 进程包装器254 包装器
206</h4>255</h4>
207 256
208在匹配 Bash 规则之前,Claude Code 会剥离一组固定的进程包装器,因此像 `Bash(npm test *)` 这样的规则也匹配 `timeout 30 npm test`。识别的包装器是 `timeout`、`time`、`nice`、`nohup` 和 `stdbuf`。257在匹配 Bash 规则之前,Claude Code 会剥离一组固定的包装器,因此像 `Bash(npm test *)` 这样的规则也匹配 `timeout 30 npm test`。被剥离的包装器是 `timeout`、`time`、`nice`、`nohup` 和 `stdbuf`,加上 shell 内置命令 `command` 和 `builtin`,以及 zsh 的 `noglob`。每个都将其参数作为实际命令运行。两个相关的形式不被剥离:查询形式 `command -v`,它查找命令而不是运行命令,以及 zsh 的 `nocorrect`。
258
259Claude Code 也会剥离某些已知安全的环境变量的前导赋值,因此 `Bash(npm test *)` 匹配 `NODE_ENV=test npm test`。Allow 规则不会匹配超过任何其他变量的赋值。Deny 或 ask 规则匹配超过任何前导赋值,因此 deny 中的 `Bash(rm *)` 仍然匹配 `FOO=bar rm -rf tmp/`。
209 260
210裸 `xargs` 也被剥离,所以 `Bash(grep *)` 匹配 `xargs grep pattern`。剥离仅在 `xargs` 没有标志时适用:像 `xargs -n1 grep pattern` 这样的调用被匹配为 `xargs` 命令,因此为内部命令编写的规则不涵盖它。261裸 `xargs` 也被剥离,所以 `Bash(grep *)` 匹配 `xargs grep pattern`。剥离仅在 `xargs` 没有标志时适用:像 `xargs -n1 grep pattern` 这样的调用被匹配为 `xargs` 命令,因此为内部命令编写的规则不涵盖它。
211 262
212此包装器列表是内置的,不可配置。开发环境运行器,如 `direnv exec`、`devbox run`、`mise exec`、`npx` 和 `docker exec` 不在列表中。因为这些工具将其参数作为命令执行,像 `Bash(devbox run *)` 这样的规则匹配 `run` 之后的任何内容,包括 `devbox run rm -rf .`。要批准环境运行器内的工作,请编写一个包含运行器和内部命令的特定规则,如 `Bash(devbox run npm test)`。为您想要允许的每个内部命令添加一个规则。263此包装器列表是内置的,不可配置。开发环境运行器,如 `direnv exec`、`devbox run`、`mise exec`、`npx` 和 `docker exec` 不在列表中。因为这些工具将其参数作为命令执行,像 `Bash(devbox run *)` 这样的规则匹配 `run` 之后的任何内容,包括 `devbox run rm -rf .`。要批准环境运行器内的工作,请编写一个包含运行器和内部命令的特定规则,如 `Bash(devbox run npm test)`。为您想要允许的每个内部命令添加一个规则。
213 264
214Exec 包装器,如 `watch`、`setsid`、`ionice` 和 `flock` 总是提示,无法通过像 `Bash(watch *)` 这样的前缀规则自动批准。同样适用于带有 `-exec` 或 `-delete` 的 `find`:`Bash(find *)` 规则不涵盖这些形式。要批准特定调用,请为完整命令字符串编写精确匹配规则。265Exec 包装器,如 `watch`、`setsid`、`ionice` 和 `flock` 无法通过像 `Bash(watch *)` 这样的前缀规则自动批准,因此在 Manual 模式下它们总是提示。同样适用于带有 `-exec` 或 `-delete` 的 `find`:`Bash(find *)` 规则不涵盖这些形式。要批准特定调用,请为完整命令字符串编写精确匹配规则。
266
267<h4 id="bash-rule-limits">
268 Bash 规则不匹配的内容
269</h4>
270
271Bash 规则匹配 Claude 编写的命令文本,在 Claude Code 分割[复合命令](#compound-commands)和剥离[包装器](#process-wrappers)之后。它不匹配以不同形式调用的同一程序,因此 deny 或 ask 规则涵盖 Claude 通常产生的调用,而不是围绕程序的安全边界。`deny` 或 `ask` 中的这些规则停止第一种形式,而不是其他形式:
272
273| 规则 | 停止 | 不停止 |
274| :----------------- | :------------------------- | :-------------------------------------------------------------------------------------------------- |
275| `Bash(curl *)` | `curl https://example.com` | `/usr/bin/curl https://example.com`、`sh -c 'curl https://example.com'` |
276| `Bash(rm *)` | `rm -rf build/` | `/bin/rm -rf build/`、`bash -c 'rm -rf build/'` |
277| `Bash(git push *)` | `git push origin main` | `git -C . push origin main`、`git -c push.default=current push origin main`、`git 'push' origin main` |
278
279您的其他规则和权限模式决定最后一列中的命令。
280
281对于不依赖于命令文本的文件系统和网络强制执行,使用[沙箱](/docs/zh-CN/sandboxing)。要在运行前使用您自己的逻辑检查完整的命令文本,使用[PreToolUse hook](#extend-permissions-with-hooks)。
215 282
216<h4 id="read-only-commands">283<h4 id="read-only-commands">
217 只读命令284 只读命令
218</h4>285</h4>
219 286
220Claude Code 将一组内置 Bash 命令识别为只读,并在每种模式下无需权限提示即可运行它们。这些包括 `ls`、`cat`、`echo`、`pwd`、`head`、`tail`、`grep`、`find`、`wc`、`which`、`diff`、`stat`、`du`、`cd` 和 `git` 的只读形式。该集合不可配置;要对其中一个命令要求提示,请为其添加 `ask` 或 `deny` 规则。287Claude Code 将一组内置 Bash 命令识别为只读,并在每种模式下无需权限提示即可运行它们,除了由 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-CN/settings-reference#permissions-blockreadsoutsideworkingdirectories) 限制的路径。该集合包括 `ls`、`cat`、`echo`、`pwd`、`head`、`tail`、`grep`、`find`、`wc`、`which`、`diff`、`stat`、`du`、`cd` 和 `git` 的只读形式。该集合不可配置;要对其中一个命令要求提示,请为其添加 `ask` 或 `deny` 规则。
288
289像 `ls > out.txt` 这样的重定向会在目标上添加检查。请参阅[重定向](#redirections)。
221 290
222对于每个标志都是只读的命令,允许未引用的 glob 模式,因此 `ls *.ts` 和 `wc -l src/*.py` 无需提示即可运行。带有写入能力或执行能力标志的命令,如 `find`、`sort`、`sed` 和 `git`,在存在未引用的 glob 时仍然提示,因为 glob 可能扩展为像 `-delete` 这样的标志。291对于其每个标志都是只读的命令,允许未引用的 glob 模式,因此 `ls *.ts` 和 `wc -l src/*.py` 无需提示即可运行。
223 292
224`cd` 进入工作目录或[其他目录](#working-directories)内的路径也是只读的。像 `cd packages/api && ls` 这样的复合命令在每个部分都符合条件时无需提示即可运行。在一个复合命令中组合 `cd` 和 `git` 时,当 `cd` 改变到不同目录时会提示,因为在新目录中运行 `git` 可以执行该目录的钩子。`cd` 的目标解析到当前工作目录是无操作的,不会触发此提示。293在 Manual 模式下,来自此集合的命令在这些情况下仍然提示:
225 294
226在一个复合命令中组合 `cd` 和输出重定向时,当 Claude Code 无法确定在 `cd` 运行后重定向目标解析到哪个目录时也会提示。仅重定向目标为 `/dev/null` 的命令,如 `cd app; grep -r pattern . 2>/dev/null`,不会触发此提示,因为 `/dev/null` 不依赖于工作目录。在 v2.1.207 之前,包含 `cd` 的复合命令会对任何输出重定向提示,包括仅重定向目标为 `/dev/null` 的重定向。295* **具有写入能力标志的命令的未引用 glob**:具有写入能力或执行能力标志的命令,如 `find`、`sort`、`sed` 和 `git`,在存在未引用的 glob 时提示,因为 glob 可能扩展为像 `-delete` 这样的标志。
296* **`docker` 指向另一个守护程序**:当命令携带选择不同守护程序的标志时,`docker` 的只读形式提示,如 `-H`、`--context` 或 Podman 的 `--url` 和 `--connection`。
297* **`file` 带有路径打开标志**:当 `file` 传递 `-m`/`--magic-file` 或 `-f`/`--files-from` 时,`file` 提示,因为这些标志使 `file` 打开标志值中命名的路径。
298* **Windows 上的网络路径**:其参数包括网络 (UNC) 路径的命令,如 `\\server\share\file`,提示是因为访问网络路径可能会将您的 Windows 凭据发送到它命名的主机。同样的检查适用于[PowerShell 工具](/docs/zh-CN/tools-reference#powershell-tool)命令。
299* **分析无法解析的命令**:当 Claude Code 无法完全解析命令时,它会要求批准而不是将命令视为只读。超过 10,000 个字符的命令总是提示,因为它们超过了分析解析的内容。
300
301进入工作目录内或[其他目录](#working-directories)内的路径的 `cd` 也是只读的,像 `cd packages/api && ls` 这样的复合命令在每个部分都符合条件时无需提示即可运行。即使每个部分都是只读的,这些组合也会提示:
302
303* **`cd` 与 `git`**:当 `cd` 改变到不同目录时提示,因为在新目录中运行 `git` 可以执行该目录的钩子。`cd` 的目标解析到当前工作目录是无操作的,不会触发提示。
304* **`cd` 与重定向**:当 Claude Code 无法确定在 `cd` 运行后重定向目标解析到哪个目录时提示。仅重定向目标为 `/dev/null` 的命令,如 `cd app; grep -r pattern . 2>/dev/null`,不提示,因为 `/dev/null` 不依赖于工作目录。
227 305
228<Warning>306<Warning>
229 尝试约束命令参数的 Bash 权限模式很脆弱。例如,`Bash(curl http://github.com/ *)` 旨在将 curl 限制为 GitHub URL,但不会匹配以下变体:307 尝试约束命令参数的 Bash 权限模式很脆弱。例如,`Bash(curl http://github.com/ *)` 旨在将 curl 限制为 GitHub URL,但不会匹配以下变体:
230 308
231 * URL 前的选项:`curl -X GET http://github.com/...`309 * URL 前的选项:`curl -X GET http://github.com/...`
232 * 不同的协议:`curl https://github.com/...`310 * 不同的协议:`curl https://github.com/...`
233 * 重定向:`curl -L http://bit.ly/xyz`,重定向到 GitHub311 * 重定向:`curl -L http://short.example.com/xyz`,重定向到 GitHub
234 * 变量:`URL=http://github.com && curl $URL`312 * 变量:`URL=http://github.com && curl $URL`
235 * 额外空格:`curl http://github.com`
236 313
237 为了更可靠的 URL 过滤,请考虑:314 为了更可靠的 URL 过滤,请考虑:
238 315
239 * **限制 Bash 网络工具**:使用 deny 规则阻止 `curl`、`wget` 和类似命令,然后对允许的域使用带有 `WebFetch(domain:github.com)` 权限的 WebFetch 工具316 * **限制 Bash 网络工具**:使用 deny 规则阻止 `curl`、`wget` 和类似命令,然后对允许的域使用带有 `WebFetch(domain:github.com)` 权限的 WebFetch 工具。Deny 规则不匹配按路径调用的同一程序或在 `sh -c` 内部调用的程序,因此当限制必须成立时,将其与[沙箱网络允许列表](/docs/zh-CN/sandboxing#network-isolation)配对;请参阅[Bash 规则不匹配的内容](#bash-rule-limits)
240 * **使用 PreToolUse hooks**:实现一个 hook 来验证 Bash 命令中的 URL 并阻止不允许的域317 * **使用 PreToolUse hooks**:实现一个 hook 来验证 Bash 命令中的 URL 并阻止不允许的域
241 * **添加 CLAUDE.md 指导**:在 `CLAUDE.md` 中描述您允许的 curl 模式。这会影响 Claude 尝试的内容,但不会强制执行边界,因此请将其与上述选项之一配对318 * **添加 CLAUDE.md 指导**:在 `CLAUDE.md` 中描述您允许的 curl 模式。这会影响 Claude 尝试的内容,但不会强制执行边界,因此请将其与上述选项之一配对
242 319
243 请注意,仅使用 WebFetch 不会阻止网络访问。如果允许 Bash,Claude 仍然可以使用 `curl`、`wget` 或其他工具来访问任何 URL。320 请注意,仅使用 WebFetch 不会阻止网络访问。如果允许 Bash,Claude 仍然可以使用 `curl`、`wget` 或其他工具来访问任何 URL。
244</Warning>321</Warning>
245 322
323<h4 id="redirections">
324 重定向
325</h4>
326
327当命令重定向输出或输入时,Claude Code 会根据您的文件规则检查重定向目标,就像 Claude 直接写入或读取该文件一样:
328
329* **输出重定向**:对于 `> file`、`>> file` 或 `2> file`,检查涵盖您的 `Edit` allow 和 deny 规则、[受保护的路径](/docs/zh-CN/permission-modes#protected-paths)和[工作目录](#working-directories)。像 `Bash(git commit *)` 这样的规则允许命令,而不是目标。以 `~` 开头或包含 glob 字符的目标需要您的批准。
330* **输入重定向**:对于 `< file`,检查涵盖您的 `Read` allow 和 deny 规则和工作目录。工作目录外的目标需要您的批准,除非 allow 规则涵盖它。包含 glob 模式的目标,或在同一命令中跟随 `cd` 的相对路径,即使 allow 规则涵盖它也需要您的批准。Claude Code 在 v2.1.257 及更高版本中检查输入目标。
331
332没有文件在其后的目标不被检查:`/dev/null`、文件描述符形式如 `2>&1` 和 `<&3`,以及 here-docs 和 here-strings。
333
246<h3 id="powershell">334<h3 id="powershell">
247 PowerShell335 PowerShell
248</h3>336</h3>
271 Read 和 Edit359 Read 和 Edit
272</h3>360</h3>
273 361
362要阻止 Claude 的文件工具读取文件或目录,请为其路径添加 `Read` deny 规则,如 `Read(./.env)` 或 `Read(./secrets/**)`;[排除敏感文件](/docs/zh-CN/settings-reference#exclude-sensitive-files)有一个粘贴就用的示例。
363
274`Edit` 规则适用于所有编辑文件的内置工具。Claude 尽力将 `Read` 规则应用于所有读取文件的内置工具,如 Grep 和 Glob,以及您提示中的 `@file` 提及,以及连接的 [IDE](/docs/zh-CN/vs-code#the-built-in-ide-mcp-server) 与 Claude 共享的选择和打开文件上下文。364`Edit` 规则适用于所有编辑文件的内置工具。Claude 尽力将 `Read` 规则应用于所有读取文件的内置工具,如 Grep 和 Glob,以及您提示中的 `@file` 提及,以及连接的 [IDE](/docs/zh-CN/vs-code#the-built-in-ide-mcp-server) 与 Claude 共享的选择和打开文件上下文。
275 365
276`Read` deny 规则也会阻止[同一路径上的 Edit 工具](/docs/zh-CN/errors#file-is-covered-by-a-read-deny-rule),包括在那里创建新文件。Write 和 NotebookEdit 不被覆盖,因此为任何工具都不能更改的路径添加 `Edit` deny 规则。需要 Claude Code v2.1.208 或更高版本。366`Read` deny 规则也会阻止同一路径上的 [Edit 和 Write 工具](/docs/zh-CN/errors#file-is-covered-by-a-read-deny-rule),包括在那里创建新文件。NotebookEdit 不被覆盖,因此为任何工具都不能更改的路径添加 `Edit` deny 规则。检查需要 Claude Code v2.1.208 或更高版本进行编辑,以及 v2.1.228 或更高版本进行写入。
367
368Claude Code 仅根据 `Edit(path)` 和 `Read(path)` 规则检查文件权限。如果您为 `Write`、`NotebookEdit`、`Glob` 或旧版 `MultiEdit` 工具编写路径规则,Claude Code 接受该规则但从不查询它,并在启动时[警告](/docs/zh-CN/errors#is-not-matched-by-file-permission-checks),除了在 `--allowedTools` 中传递的 `Glob` 规则。使用 `Edit(docs/**)` 代替 `Write(docs/**)`、`NotebookEdit(docs/**)` 或 `MultiEdit(docs/**)`,以及 `Read(docs/**)` 代替 `Glob(docs/**)`。Claude Code 不会警告没有路径的工具名称规则,如 `Write` 的 deny 规则;它在任何地方在工具级别匹配该规则。需要 Claude Code v2.1.210 或更高版本。
277 369
278<Warning>370<Warning>
279 Read 和 Edit deny 规则适用于 Claude 的内置文件工具和 Claude Code 在 Bash 中识别的文件命令,如 `cat`、`head`、`tail` 和 `sed`。它们不适用于间接读取或写入文件的任意子进程,如打开文件本身的 Python 或 Node 脚本。为了获得阻止所有进程访问路径的 OS 级别强制执行,请[启用沙箱](/docs/zh-CN/sandboxing)。371 Read 和 Edit deny 规则适用于 Claude 的内置文件工具、Claude Code 在 Bash 中识别的文件命令(如 `cat`、`head`、`tail` 和 `sed`)以及 Bash [重定向](#redirections)的目标(如 `> file` 和 `< file`)。它们不适用于读取文件而不命名它们的命令,如从保存文件的目录运行的 `grep -r pattern .`,或间接读取或写入文件的任意子进程,如打开文件本身的 Python 或 Node 脚本。对于阻止所有进程访问路径的 OS 级别强制执行,请[启用沙箱](/docs/zh-CN/sandboxing)。
280</Warning>372</Warning>
281 373
282Read 和 Edit 规则都遵循 [gitignore](https://git-scm.com/docs/gitignore) 规范,具有四种不同的模式类型:374Read 和 Edit 规则都使用[gitignore](https://git-scm.com/docs/gitignore)模式语法,具有四种不同的模式类型;对于单段目录模式,匹配深度也取决于规则类型,本节后面描述:
283 375
284| 模式 | 含义 | 示例 | 匹配 |376| 模式 | 含义 | 示例 | 匹配 |
285| ----------------- | -------------- | -------------------------------- | ----------------------------------- |377| ----------------- | -------------- | -------------------------------- | ------------------------------------------------ |
286| `//path` | 来自文件系统根目录的绝对路径 | `Read(//Users/alice/secrets/**)` | `/Users/alice/secrets/**` |378| `//path` | 来自文件系统根目录的绝对路径 | `Read(//Users/alice/secrets/**)` | `/Users/alice/secrets/**` |
287| `~/path` | 来自主目录的路径 | `Read(~/Documents/*.pdf)` | `/Users/alice/Documents/*.pdf` |379| `~/path` | 来自主目录的路径 | `Read(~/Documents/*.pdf)` | `/Users/alice/Documents/*.pdf` |
288| `/path` | 相对于设置源的路径 | `Edit(/src/**/*.ts)` | `<project root>/src/**/*.ts` 在项目设置中 |380| `/path` | 相对于设置源的路径 | `Edit(/src/**/*.ts)` | 项目设置中的 `<primary working directory>/src/**/*.ts` |
289| `path` 或 `./path` | 相对于当前目录的路径 | `Read(*.env)` | `<cwd>/*.env` |381| `path` 或 `./path` | 相对于当前目录的路径 | `Read(*.env)` | `<cwd>/*.env` |
290 382
291<Warning>383<Warning>
292 像 `/Users/alice/file` 这样的模式不是绝对路径。单个前导斜杠锚定在设置源,而不是文件系统根目录。对于绝对路径,使用 `//Users/alice/file`。384 像 `/Users/alice/file` 这样的模式不是绝对路径。单个前导斜杠锚定在设置源,而不是文件系统根目录。对于绝对路径,使用 `//Users/alice/file`。
293</Warning>385</Warning>
294 386
295`/path` 模式锚定在与定义它的设置文件关联的目录,因此相同的规则根据您放置它的位置匹配不同的位置:387`/path` 模式锚定在与定义它的设置源关联的目录,因此相同的规则根据您放置它的位置匹配不同的位置:
296 388
297| 规则定义在 | `/path` 解析为 |389| 规则定义在 | `/path` 解析为 |
298| :-------------------------------- | :------------------------- |390| :----------------------------------- | :--------------------------------- |
299| 项目或本地设置,如 `.claude/settings.json` | `<project root>/path` |391| `.claude/settings.json` 处的项目设置 | `<primary working directory>/path` |
300| 用户设置在 `~/.claude/settings.json` | `~/.claude/path` |392| `.claude/settings.local.json` 处的本地设置 | `<primary working directory>/path` |
393| `~/.claude/settings.json` 处的用户设置 | `~/.claude/path` |
301| 使用 `--settings <file>` 传递的文件 | `<directory of file>/path` |394| 使用 `--settings <file>` 传递的文件 | `<directory of file>/path` |
302| CLI 标志、`/permissions` 或会话规则 | `<original cwd>/path` |395| CLI 标志或会话规则 | `<primary working directory>/path` |
396
397您通过 `/permissions` 添加的规则遵循您保存它的设置文件的行。
398
399本地设置规则锚定在会话的[主工作目录](#working-directories),而不是 Claude Code 在 v2.1.211 及更高版本中[存储文件](#permission-system)的存储库根目录。在从存储库根目录启动的会话中,两个目录相同;在[worktree](/docs/zh-CN/worktrees)会话中,像 `Edit(/src/**)` 这样的共享规则匹配该 worktree 自己的 `src/` 目录。
303 400
304像 `Read(/secrets/**)` 这样的 deny 规则在用户设置中阻止 `~/.claude/secrets/**`,而不是您项目中的 `secrets` 目录。要在用户设置中编写适用于每个项目内部的规则,请改用 `//` 绝对路径或 `~/` 主目录相对路径。401像 `Read(/secrets/**)` 这样的 deny 规则在用户设置中阻止 `~/.claude/secrets/**`,而不是您项目中的 `secrets` 目录。要在用户设置中编写适用于每个项目内部的规则,请改用 `//` 绝对路径或 `~/` 主目录相对路径。
305 402
307 404
308示例:405示例:
309 406
310* `Edit(/docs/**)`:编辑 `<project>/docs/` 中的文件(不是 `/docs/` 也不是 `<project>/.claude/docs/`)407* `Edit(/docs/**)`:编辑 `<primary working directory>/docs/` 中的文件,而不是 `/docs/` 或 `<primary working directory>/.claude/docs/`
311* `Read(~/.zshrc)`:读取您主目录的 `.zshrc`408* `Read(~/.zshrc)`:读取您主目录的 `.zshrc`
312* `Edit(//tmp/scratch.txt)`:编辑绝对路径 `/tmp/scratch.txt`409* `Edit(//tmp/scratch.txt)`:编辑绝对路径 `/tmp/scratch.txt`
313* `Read(src/**)`:从 `<current-directory>/src/` 读取410* `Read(src/**)`:作为 allow 规则,仅从 `<current-directory>/src/` 读取;作为 deny 或 ask 规则,匹配当前目录下任何深度的 `src` 目录
314 411
315一个规则只匹配其锚点下的文件,因此锚点决定了 deny 规则的范围。裸文件名遵循 gitignore 语义并在任何深度匹配,因此 `Read(.env)` 和 `Read(**/.env)` 是等价的:412一个规则只匹配其锚点下的文件;在该范围内,匹配深度取决于模式形状,以及对于单段目录模式,规则类型,下面描述。裸文件名遵循 gitignore 语义并在任何深度匹配,因此 `Read(.env)` 和 `Read(**/.env)` 是等价的:
316 413
317| Deny 规则 | 阻止 | 不阻止 |414| Deny 规则 | 阻止 | 不阻止 |
318| ------------------------------ | ------------------- | ------------------ |415| ------------------------------ | ------------------- | ------------------ |
319| `Read(.env)` 或 `Read(**/.env)` | 当前目录或其下的任何 `.env` | 父目录或另一个项目中的 `.env` |416| `Read(.env)` 或 `Read(**/.env)` | 当前目录或其下的任何 `.env` | 父目录或另一个项目中的 `.env` |
320| `Read(//**/.env)` | 文件系统上任何地方的任何 `.env` | 无;规则锚定在文件系统根目录 |417| `Read(//**/.env)` | 文件系统上任何地方的任何 `.env` | 无;规则锚定在文件系统根目录 |
321 418
419具有单个目录段的相对模式,如 `src/**`,根据规则类型在不同深度匹配:
420
421* **Allow 规则**:`Edit(src/**)` 仅匹配 `<cwd>/src` 及其下的文件。要允许任何深度的目录名,请编写 `Edit(**/src/**)`。
422* **Deny 和 ask 规则**:`Read(secrets/**)` 匹配当前目录下任何深度的名为 `secrets` 的目录,因此规则也适用于嵌套副本。
423
424每个其他模式形状在每种规则类型中的相同深度匹配:`Edit(/src/**)` 和 `Edit(src/components/**)` 仅在其锚定位置匹配,而 `Edit(**/src/**)` 在任何深度匹配。
425
426以下示例显示了具有顶级 `src/` 目录和 `vendor/` 下嵌套副本的项目中的每个模式形状:
427
428```text theme={null}
429<current-directory>/
430├── src/
431│ └── app.ts
432└── vendor/
433 └── pkg/
434 └── src/
435 └── lib.js
436```
437
438| 规则 | 匹配 `src/app.ts` | 匹配 `vendor/pkg/src/lib.js` |
439| :------------------------------ | :-------------- | :------------------------- |
440| `Edit(src/**)` 作为 allow 规则 | 是 | 否 |
441| `Edit(src/**)` 作为 deny 或 ask 规则 | 是 | 是 |
442| `Edit(/src/**)` 在任何规则类型中 | 是 | 否 |
443| `Edit(**/src/**)` 在任何规则类型中 | 是 | 是 |
444
322<Note>445<Note>
323 在 gitignore 模式中,`*` 匹配单个路径段内的文本,可以出现在模式中的任何位置,而 `**` 匹配跨目录。要允许所有文件访问,只需使用工具名称而不带括号:`Read`、`Edit` 或 `Write`。446 在 gitignore 模式中,`*` 匹配单个路径段内的文本,可以出现在模式中的任何位置,而 `**` 匹配跨目录。
324</Note>447</Note>
325 448
326当您使用"是,不再询问"批准文件路径时,Claude Code 会转义该路径中的 gitignore 模式字符,如 `[`、`]` 和 `*`,因此生成的规则仅匹配您批准的字面路径。您自己编写的规则不会被转义。在 v2.1.202 之前,Claude Code 保存未转义的路径,因此为名为 `[2024-06] Reports` 的目录生成的规则可能无法匹配其自己的路径或匹配意外的兄弟目录。449当您使用"是,不再询问"批准文件路径时,Claude Code 会转义该路径中的 gitignore 模式字符,如 `[`、`]` 和 `*`,因此生成的规则仅匹配您批准的字面路径。您自己编写的规则不会被转义。在 v2.1.202 之前,Claude Code 保存未转义的路径,因此为名为 `[2024-06] Reports` 的目录生成的规则可能无法匹配其自己的路径或匹配意外的兄弟目录。
327 450
451您不需要转义路径中的括号,因此 `Edit(./Finance (2024)/**)` 匹配按拼写的 `Finance (2024)` 文件夹。
452
453其路径不可用作 gitignore 模式的 deny 或 ask 规则仍然保护该确切路径。其模式不可用的 allow 规则不批准任何内容。
454
328当 Claude 访问符号链接时,权限规则检查两个路径:符号链接本身和它解析到的文件。Allow 和 deny 规则对该对的处理方式不同:allow 规则回退到提示您,而 deny 规则直接阻止。455当 Claude 访问符号链接时,权限规则检查两个路径:符号链接本身和它解析到的文件。Allow 和 deny 规则对该对的处理方式不同:allow 规则回退到提示您,而 deny 规则直接阻止。
329 456
330* **Allow 规则**:仅在符号链接路径及其目标都匹配时适用。允许目录内的符号链接指向其外部仍然会提示您。457* **Allow 规则**:仅在符号链接路径及其目标都匹配时适用。允许目录内的符号链接指向其外部仍然会提示您。
332 459
333例如,使用 `Read(./project/**)` 允许和 `Read(~/.ssh/**)` 拒绝,`./project/key` 处的符号链接指向 `~/.ssh/id_rsa` 被阻止:目标未通过 allow 规则,并匹配 deny 规则。460例如,使用 `Read(./project/**)` 允许和 `Read(~/.ssh/**)` 拒绝,`./project/key` 处的符号链接指向 `~/.ssh/id_rsa` 被阻止:目标未通过 allow 规则,并匹配 deny 规则。
334 461
462当工具打开已批准的文件时,Claude Code [确认路径仍然解析到权限检查批准的位置](/docs/zh-CN/errors#refusing-after-a-symlink-changed)。
463
464Grep 和 Glob 搜索 `path` 参数解析到的目录。Claude Code 将 `Read` deny 规则应用于该目录。
465
335<h3 id="webfetch">466<h3 id="webfetch">
336 WebFetch467 WebFetch
337</h3>468</h3>
340 471
341* `WebFetch(domain:example.com)` 匹配对 `example.com` 的请求472* `WebFetch(domain:example.com)` 匹配对 `example.com` 的请求
342* `WebFetch(domain:*.example.com)` 匹配任何深度的任何子域,如 `api.example.com` 或 `a.b.example.com`,但不匹配 `example.com` 本身473* `WebFetch(domain:*.example.com)` 匹配任何深度的任何子域,如 `api.example.com` 或 `a.b.example.com`,但不匹配 `example.com` 本身
343* `WebFetch(domain:*)` 匹配每个域,等同于裸 `WebFetch` 规则474* `WebFetch(domain:*)` 匹配每个域。它与裸 `WebFetch` 规则不同;请参阅[允许或拒绝每次获取](#allow-or-deny-every-fetch)
344 475
345在前导 `*.` 或裸 `*` 以外的任何位置,通配符仅匹配两个点之间的文本。`WebFetch(domain:example.*)` 匹配 `example.org`,其中 `*` 变成 `org`,但不匹配 `example.evil.com`,其中 `*` 必须变成 `evil.com` 并跨越一个点。这防止尾部通配符匹配攻击者可以注册的域。476在前导 `*.` 或裸 `*` 以外的任何位置,通配符仅匹配两个点之间的文本。`WebFetch(domain:example.*)` 匹配 `example.org`,其中 `*` 变成 `org`,但不匹配 `example.evil.com`,其中 `*` 必须变成 `evil.com` 并跨越一个点。这防止尾部通配符匹配攻击者可以注册的域。
346 477
478WebFetch 规则中的通配符需要 Claude Code v2.1.172 或更高版本来匹配获取。
479
480<h4 id="allow-or-deny-every-fetch">
481 允许或拒绝每次获取
482</h4>
483
484裸 `WebFetch` 规则是没有 `domain:` 部分的工具名称,如 `"deny": ["WebFetch"]`。它和 `WebFetch(domain:*)` 都涵盖每个 URL,但 Claude Code 以不同方式应用它们,只有 `domain:` 形式也将其域添加到沙箱的[允许或拒绝的域列表](/docs/zh-CN/sandboxing#network-isolation)。该部分列出沙箱支持的通配符形式和添加裸 `*` 的版本。
485
486每行显示规则在 `allow` 列表中和 `deny` 列表中的作用:
487
488| 规则 | 在 `allow` 中 | 在 `deny` 中 |
489| :------------------- | :------------------------------- | :------------------------------------------------------------ |
490| `WebFetch` | Claude 无需提示您即可获取。不改变沙箱命令可以到达的主机。 | Claude Code 移除 `WebFetch` 工具,因此 Claude 根本无法获取。不改变沙箱命令可以到达的主机。 |
491| `WebFetch(domain:*)` | Claude 无需提示您即可获取,沙箱命令可以到达任何主机。 | Claude Code 保留工具并拒绝每次获取,沙箱命令无法到达任何主机。 |
492
493要让 Claude 自由获取同时保持沙箱允许列表不变,请使用裸形式。此 `settings.json` 这样做:
494
495```json theme={null}
496{
497 "permissions": {
498 "allow": ["WebFetch"]
499 }
500}
501```
502
503当您要求 Claude 获取页面时,它无需提示即可获取。当您要求它对沙箱允许列表外的主机运行[沙箱](/docs/zh-CN/sandboxing) `curl` 时,Claude Code 仍然会提示您该主机,或在[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)中将请求发送到分类器,因为裸规则没有将主机添加到允许列表。
504
347<h3 id="mcp">505<h3 id="mcp">
348 MCP506 MCP
349</h3>507</h3>
354* `mcp__puppeteer__*` 使用通配符语法,也匹配来自 `puppeteer` 服务器的所有工具512* `mcp__puppeteer__*` 使用通配符语法,也匹配来自 `puppeteer` 服务器的所有工具
355* `mcp__puppeteer__puppeteer_navigate` 匹配由 `puppeteer` 服务器提供的 `puppeteer_navigate` 工具513* `mcp__puppeteer__puppeteer_navigate` 匹配由 `puppeteer` 服务器提供的 `puppeteer_navigate` 工具
356 514
357如果您的组织已设置[claude.ai 连接器](/docs/zh-CN/mcp#organization-controls-on-connector-tools)工具为 `ask`,该工具的 allow 规则不会生效:Claude Code 在每次调用时都会提示,即使在 `auto` 和 `bypassPermissions` 模式下。在 `dontAsk` 模式下(从不提示),Claude Code 会拒绝调用。连接器工具显示为 `mcp__claude_ai_<server>__<tool>`。515如果您的组织已设置[claude.ai 连接器](/docs/zh-CN/mcp#organization-controls-on-connector-tools)工具为 `ask`,该设置在您的会话中到达 Claude Code,该工具的 allow 规则不会生效:Claude Code 在每次调用时都会提示,即使在 `auto` 和 `bypassPermissions` 模式下。在 `dontAsk` 模式下(从不提示),Claude Code 会拒绝调用。Claude Code 自己获取的连接器工具显示为 `mcp__claude_ai_<server>__<tool>`。
516
517在 Claude Desktop 应用中的 [Cowork](https://claude.com/docs/cowork/overview) 会话中,Claude 通过 Cowork 的 `mcp__workspace__bash` 工具而不是内置 `Bash` 工具运行 shell 命令,Cowork 同样为 web 获取提供 `mcp__workspace__web_fetch`。Claude Code 也将命名整个 `Bash` 或 `WebFetch` 工具的 deny 规则应用于这些 Cowork 工具,因此托管的 `Bash` deny 规则阻止 Claude 在 Cowork 中运行 shell 命令。当 Claude Code 阻止此类调用时,消息命名 Cowork 工具:`Permission to use mcp__workspace__bash has been denied.` Allow 规则不会转移:Claude Code 从不将 `Bash` allow 规则应用于 `mcp__workspace__bash`。
358 518
359<h3 id="agent-subagents">519<h3 id="agent-subagents">
360 Agent(subagents)520 Agent(subagents)
398 使用 hooks 扩展权限558 使用 hooks 扩展权限
399</h2>559</h2>
400 560
401[Claude Code hooks](/docs/zh-CN/hooks-guide) 提供了一种方法来注册自定义 shell 命令以在运行时执行权限评估。当 Claude Code 进行工具调用时,PreToolUse hooks 在权限提示之前运行。hook 输出可以拒绝工具调用、强制提示或跳过提示以让调用继续。561[Claude Code hooks](/docs/zh-CN/hooks-guide) 让您可以注册自定义 shell 命令,在运行时评估权限。当 Claude Code 进行工具调用时,PreToolUse hooks 在权限提示之前运行,适用于除了 [`EndConversation`](/docs/zh-CN/tools-reference#endconversation-tool-behavior) 之外的每个工具。hook 输出可以拒绝工具调用、强制提示或跳过提示以让调用继续。
402 562
403Hook 决定不会绕过权限规则。Claude Code 评估 deny 和 ask 规则,无论 PreToolUse hook 返回什么:匹配的 deny 规则会阻止调用,匹配的 ask 规则即使在 hook 返回 `"allow"` 或 `"ask"` 时仍然会提示。这保留了[管理权限](#manage-permissions)中描述的 deny 优先级,包括在托管设置中设置的 deny 规则。563Hook 决定不会绕过权限规则。Claude Code 评估 deny 和 ask 规则,无论 PreToolUse hook 返回什么:匹配的 deny 规则会阻止调用,匹配的 ask 规则即使在 hook 返回 `"allow"` 或 `"ask"` 时仍然会提示。这保留了[管理权限](#manage-permissions)中描述的 deny 优先级,包括在托管设置中设置的 deny 规则。
404 564
405连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)和标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具在 hook 返回 `"allow"` 时仍然会提示。565标记为 [`requiresUserInteraction`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具在 hook 返回 `"allow"` 时仍然会提示,连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的工具在该设置到达 Claude Code 的会话中也是如此。
406 566
407阻止 hook 也优先于 allow 规则。以退出代码 2 退出的 hook 在权限规则被评估之前停止工具调用,因此即使 allow 规则会让调用继续,阻止也适用。要运行所有 Bash 命令而无需提示,除了您想要阻止的少数几个,将 `"Bash"` 添加到您的 allow 列表,并注册一个 PreToolUse hook 来拒绝那些特定命令。请参见[阻止对受保护文件的编辑](/docs/zh-CN/hooks-guide#block-edits-to-protected-files)以获取您可以调整的 hook 脚本。567阻止 hook 也优先于 allow 规则。以退出代码 2 退出的 hook 在权限规则被评估之前停止工具调用,因此即使 allow 规则会让调用继续,阻止也适用。要运行所有 Bash 命令而无需提示,除了您想要阻止的少数几个,将 `"Bash"` 添加到您的 allow 列表,并注册一个 PreToolUse hook 来拒绝那些特定命令。请参见[阻止对受保护文件的编辑](/docs/zh-CN/hooks-guide#block-edits-to-protected-files)以获取您可以调整的 hook 脚本。
408 568
410 工作目录570 工作目录
411</h2>571</h2>
412 572
413默认情况下,Claude 可以访问启动它的目录中的文件。您可以扩展此访问:573默认情况下,Claude 可以访问启动它的目录中的文件。该目录是会话的主工作目录,直到您[使用 `/cd` 移动会话](#move-the-session-to-another-directory)。您可以扩展此访问:
414 574
415* **启动期间**:使用 `--add-dir <path>` CLI 参数575* **启动期间**:使用 `--add-dir <path>` CLI 参数
416* **会话期间**:使用 `/add-dir` 命令576* **会话期间**:使用 `/add-dir` 命令
417* **持久配置**:添加到[设置文件](/docs/zh-CN/settings#settings-files)中的 `additionalDirectories`577* **持久配置**:添加到[设置文件](/docs/zh-CN/settings#where-settings-live)中的 `additionalDirectories`
418 578
419其他目录中的文件遵循与原始工作目录相同的权限规则:它们变为可读的而无需提示,文件编辑权限遵循当前权限模式。579其他目录中的文件遵循与原始工作目录相同的权限规则:它们变为可读的而无需提示,文件编辑权限遵循当前权限模式。
420 580
421在 macOS 上的后台会话中,会话主机会单独从您的终端请求访问受保护的文件夹(如 `~/Desktop`、`~/Documents` 和 `~/Downloads`),当 Claude 需要在那里读取或写入文件时;如果读取失败并显示 `Operation not permitted`,请参阅[如何向后台会话授予文件夹访问权限](/docs/zh-CN/agent-view#background-sessions-can't-read-desktop-documents-or-downloads-on-macos)。581您无法添加大多数[网络路径](/docs/zh-CN/errors#working-directory-is-a-network-path)(例如 UNC 共享 `\\server\share`)作为工作目录,因为查找它们可能会联系它们命名的主机。在 Windows 上,将共享映射到驱动器号,然后在启动时使用 `--add-dir` 传递该驱动器。
582
583设置 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/zh-CN/settings-reference#permissions-blockreadsoutsideworkingdirectories) 以使文件工具在每种权限模式下都拒绝它围栏的路径。在自动模式下,Claude Code 会在 Claude 首次[读取工作目录外的文件](/docs/zh-CN/permission-modes#first-read-outside-the-working-directories)时提供打开它。
584
585在 macOS 上的后台会话中,会话主机会单独从您的终端请求访问受保护的文件夹(如 `~/Desktop`、`~/Documents` 和 `~/Downloads`),当 Claude 需要在那里读取或写入文件时;如果读取失败并显示 `Operation not permitted`,请参阅[如何向后台会话授予文件夹访问权限](/docs/zh-CN/agent-view#background-sessions-can%E2%80%99t-read-desktop-documents-or-downloads-on-macos)。
586
587<h3 id="move-the-session-to-another-directory">
588 将会话移动到另一个目录
589</h3>
422 590
423要改变会话的主工作目录而不是添加另一个目录,请使用 [`/cd`](/docs/zh-CN/commands)。`/cd` 命令需要 Claude Code v2.1.169 或更高版本。与 `/add-dir` 不同,它重新定位会话:新目录的 `CLAUDE.md` 被加载,`--resume` 从那里找到会话。591要将会话移动到不同的主工作目录,而不是[在当前目录旁添加目录](#working-directories),请运行 `/cd <path>`。Claude Code 保持对话,加载新目录的 `CLAUDE.md`,如果您之前未在其中工作过,会提示您[信任工作区](#project-allow-rules-and-workspace-trust)。之后,当您从新目录运行 `--resume` 时,Claude Code [找到移动的会话](/docs/zh-CN/sessions#resume-a-session)。
592
593移动后,Claude Code 立即应用新目录的项目配置:
594
595* 其项目设置,包括其权限规则和 [hooks](/docs/zh-CN/hooks)
596* 其 [`.mcp.json` 服务器](/docs/zh-CN/mcp#project-scope),受与启动时相同的[服务器批准](/docs/zh-CN/mcp#project-server-approvals-and-workspace-trust)约束,以及您在其中注册的[本地范围](/docs/zh-CN/mcp#local-scope) MCP 服务器
597* 其设置启用的 [plugins](/docs/zh-CN/plugins)、其 [skills](/docs/zh-CN/skills#discovery-from-parent-and-nested-directories) 和其 [subagents](/docs/zh-CN/sub-agents)
598* 其 [`env`](/docs/zh-CN/settings-reference#env) 值,应用在前一个目录的设置中的环境变量之上,这些变量保持有效
599
600Claude Code 还断开前一个目录的项目和[本地范围](/docs/zh-CN/mcp#local-scope) MCP 服务器,以及移动后不再启用的 [plugins](/docs/zh-CN/mcp#plugin-provided-mcp-servers) 的服务器。它从新目录的设置而不是前一个目录的设置中获取[其他目录](#working-directories),并保留您使用 `--add-dir` 或 `/add-dir` 添加的目录。移动激活的 Hooks 仍然接收 [`${CLAUDE_PROJECT_DIR}`](/docs/zh-CN/hooks#reference-scripts-by-path) 设置为会话启动的项目根目录。
601
602当新目录尚未被信任时,Claude Code 在信任提示中列出目录的设置将激活的允许规则、其他目录、hooks 和辅助命令,以便您可以在接受前查看它们。如果您拒绝,会话保持在原位置。在 v2.1.246 之前,`/cd` 不会应用新目录的设置、hooks、MCP 服务器或 skills,直到您恢复会话,其信任提示也不会列出目录的设置将激活的内容。
603
604使用 [`Cd` 权限规则](#cd)限制或禁用 `/cd` 目标。
424 605
425<h3 id="additional-directories-grant-file-access-not-configuration">606<h3 id="additional-directories-grant-file-access-not-configuration">
426 其他目录授予文件访问权限,而不是配置607 其他目录授予文件访问权限,而不是配置
428 609
429添加目录扩展 Claude 可以读取和编辑文件的位置。它不会使该目录成为完整的配置根目录:大多数 `.claude/` 配置不是从其他目录发现的,尽管有几种类型作为例外被加载。610添加目录扩展 Claude 可以读取和编辑文件的位置。它不会使该目录成为完整的配置根目录:大多数 `.claude/` 配置不是从其他目录发现的,尽管有几种类型作为例外被加载。
430 611
431这些例外仅适用于使用 `--add-dir` 标志或 `/add-dir` 命令添加的目录。在设置文件中的 `permissions.additionalDirectories` 中列出的目录仅授予文件访问权限,不加载以下任何配置。612这些例外仅适用于使用 `--add-dir` 标志或 `/add-dir` 命令添加的目录,包括 Agent SDK 通过该标志添加的目录。在设置文件中的 `permissions.additionalDirectories` 中列出的目录仅授予文件访问权限,不加载以下任何配置。
613
614Agent SDK 在 TypeScript 中的 [`additionalDirectories`](/docs/zh-CN/agent-sdk/typescript#options) 选项和在 Python 中的 [`add_dirs`](/docs/zh-CN/agent-sdk/python#claudeagentoptions) 选项也接收这些例外,尽管 TypeScript 选项与设置键共享其名称。SDK 将每个条目作为 `--add-dir` 传递给 Claude Code,因此这些目录的行为类似于标志添加的目录。来自任何标志添加目录的 Skills、命令和 subagents 通过 `project` [setting source](/docs/zh-CN/agent-sdk/claude-code-features#control-filesystem-settings-with-settingsources) 加载,因此当您在 CLI 上使用 [`--setting-sources`](/docs/zh-CN/cli-reference) 或在 SDK 中使用 `settingSources` 排除该源时,它们不会加载,[bare mode](/docs/zh-CN/headless#start-faster-with-bare-mode) 跳过其中的命令和 subagents。
432 615
433以下配置类型从 `--add-dir` 目录加载:616以下配置类型从 `--add-dir` 目录加载:
434 617
435| 配置 | 从 `--add-dir` 加载 |618| 配置 | 从 `--add-dir` 加载 |
436| :------------------------------------------------------------------------------ | :---------------------------------------------------------------------------------------------- |619| :------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------------------- |
437| `.claude/skills/` 中的 [Skills](/docs/zh-CN/skills) | 是,带有实时重新加载 |620| `.claude/skills/` 中的 [Skills](/docs/zh-CN/skills) | 是,带有实时重新加载 |
438| `.claude/agents/` 中的 [Subagents](/docs/zh-CN/sub-agents) | 是 |621| `.claude/commands/` 中的[命令文件](/docs/zh-CN/skills#where-skills-live) | 是,不带实时重新加载。当添加的目录和您的项目都定义了同名命令时,Claude Code 运行您的项目的命令 |
439| `.claude/settings.json` 和 `.claude/settings.local.json` 中的[设置](/docs/zh-CN/settings) | 仅 `enabledPlugins` 和 `extraKnownMarketplaces` 键 |622| `.claude/agents/` 中的 [Subagents](/docs/zh-CN/sub-agents) | 是,不带实时重新加载 |
623| `.claude/settings.json` 和 `.claude/settings.local.json` 中的[设置](/docs/zh-CN/settings) | 仅 `enabledPlugins` 和 [`extraKnownMarketplaces`](/docs/zh-CN/settings-reference#extraknownmarketplaces) 键 |
440| [CLAUDE.md](/docs/zh-CN/memory) 文件、`.claude/rules/` 和 `CLAUDE.local.md` | 仅当设置 `CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1` 时。`CLAUDE.local.md` 另外需要 `local` 设置源,默认启用 |624| [CLAUDE.md](/docs/zh-CN/memory) 文件、`.claude/rules/` 和 `CLAUDE.local.md` | 仅当设置 `CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1` 时。`CLAUDE.local.md` 另外需要 `local` 设置源,默认启用 |
441 625
442命令和输出样式从当前工作目录及其父目录、您在 `~/.claude/` 的用户目录和托管设置中发现。Hooks 和其他 `settings.json` 键从当前工作目录的 `.claude/` 文件夹加载,没有父目录回退,同时从您的用户 `~/.claude/settings.json` 和托管设置加载。要在项目间共享该配置,请使用以下方法之一:626要在会话中期从[主工作目录](#working-directories)的子目录加载 skills、命令和 subagents,请使用该子目录的路径运行 `/add-dir`。Claude Code 为会话的其余部分加载它们,无需提示您或添加工作目录,因为子目录已经可读。这需要 Claude Code v2.1.257 或更高版本。
627
628Claude Code 从当前工作目录及其父目录、您在 `~/.claude/` 的用户目录和托管设置中发现输出样式。Hooks 和其他 `.claude/settings.json` 键从当前工作目录的 `.claude/` 文件夹加载,没有父目录回退,同时从您的用户 `~/.claude/settings.json` 和托管设置加载。`.claude/settings.local.json` 从 git 存储库根目录加载,即使您在子目录中启动 Claude Code,除了 Claude Code [不使用存储库根目录](/docs/zh-CN/settings#where-claude-code-looks-for-each-file)的情况,例如在 Windows 上;在 v2.1.211 之前,它也仅从当前工作目录加载。[Agent SDK](/docs/zh-CN/agent-sdk/claude-code-features#control-filesystem-settings-with-settingsources) 会话在所有版本中从工作目录加载它。
629
630要在项目间共享该配置,请使用以下方法之一:
443 631
444* **用户级配置**:将文件放在 `~/.claude/agents/`、`~/.claude/output-styles/` 或 `~/.claude/settings.json` 中,使其在每个项目中可用632* **用户级配置**:将文件放在 `~/.claude/agents/`、`~/.claude/output-styles/` 或 `~/.claude/settings.json` 中,使其在每个项目中可用
445* **插件**:将配置打包并分发为[插件](/docs/zh-CN/plugins),团队可以安装633* **Plugins**:将配置打包并分发为[插件](/docs/zh-CN/plugins),团队可以安装
446* **从配置目录启动**:从包含您想要的 `.claude/` 配置的目录运行 Claude Code634* **从配置目录启动**:从包含您想要的 `.claude/` 配置的目录运行 Claude Code
447 635
448<h2 id="how-permissions-interact-with-sandboxing">636<h2 id="how-permissions-interact-with-sandboxing">
451 639
452权限和[沙箱](/docs/zh-CN/sandboxing)是互补的安全层:640权限和[沙箱](/docs/zh-CN/sandboxing)是互补的安全层:
453 641
454* **权限**控制 Claude Code 可以使用哪些工具以及它可以访问哪些文件或域。它们适用于所有工具,包括 Bash、Read、Edit、WebFetch 和 MCP。642* **权限**控制 Claude Code 可以使用哪些工具以及它可以访问哪些文件或域。它们适用于 Bash、Read、Edit、WebFetch、MCP 和其他所有工具,除了 deny 或 ask 规则无法阻止 [`EndConversation`](/docs/zh-CN/tools-reference#endconversation-tool-behavior),而任何其他工具仍然存在。
455* **沙箱**提供 OS 级别的强制执行,限制 Bash 工具的文件系统和网络访问。它仅适用于 Bash 命令及其子进程。643* **沙箱**提供 OS 级别的强制执行,限制 Bash 工具的文件系统和网络访问。它仅适用于 Bash 命令及其子进程。
456 644
457使用两者进行深度防御:645使用两者进行深度防御,因为即使提示注入绕过 Claude 的决策制定,沙箱限制仍然适用。来自沙箱设置和权限规则的路径和域被[合并到最终沙箱配置](/docs/zh-CN/sandboxing#permission-rules)中。
646
647当您启用沙箱并将 `autoAllowBashIfSandboxed` 保留为其默认值 `true` 时,沙箱化的 Bash 命令无需提示即可运行,即使您的权限包括裸 `Bash` ask 规则,或[等效的 `Bash(*)` 形式](#match-all-uses-of-a-tool):沙箱边界替代了该整体工具提示。
458 648
459* 权限 deny 规则阻止 Claude 甚至尝试访问受限资源649在[计划模式](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)中,Claude Code 跳过此替代。没有 ask 规则时,[内置只读命令](#read-only-commands)仍然无需提示即可运行,任何其他 shell 命令在您仍在计划时通过常规权限流程;请参见[计划模式](/docs/zh-CN/permission-modes#analyze-before-you-edit-with-plan-mode)了解 Claude Code 如何在那里控制命令。使用裸 `Bash` ask 规则时,每个 Bash 命令都会提示,包括沙箱化的只读命令,与沙箱外相同。在 v2.1.212 之前,替代也适用于计划模式。
460* 沙箱限制防止 Bash 命令到达定义边界之外的资源,即使提示注入绕过 Claude 的决策制定
461* 沙箱中的文件系统限制结合 [`sandbox.filesystem`](/docs/zh-CN/sandboxing) 设置与 Read 和 Edit deny 规则;两者都合并到最终的沙箱边界中
462* 网络限制结合 WebFetch 权限规则与沙箱的 `allowedDomains` 和 `deniedDomains` 列表
463 650
464当沙箱启用 `autoAllowBashIfSandboxed: true`(这是默认值)时,沙箱化的 Bash 命令无需提示即可运行,即使您的权限包括裸 `Bash` ask 规则,或[等效的 `Bash(*)` 形式](#match-all-uses-of-a-tool):沙箱边界替代了该整体工具提示。这些检查仍然适用:651这些检查仍然适用:
465 652
466* 内容范围的 ask 规则(如 `Bash(git push *)`)仍然强制提示653* 内容范围的 ask 规则(如 `Bash(git push *)`)仍然强制提示
467* 显式 deny 规则仍然适用654* 显式 deny 规则仍然适用
468* 针对 `/`、您的主目录或其他关键系统路径的 `rm` 或 `rmdir` 命令仍然会触发提示655* 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的 `rm` 或 `rmdir` 命令仍然通过常规权限流程
469 656
470不会在沙箱中运行的命令(如排除的命令)按照通常的方式遵守裸 `Bash` ask 规则。请参见[沙箱模式](/docs/zh-CN/sandboxing#sandbox-modes)以更改此行为。657不会在沙箱中运行的命令(如排除的命令)按照通常的方式遵守裸 `Bash` ask 规则。请参见[沙箱模式](/docs/zh-CN/sandboxing#sandbox-modes)以更改此行为。
471 658
659<span id="managed-only-settings" />
660
472<h2 id="managed-settings">661<h2 id="managed-settings">
473 托管设置662 托管设置
474</h2>663</h2>
475 664
476对于需要对 Claude Code 配置进行集中控制的组织,管理员可以部署无法被用户或项目设置覆盖的托管设置。这些策略设置遵循与常规设置文件相同的格式,可以通过 MDM/OS 级别策略、托管设置文件、[服务器托管设置](/docs/zh-CN/server-managed-settings)或自托管的 [Claude apps gateway](/docs/zh-CN/claude-apps-gateway) 传递。有关传递机制和文件位置,请参见[设置文件](/docs/zh-CN/settings#settings-files)。665对于需要集中控制的组织,管理员部署托管设置,用户和项目设置无法覆盖,除了少数[安全敏感的密钥](/docs/zh-CN/settings#exceptions-to-managed-settings-precedence)。[部署托管设置](/docs/zh-CN/managed-settings)涵盖传递机制、托管层内的优先级以及[仅托管设置可以设置的密钥](/docs/zh-CN/managed-settings#managed-only-settings)。
477 666
478<h3 id="managed-only-settings">667其中一个密钥[`allowManagedPermissionRulesOnly`](/docs/zh-CN/settings-reference#allowmanagedpermissionrulesonly)使托管设置成为权限规则的唯一设置来源。其条目列出了 Claude Code 随后忽略的每个来源。
479 仅托管设置
480</h3>
481 668
482以下设置仅在托管设置中有效。将它们放在用户或项目设置文件中无效。669`disableBypassPermissionsMode`通常放在托管设置中以强制执行组织策略,但它可以从任何范围工作。用户可以在自己的设置中设置它以将自己锁定在绕过模式之外。
483
484| 设置 | 描述 |
485| :--------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
486| `allowAllClaudeAiMcps` | 当为 `true` 时,claude.ai 连接器与已部署的 `managed-mcp.json` 一起加载,而不是被其独占控制所抑制。请参见[托管 MCP 配置](/docs/zh-CN/managed-mcp) |
487| `allowedChannelPlugins` | 可能推送消息的频道插件的允许列表。设置时替换默认 Anthropic 允许列表。需要 `channelsEnabled: true`。请参见[限制哪些频道插件可以运行](/docs/zh-CN/channels#restrict-which-channel-plugins-can-run) |
488| `allowManagedHooksOnly` | 当为 `true` 时,仅加载托管 hooks、SDK hooks 和托管设置 `enabledPlugins` 中强制启用的插件中的 hooks。用户、项目和所有其他插件 hooks 被阻止 |
489| `allowManagedMcpServersOnly` | 当为 `true` 时,仅尊重来自托管设置的 `allowedMcpServers`。`deniedMcpServers` 仍然从所有来源合并。请参见[托管 MCP 配置](/docs/zh-CN/managed-mcp) |
490| `allowManagedPermissionRulesOnly` | 当为 `true` 时,防止用户和项目设置定义 `allow`、`ask` 或 `deny` 权限规则。仅应用托管设置中的规则。不影响 MCP 服务器允许列表;对于此,请设置 `allowManagedMcpServersOnly` |
491| `blockedMarketplaces` | 市场来源的黑名单。在下载前检查被阻止的来源,因此它们永远不会接触文件系统。请参见[托管市场限制](/docs/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) |
492| `channelsEnabled` | 允许为组织启用[频道](/docs/zh-CN/channels)。请参见[企业控制](/docs/zh-CN/channels#enterprise-controls)了解每个计划的默认设置 |
493| `disableSideloadFlags` | 在启动时拒绝 `--plugin-dir`、`--plugin-url`、`--agents` 和 `--mcp-config` CLI 标志。没有这个,用户可以通过传递这些标志来绕过 `strictKnownMarketplaces` 进行单次运行。请参见[`disableSideloadFlags`](/docs/zh-CN/settings#available-settings)。需要 Claude Code v2.1.193 或更高版本 |
494| `forceRemoteSettingsRefresh` | 当为 `true` 时,阻止 CLI 启动直到远程托管设置被新鲜获取,如果获取失败则退出。请参见[故障关闭强制执行](/docs/zh-CN/server-managed-settings#enforce-fail-closed-startup) |
495| `pluginTrustMessage` | 自定义消息,附加到安装前显示的插件信任警告 |
496| `sandbox.filesystem.allowManagedReadPathsOnly` | 当为 `true` 时,仅尊重来自托管设置的 `filesystem.allowRead` 路径。`denyRead` 仍然从所有来源合并 |
497| `sandbox.network.allowManagedDomainsOnly` | 当为 `true` 时,仅尊重来自托管设置的 `allowedDomains` 和 `WebFetch(domain:...)` allow 规则。非允许的域被自动阻止,不提示用户。被拒绝的域仍然从所有来源合并 |
498| `strictKnownMarketplaces` | 控制用户可以添加和安装插件的插件市场来源。请参见[托管市场限制](/docs/zh-CN/plugin-marketplaces#managed-marketplace-restrictions) |
499| `strictPluginOnlyCustomization` | 阻止 skills、agents、hooks 和 MCP servers 来自用户和项目来源,因此它们只能来自插件或托管设置。`true` 锁定所有四个表面;数组如 `["skills", "hooks"]` 仅锁定命名的表面。请参见[`strictPluginOnlyCustomization`](/docs/zh-CN/settings#strictpluginonlycustomization) |
500| `wslInheritsWindowsSettings` | 当在 Windows HKLM 注册表项或 `C:\Program Files\ClaudeCode\managed-settings.json` 中为 `true` 时,WSL 除了从 `/etc/claude-code` 读取托管设置外,还从 Windows 策略链读取托管设置。请参见[设置文件](/docs/zh-CN/settings#settings-files) |
501
502`disableBypassPermissionsMode` 通常放在托管设置中以强制执行组织策略,但它可以从任何范围工作。用户可以在自己的设置中设置它以将自己锁定在绕过模式之外。
503
504<Note>
505 在 Team 和 Enterprise 计划上,Owner 在[Claude Code 管理设置](https://claude.ai/admin-settings/claude-code)中启用或禁用[远程控制](/docs/zh-CN/remote-control)和[网络会话](/docs/zh-CN/claude-code-on-the-web)组织范围内的设置。远程控制还可以通过 [`disableRemoteControl`](/docs/zh-CN/settings#available-settings) 设置按设备禁用。网络会话没有按设备托管设置密钥。
506</Note>
507 670
508<h2 id="settings-precedence">671<h2 id="settings-precedence">
509 设置优先级672 设置优先级
510</h2>673</h2>
511 674
512权限规则遵循与所有其他 Claude Code 设置相同的[设置优先级](/docs/zh-CN/settings#settings-precedence):675权限规则遵循与所有其他 Claude Code 设置相同的[设置优先级](/docs/zh-CN/settings#settings-precedence),托管设置最高:没有其他级别(包括命令行参数)可以覆盖托管权限规则。
513
5141. **托管设置**:无法被任何其他级别覆盖,包括命令行参数
5152. **命令行参数**:临时会话覆盖
5163. **本地项目设置**(`.claude/settings.local.json`)
5174. **共享项目设置**(`.claude/settings.json`)
5185. **用户设置**(`~/.claude/settings.json`)
519 676
520如果工具在任何级别被拒绝,没有其他级别可以允许它。例如,托管设置 deny 无法被 `--allowedTools` 覆盖,`--disallowedTools` 可以添加超出托管设置定义的限制。677如果工具在任何级别被拒绝,没有其他级别可以允许它。例如,托管设置 deny 无法被 `--allowedTools` 覆盖,`--disallowedTools` 可以添加超出托管设置定义的限制。
521 678
522同样的规则也适用于设置范围:如果用户设置允许某个权限而项目设置拒绝它,deny 规则会阻止它。反之亦然:用户级别的 deny 会阻止项目级别的 allow,因为来自任何范围的 deny 规则在 allow 规则之前被评估。679同样的规则也适用于设置范围:如果用户设置允许某个权限而项目设置拒绝它,deny 规则会阻止它。反之亦然:用户级别的 deny 会阻止项目级别的 allow,因为来自任何范围的 deny 规则在 allow 规则之前被评估。
523 680
524嵌入主机可以在 [`parentSettingsBehavior`](/docs/zh-CN/settings#settings-precedence) 设置为 `"merge"` 时,通过 SDK `managedSettings` 选项提供额外的托管策略;嵌入器值可以收紧策略但不能放松它。681嵌入主机可以通过 SDK `managedSettings` 选项提供额外的托管策略,包括权限允许规则,除非管理员设置了 `allowManaged*Only` 锁;[向 Claude Desktop 会话传递策略](/docs/zh-CN/claude-apps-gateway#deliver-policy-to-claude-desktop-sessions)涵盖了嵌入器策略何时适用。
525 682
526<h2 id="project-allow-rules-and-workspace-trust">683<h2 id="project-allow-rules-and-workspace-trust">
527 项目允许规则和工作区信任684 项目允许规则和工作区信任
528</h2>685</h2>
529 686
530项目的 `.claude/settings.json` 中的 `permissions.allow` 规则和 `permissions.additionalDirectories` 条目授予功能,因此 Claude Code 仅在您接受该工作区的[工作区信任对话框](/docs/zh-CN/security#additional-safeguards)后才应用它们。在此之前,Claude Code 会读取规则但不应用它们。信任对话框列出了该文件夹将授予的允许规则和其他目录,以便您可以在接受前查看它们。`deny` 和 `ask` 规则不受影响,因为它们仅限制。687项目的 `.claude/settings.json` 中的 `permissions.allow` 规则和 `permissions.additionalDirectories` 条目授予功能,因此 Claude Code 仅在您接受该文件夹的[工作区信任对话框](/docs/zh-CN/security#additional-safeguards)后才应用它们。对话框列出了该文件夹将授予的规则和目录,以便您可以先查看它们。`deny` 和 `ask` 规则不受影响,因为它们仅限制。
688
689Claude Code 根据您启动它的位置来保存和存储您接受的信任:
690
691* 在存储库中,Claude Code 根据 git 存储库根目录来保存信任,因此信任覆盖整个存储库,除了其中嵌套的任何 git 存储库(如子模块)。在[工作树](/docs/zh-CN/worktrees)中,它使用主检出的根目录,就像它对[保存的规则](#permission-system)所做的那样。
692* 在存储库外,Claude Code 根据您启动它的目录来保存信任,信任覆盖该目录的任何子目录,除了其中嵌套的 git 存储库(如克隆)。每个被覆盖的子目录随后都被视为一个您信任其父目录的文件夹。
693* 当您从主目录启动时,Claude Code 仅在当前会话期间保持信任,不会将其写入磁盘;请参阅[其他保护措施](/docs/zh-CN/security#additional-safeguards)说明。
694
695Claude Code 仅在交互式会话中显示信任对话框。`claude -p` 运行或 SDK 会话永远不会显示它,信任父文件夹不计入这些规则,因此[在您信任文件夹之前运行什么](#what-runs-before-you-trust-a-folder)说明了在这两种情况下 Claude Code 仍然使用哪些存储库内容。
696
697<h3 id="when-your-local-settings-file-needs-trust">
698 当您的本地设置文件需要信任时
699</h3>
700
701`.claude/settings.local.json` 通常是您自己的文件,因此 Claude Code 应用其允许规则和其他目录而无需信任步骤。当该文件在 git 中被跟踪,或 `.claude` 是符号链接时,Claude Code 将其视为存储库提供的文件,并暂不应用其规则,直到您信任该文件夹为止。
702
703Claude Code 运行 git 来区分两者,并且仅在您信任该文件夹后才运行 git:您接受了它或其父目录的信任对话框,其信任扩展到它,或您在 `-p` 或 SDK 会话中,这被视为已接受。在此之前,您启动 Claude Code 的位置决定了该文件规则会发生什么:
531 704
532Claude Code 按工作区保存信任,以 git 存储库根目录为键,或在存储库外,以您启动 Claude Code 的目录为键。当您从主目录启动时,信任仅在当前会话期间保持,不会写入磁盘;请参阅[其他保护措施](/docs/zh-CN/security#additional-safeguards)说明。信任父目录不会应用嵌套项目的允许规则。705* **在您的配置主目录中:** Claude Code 立即应用该文件夹的 `.claude/settings.local.json` 而无需运行 git。您的配置主目录是您的主目录,或一个您已将其 `.claude` 子目录设置为 [`CLAUDE_CONFIG_DIR`](/docs/zh-CN/env-vars#variables) 的目录。如果该 `CLAUDE_CONFIG_DIR` 目录位于 git 存储库内,并且 Claude Code 改为[将您的本地设置保留在存储库根目录](/docs/zh-CN/settings#where-claude-code-looks-for-each-file),它会像在其他任何地方一样暂不应用这些规则。
706* **其他任何地方:** Claude Code 像对待项目设置一样暂不应用该文件的规则。一旦检查运行,Claude Code 应用未跟踪文件的规则,或位于任何 git 存储库外的目录中的文件的规则,即使您尚未信任该确切文件夹。
533 707
534`.claude/settings.local.json` 是您自己的文件,因此工作区信任检查通常不适用于它。当存储库可能提供了该文件时,例如当它提交到 git 或 `.claude` 是符号链接时,其允许规则和其他目录会像项目设置一样通过信任检查。708<Note>
709 配置主目录例外仅跳过信任步骤。`~/.claude/settings.local.json` 仍然是[本地范围](/docs/zh-CN/settings#compare-the-scope-of-each-settings-file),因此 Claude Code 仅在您从主目录本身启动的会话中读取它,而不是在每个项目中。要在所有项目中应用权限规则,请将它们添加到您的用户设置中:`~/.claude/settings.json`,或当设置 `CLAUDE_CONFIG_DIR` 时为 `$CLAUDE_CONFIG_DIR/settings.json`。
710</Note>
535 711
536Claude Code 运行 git 来检查存储库是否提供了该文件,并且仅在被接受的信任对话框覆盖的文件夹中运行该检查,对于该文件夹或其父目录之一。在您尚未信任的文件夹中的交互式会话中,`.claude/settings.local.json` 中的允许规则和其他目录会像项目设置一样通过信任检查,直到您接受对话框,除非会话在您自己的配置主目录中运行,如下所述。在以下两个例外中,只有配置主目录例外在对话框之前适用,因为它不需要运行 git。确定目录不在 git 存储库内使用相同的 git 检查,因此不在存储库内的例外在接受覆盖该文件夹的信任对话框后生效。在 v2.1.207 之前,未跟踪的 `.claude/settings.local.json` 在您接受对话框之前在该文件夹中应用其允许规则。712在版本 2.1.196 至 2.1.199 中,Claude Code 在您的配置主目录中和 git 存储库外也会暂不应用该文件的规则,并在那里打印[`this workspace has not been trusted`](/docs/zh-CN/errors#workspace-has-not-been-trusted)警告。在 v2.1.207 之前,Claude Code 在您接受对话框之前应用未跟踪文件的规则。
537 713
538`.claude/settings.local.json` 中的允许规则和其他目录在两种情况下也可以在没有工作区信任的情况下应用:714<h3 id="what-runs-before-you-trust-a-folder">
715 在您信任文件夹之前运行什么
716</h3>
539 717
540* 您启动 Claude Code 的目录不在 git 存储库内。718每一行是存储库可以提供的一种内容。列是两种您尚未信任该文件夹本身的情况:您仅信任了父文件夹,或您在那里运行了 `claude -p` 或 SDK,这永远不会显示信任对话框。父文件夹列不适用于[嵌套存储库](#project-allow-rules-and-workspace-trust)内:在交互式会话中 Claude Code 为其显示信任对话框,`claude -p` 或 SDK 运行遵循 `claude -p` 列。
541* 会话在您自己的配置主目录中运行:您的主目录或任何您已将其 `.claude` 子目录设置为 [`CLAUDE_CONFIG_DIR`](/docs/zh-CN/env-vars) 的目录。
542 719
543在这两种情况下,该文件都是您创建的,而不是存储库可能提供的文件,并且存储库提交的 `.claude/settings.local.json` 仍然需要工作区信任。版本 2.1.196 至 2.1.199 在这些工作区中将该文件视为存储库提供的文件,忽略其允许规则,并向 stderr 打印 [`this workspace has not been trusted`](/docs/zh-CN/errors#workspace-has-not-been-trusted) 警告。上述两个例外与 v2.1.195 及更早版本相匹配,并在 v2.1.200 中恢复。720| 存储库提供的内容 | 您仅信任了父文件夹 | `claude -p` 或 SDK,文件夹从未被信任 |
721| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------- |
722| 设置文件中的 [Hooks](/docs/zh-CN/hooks)、[`env`](/docs/zh-CN/settings-reference#env) 块和辅助命令(如 [`apiKeyHelper`](/docs/zh-CN/settings-reference#apikeyhelper)),以及项目技能的 [hooks](/docs/zh-CN/hooks#hooks-in-skills-and-agents) 和 [`allowed-tools`](/docs/zh-CN/skills#pre-approve-tools-for-a-skill) | 已使用 | 已使用。工作区信任在任何会话中都不会限制技能的 `allowed-tools` |
723| `.claude/settings.json` 中的 `permissions.allow` 规则和 `additionalDirectories` | 在您接受信任对话框之前不使用,对话框再次出现列出它们 | 不使用。Claude Code 向 stderr 打印 [`this workspace has not been trusted`](/docs/zh-CN/errors#workspace-has-not-been-trusted) 警告 |
724| 项目[子代理](/docs/zh-CN/sub-agents#hooks-in-subagent-frontmatter)中的 Frontmatter hooks、项目 [`@skills-dir` 插件](/docs/zh-CN/plugins-reference#skills-directory-plugins) 和来自存储库或 `--add-dir` 目录的 [`extraKnownMarketplaces`](/docs/zh-CN/settings-reference#extraknownmarketplaces) 条目 | 不使用,不提供对话框 | 不使用 |
725| 来自存储库或 `--add-dir` 目录的子代理 frontmatter 中的内联 [`mcpServers`](/docs/zh-CN/sub-agents#scope-mcp-servers-to-a-subagent)。在 v2.1.238 之前,Claude Code 在两种情况下都加载这些服务器 | 不使用,不提供对话框 | 不使用 |
726| `.mcp.json` 中的服务器,包括存储库[在其自己的设置中批准的](/docs/zh-CN/mcp#project-server-approvals-and-workspace-trust)服务器 | Claude Code 在连接它们之前询问您。存储库自己的批准不计数 | 连接而不询问,无论是否批准。SDK 仅在 `settingSources` 包括项目设置时加载它们。同一文件夹中的 `claude mcp list` 仍然将此类服务器报告为待处理 |
727| `.mcp.json` 中服务器上的 [`headersHelper`](/docs/zh-CN/mcp#trust-a-folder-before-its-headershelper-runs)。在 v2.1.238 之前,Claude Code 在两种情况下都运行辅助程序 | 在您接受信任对话框之前不运行,对话框再次出现命名声明辅助程序的位置。Claude Code 仅使用其静态 `headers` 连接服务器直到那时 | 不运行。Claude Code 仅使用其静态 `headers` 连接服务器,并为每个服务器向 stderr 打印 [`headersHelper not run`](/docs/zh-CN/errors#headershelper-not-run) 行 |
544 728
545同样从 v2.1.200 开始,一个工作区的允许规则或其他目录仍未被应用,但由于父目录已被信任而从未显示信任对话框,会在您下次在那里交互式启动 Claude Code 时显示对话框。对话框提供两个选择:729对于需要此确切文件夹被信任的行,手动信任它:在 `~/.claude.json` 中设置 `projects["<path>"].hasTrustDialogAccepted` 为 `true`,其中 `<path>` 是存储库根目录,或存储库外的文件夹本身。Claude Code 在跳过的子代理 hook 或内联 MCP 服务器的调试日志行中打印确切的键,在跳过的允许规则的 stderr 警告中,以及在跳过的辅助程序的 `headersHelper not run` 行中。
546 730
547* **Yes, I trust this folder**:保存该工作区的信任并在同一会话中应用规则。731在您未编写的存储库中运行 `claude -p` 之前,决定它可能在您的机器上运行什么:
548* **No, continue without these permissions**:继续工作,忽略这些规则。对话框将在下一个会话中再次出现。
549 732
550在[非交互模式](/docs/zh-CN/headless)中使用 `-p`,不会出现对话框,规则保持被忽略。733* 传递 `--setting-sources user`,或设置 SDK 的 `settingSources` 而不包括项目设置,以便 Claude Code 既不读取项目的设置文件也不读取其 `.mcp.json`
734* 使用 [`--bare`](/docs/zh-CN/headless#start-faster-with-bare-mode) 启动,以便 Claude Code 不读取项目中的 hooks、skills、自定义命令、子代理、插件或 `.mcp.json` 服务器。项目的 `env` 块和 `awsAuthRefresh` 等辅助程序在其设置文件中仍然适用,Claude Code 仅从 `--settings` 读取 `apiKeyHelper`
735* 传递 `--settings '{"disableAllHooks": true}'` 以[关闭该运行的 hooks](/docs/zh-CN/hooks#disable-or-remove-hooks)。仅在您的用户设置中设置它是不够的,因为存储库的项目设置优先于您的设置,可以将其设置回 `false`
736* 添加 [`disabledMcpjsonServers`](/docs/zh-CN/settings-reference#disabledmcpjsonservers) 条目以在每个会话类型中按名称拒绝 `.mcp.json` 服务器
551 737
552<h2 id="example-configurations">738<h2 id="example-configurations">
553 示例配置739 示例配置
559 另请参见745 另请参见
560</h2>746</h2>
561 747
562* [Settings](/docs/zh-CN/settings):完整的配置参考,包括权限设置表748* [所有设置](/docs/zh-CN/settings-reference#permission-settings):每个设置键,包括权限键
563* [Configure auto mode](/docs/zh-CN/auto-mode-config):告诉自动模式分类器您的组织信任哪些基础设施749* [配置自动模式](/docs/zh-CN/auto-mode-config):告诉自动模式分类器您的组织信任哪些基础设施
564* [Sandboxing](/docs/zh-CN/sandboxing):Bash 命令的 OS 级文件系统和网络隔离750* [沙箱隔离](/docs/zh-CN/sandboxing):Bash 命令的 OS 级文件系统和网络隔离
565* [Authentication](/docs/zh-CN/authentication):设置用户对 Claude Code 的访问751* [身份验证](/docs/zh-CN/authentication):设置用户对 Claude Code 的访问
566* [Security](/docs/zh-CN/security):安全保障和最佳实践752* [安全](/docs/zh-CN/security):安全保障和最佳实践
567* [Hooks](/docs/zh-CN/hooks-guide):自动化工作流并扩展权限评估753* [Hooks](/docs/zh-CN/hooks-guide):自动化工作流并扩展权限评估