14 14
15**1. Hooks**15**1. Hooks**
16 16
17首先运行 [hooks](/docs/zh-CN/agent-sdk/hooks)。Hook 可以直接拒绝调用或将其传递下去。返回 `allow` 的 hook 不会跳过下面的拒绝和询问规则;无论 hook 结果如何,这些规则都会被评估。返回 `allow` 的 `PreToolUse` hook 也不能批准针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 或 `rmdir` 删除。关于该 `allow` 在计划模式下的作用,请参阅 [计划模式下的 hook 批准](/docs/zh-CN/permissions#hook-approvals-in-plan-mode)。17首先运行 [hooks](/docs/zh-CN/agent-sdk/hooks.md)。Hook 可以直接拒绝调用或将其传递下去。返回 `allow` 的 hook 不会跳过下面的拒绝和询问规则;无论 hook 结果如何,这些规则都会被评估。
18
19返回 `allow` 的 `PreToolUse` hook 也不能批准目标被 Claude Code 识别为 [关键路径](/docs/zh-CN/permission-modes.md#critical-paths) 的 `rm` 或 `rmdir` 命令,例如 `rm -rf ~`。关于该 `allow` 在计划模式下的作用,请参阅 [计划模式下的 hook 批准](/docs/zh-CN/permissions.md#hook-approvals-in-plan-mode)。
18 20
19**2. 拒绝规则**21**2. 拒绝规则**
20 22
21检查 `deny` 规则(来自 `disallowed_tools` 和 [settings.json](/docs/zh-CN/settings-reference#permission-settings))。如果拒绝规则匹配,工具被阻止,即使在 `bypassPermissions` 模式下也是如此。裸名称拒绝规则如 `Bash` 在此评估开始之前将工具从 Claude 的上下文中移除,因此只有作用域规则如 `Bash(rm *)` 在此步骤被检查。23检查 `deny` 规则(来自 `disallowed_tools` 和 [settings.json](/docs/zh-CN/settings-reference.md#permission-settings))。如果拒绝规则匹配,工具被阻止,即使在 `bypassPermissions` 模式下也是如此。裸名称拒绝规则如 `Bash` 在此评估开始之前将工具从 Claude 的上下文中移除,因此只有作用域规则如 `Bash(rm *)` 在此步骤被检查。
22 24
23**3. 询问规则**25**3. 询问规则**
24 26
25检查来自 [settings.json](/docs/zh-CN/settings-reference#permission-settings) 的 `ask` 规则。如果询问规则匹配,调用会传递到您的 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 以获得确认,即使在 `bypassPermissions` 模式下也是如此。27检查来自 [settings.json](/docs/zh-CN/settings-reference.md#permission-settings) 的 `ask` 规则。如果询问规则匹配,调用会传递到您的 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 以获得确认,即使在 `bypassPermissions` 模式下也是如此。
26 28
27需要用户交互的工具行为相同:`AskUserQuestion` 和 MCP 工具,其服务器设置了 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool),总是传递到回调,即使当允许规则匹配时也是如此。在 `dontAsk` 模式下,两种情况都被拒绝,因为该模式从不提示。MCP 注解需要 Claude Code v2.1.199 或更高版本。29需要用户交互的工具行为相同:`AskUserQuestion` 和 MCP 工具,其服务器设置了 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool),总是传递到回调,即使当允许规则匹配时也是如此。在 `dontAsk` 模式下,两种情况都被拒绝,因为该模式从不提示。MCP 注解需要 Claude Code v2.1.199 或更高版本。
28 30
29您的组织设置为 `ask` 的 [claude.ai connector](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 工具也在此步骤离开流程。每个调用都传递到回调,即使在 `bypassPermissions` 模式下,即使当允许规则匹配时也是如此。回调接收原因 `Your organization requires approval for this tool`。在 `dontAsk` 模式下,调用被拒绝,因为该模式从不提示。31您的组织设置为 `ask` 的 [claude.ai connector](/docs/zh-CN/mcp.md#organization-controls-on-connector-tools) 工具也在此步骤离开流程。每个调用都传递到回调,即使在 `bypassPermissions` 模式下,即使当允许规则匹配时也是如此。回调接收原因 `Your organization requires approval for this tool`。在 `dontAsk` 模式下,调用被拒绝,因为该模式从不提示。
30 32
31**4. 权限模式**33**4. 权限模式**
32 34
33应用活跃的 [权限模式](#permission-modes):35应用活跃的 [权限模式](#permission-modes):
34 36
35* 在 `bypassPermissions` 模式下,Claude Code 批准到达此步骤的所有内容,除了针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 和 `rmdir` 删除,这些会传递下去。37* 在 `bypassPermissions` 模式下,Claude Code 批准到达此步骤的所有内容,除了被识别出的 [关键路径删除](/docs/zh-CN/permission-modes.md#critical-paths),这些会传递下去。
36* 在 `acceptEdits` 模式下,Claude Code 批准 [接受编辑模式](#accept-edits-mode-acceptedits) 下列出的文件操作。38* 在 `acceptEdits` 模式下,Claude Code 批准 [接受编辑模式](#accept-edits-mode-acceptedits) 下列出的文件操作。
37* 在 `plan` 模式下,Claude Code 将文件编辑和 shell 写入工具发送到您的 `canUseTool` 回调,无论允许规则如何,因此在规划时写入操作无法自动批准。39* 在 `plan` 模式下,Claude Code 将文件编辑和 shell 写入工具发送到您的 `canUseTool` 回调,无论允许规则如何,因此在规划时写入操作无法自动批准。
38* 在其他模式下,请求传递下去。40* 在其他模式下,请求传递下去。
39 41
40**5. 允许规则**42**5. 允许规则**
41 43
42检查 `allow` 规则(来自 `allowed_tools` 和 settings.json)。如果规则匹配,工具被批准。工具自己批准的调用也在此步骤被解决,无需规则:例如在您的工作目录内的文件读取或 [只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)。44检查 `allow` 规则(来自 `allowed_tools` 和 settings.json)。如果规则匹配,工具被批准。工具自己批准的调用也在此步骤被解决,无需规则:例如在您的工作目录内的文件读取或 [只读 Bash 命令](/docs/zh-CN/permissions.md#read-only-commands)。
43 45
44针对 [关键路径](/docs/zh-CN/permission-modes#critical-paths) 的 `rm` 和 `rmdir` 删除永远不会被允许规则批准。它们是否随后到达您的回调取决于权限模式:例如在 `auto` 模式的 Agent SDK 会话中,Claude Code 默认拒绝它们而不调用它。[关键路径](/docs/zh-CN/permission-modes#critical-paths) 模式表列出了每种模式对它们的处理方式。46被识别出的 [关键路径删除](/docs/zh-CN/permission-modes.md#critical-paths) 不会被允许规则批准。它们是否随后到达您的回调取决于权限模式:例如在 `auto` 模式的 Agent SDK 会话中,Claude Code 默认拒绝它们而不调用它。[关键路径模式表](/docs/zh-CN/permission-modes.md#critical-path-removals-in-each-permission-mode) 列出了每种模式对它们的处理方式。
45 47
46允许规则不会批准从 [网络路径](/docs/zh-CN/permissions#network-paths) 进行的读取。48允许规则不会批准从 [网络路径](/docs/zh-CN/permissions.md#network-paths) 进行的读取。
47 49
48**6. canUseTool 回调**50**6. canUseTool 回调**
49 51
50如果上述任何步骤都未解决,调用您的 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 以获得决定。在 `dontAsk` 模式下,此步骤被跳过,工具被拒绝,不过您安装的 [mod](/docs/zh-CN/plugins/mods/overview) 仍然可以批准[部分此类调用](/docs/zh-CN/permissions#precedence-among-rules-hooks-and-mods)。52如果上述任何步骤都未解决,调用您的 [`canUseTool` 回调](/docs/zh-CN/agent-sdk/user-input) 以获得决定。在 `dontAsk` 模式下,此步骤被跳过,工具被拒绝,不过您安装的 [mod](/docs/zh-CN/plugins/mods/overview.md) 仍然可以批准[部分此类调用](/docs/zh-CN/permissions.md#precedence-among-rules-hooks-and-mods)。
51 53
52在 TypeScript SDK 中,如果您设置了 [`permissionPrompts: 'none'`](/docs/zh-CN/agent-sdk/typescript#options),您的回调在此步骤不会被调用。[`PermissionRequest` hook](/docs/zh-CN/hooks#permissionrequest) 仍然有机会决定,如果它不决定,Claude Code 拒绝调用。该选项需要 Claude Code v2.1.259 或更高版本。54在 TypeScript SDK 中,如果您设置了 [`permissionPrompts: 'none'`](/docs/zh-CN/agent-sdk/typescript#options),您的回调在此步骤不会被调用。[`PermissionRequest` hook](/docs/zh-CN/hooks#permissionrequest) 仍然有机会决定,如果它不决定,Claude Code 拒绝调用。该选项需要 Claude Code v2.1.259 或更高版本。
53 55
55 57
56如果您在 TypeScript SDK 期望评估顺序在咨询回调之前自动批准调用的配置中传递 `canUseTool` 回调,SDK 在构造查询时会发出一次 Node.js 进程警告。警告的代码是 `CLAUDE_SDK_CAN_USE_TOOL_SHADOWED`。两个配置会触发它:58如果您在 TypeScript SDK 期望评估顺序在咨询回调之前自动批准调用的配置中传递 `canUseTool` 回调,SDK 在构造查询时会发出一次 Node.js 进程警告。警告的代码是 `CLAUDE_SDK_CAN_USE_TOOL_SHADOWED`。两个配置会触发它:
57 59
58* `permissionMode: 'bypassPermissions'`,它自动批准到达权限模式步骤的每个调用,除了 [任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)60* `permissionMode: 'bypassPermissions'`,它自动批准到达权限模式步骤的每个调用,除了 [任何模式都不自动批准的操作](/docs/zh-CN/permission-modes.md#actions-no-mode-auto-approves)
59* 每个裸 `allowedTools` 条目,如 `"Read"`,它在回调被咨询之前自动批准整个工具,除了 [任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves) 和 [从网络路径进行的读取](/docs/zh-CN/permissions#network-paths)61* 每个裸 `allowedTools` 条目,如 `"Read"`,它在回调被咨询之前自动批准整个工具,除了 [任何模式都不自动批准的操作](/docs/zh-CN/permission-modes.md#actions-no-mode-auto-approves) 和 [从网络路径进行的读取](/docs/zh-CN/permissions.md#network-paths)
60 62
61带有说明符的条目,如 `Bash(ls *)` 和 `acceptEdits` 模式不会触发它,来自设置文件的允许规则对检查不可见。63带有说明符的条目,如 `Bash(ls *)` 和 `acceptEdits` 模式不会触发它,来自设置文件的允许规则对检查不可见。
62 64
64 66
65此页面重点关注 **允许和拒绝规则** 和 **权限模式**。对于其他步骤:67此页面重点关注 **允许和拒绝规则** 和 **权限模式**。对于其他步骤:
66 68
67* **Hooks:** 运行自定义代码以允许、拒绝或修改工具请求。请参阅 [使用 hooks 控制执行](/docs/zh-CN/agent-sdk/hooks)。69* **Hooks:** 运行自定义代码以允许、拒绝或修改工具请求。请参阅 [使用 hooks 控制执行](/docs/zh-CN/agent-sdk/hooks.md)。
68* **canUseTool 回调:** 在运行时提示用户批准,当没有更早的步骤解决调用时。请参阅 [处理批准和用户输入](/docs/zh-CN/agent-sdk/user-input)。70* **canUseTool 回调:** 在运行时提示用户批准,当没有更早的步骤解决调用时。请参阅 [处理批准和用户输入](/docs/zh-CN/agent-sdk/user-input.md)。
69 71
70## 允许和拒绝规则72## 允许和拒绝规则
71 73
72`allowed_tools` 和 `disallowed_tools`(TypeScript:`allowedTools` / `disallowedTools`)在上述评估流程中向允许和拒绝规则列表添加条目。如果你在 `allowed_tools` 中命名了某个[任务跟踪工具](/docs/zh-CN/agent-sdk/todo-tracking#model-availability),Claude Code 也会为该会话启用这些工具。任何其他未在 `allowed_tools` 中列出的工具仍然可供 Claude 使用,对其的调用如果需要批准,则会进入权限模式。拒绝规则的行为取决于它们是命名工具还是在工具内限定模式。74`allowed_tools` 和 `disallowed_tools`(TypeScript:`allowedTools` / `disallowedTools`)在上述评估流程中向允许和拒绝规则列表添加条目。如果你在 `allowed_tools` 中命名了某个[任务跟踪工具](/docs/zh-CN/agent-sdk/todo-tracking.md#model-availability),Claude Code 也会为该会话启用这些工具。任何其他未在 `allowed_tools` 中列出的工具仍然可供 Claude 使用,对其的调用如果需要批准,则会进入权限模式。拒绝规则的行为取决于它们是命名工具还是在工具内限定模式。
73 75
74| 选项 | 效果 |76| 选项 | 效果 |
75| :- | :- |77| :- | :- |
76| `allowed_tools=["Read", "Grep"]` | `Read` 和 `Grep` 被自动批准,[从网络路径读取](/docs/zh-CN/permissions#network-paths)除外。此处未列出的其他工具仍然存在,对它们的调用如果需要批准,则会进入权限模式和 `canUseTool`。 |78| `allowed_tools=["Read", "Grep"]` | `Read` 和 `Grep` 被自动批准,[从网络路径读取](/docs/zh-CN/permissions.md#network-paths)除外。此处未列出的其他工具仍然存在,对它们的调用如果需要批准,则会进入权限模式和 `canUseTool`。 |
77| `disallowed_tools=["Bash"]` | `Bash` 工具定义从请求中移除。Claude 看不到该工具,无法尝试使用它。 |79| `disallowed_tools=["Bash"]` | `Bash` 工具定义从请求中移除。Claude 看不到该工具,无法尝试使用它。 |
78| `disallowed_tools=["Bash(rm *)"]` | `Bash` 保持可用。匹配 `rm *` [如所写](/docs/zh-CN/permissions#bash-rule-limits) 的调用在每种权限模式中都被拒绝,包括 `bypassPermissions`。其他 `Bash` 调用(包括 `/bin/rm`)会进入权限模式。 |80| `disallowed_tools=["Bash(rm *)"]` | `Bash` 保持可用。匹配 `rm *` [如所写](/docs/zh-CN/permissions.md#bash-rule-limits) 的调用在每种权限模式中都被拒绝,包括 `bypassPermissions`。其他 `Bash` 调用(包括 `/bin/rm`)会进入权限模式。 |
79| `disallowed_tools=["*"]` | 每个工具定义都从请求中移除。拒绝规则中支持工具名称通配符:`"*"` 匹配每个工具,`"mcp__*"` 匹配所有服务器中的每个 MCP 工具。 |81| `disallowed_tools=["*"]` | 每个工具定义都从请求中移除。拒绝规则中支持工具名称通配符:`"*"` 匹配每个工具,`"mcp__*"` 匹配所有服务器中的每个 MCP 工具。 |
80 82
81允许规则仅在字面 `mcp__<server>__` 前缀之后接受工具名称通配符。服务器段必须无通配符,以便规则命名您配置的特定服务器:`mcp__puppeteer__*` 匹配来自 `puppeteer` 服务器的每个工具,`mcp__github__get_*` 匹配其 `get_` 工具。未锚定的条目(如 `allowed_tools=["*"]` 或 `allowed_tools=["mcp__*"]`)会被忽略,不会自动批准任何内容。83允许规则仅在字面 `mcp__<server>__` 前缀之后接受工具名称通配符。服务器段必须无通配符,以便规则命名您配置的特定服务器:`mcp__puppeteer__*` 匹配来自 `puppeteer` 服务器的每个工具,`mcp__github__get_*` 匹配其 `get_` 工具。未锚定的条目(如 `allowed_tools=["*"]` 或 `allowed_tools=["mcp__*"]`)会被忽略,不会自动批准任何内容。
82 84
83`Read` 和 `Edit` 的限定规则采用路径模式。`Edit(path)` 规则管理所有写入文件的内置工具,包括 `Write` 和 `NotebookEdit`;`Write(path)` 规则永远不会被文件权限检查匹配。85`Read` 和 `Edit` 的限定规则采用路径模式。`Edit(path)` 规则管理所有写入文件的内置工具,包括 `Write` 和 `NotebookEdit`;`Write(path)` 规则永远不会被文件权限检查匹配。
84 86
85使用 `//path` 表示绝对文件系统路径:`Edit(//secrets/**)` 的拒绝规则会阻止在磁盘上 `/secrets` 下任何位置的写入。使用单个前导斜杠时,`Edit(/secrets/**)` 在规则的源处锚定。对于通过 `allowed_tools` 或 `disallowed_tools` 传递的规则,这意味着会话的工作目录,因此规则不会阻止磁盘上的 `/secrets`。请参阅 [Read 和 Edit 规则](/docs/zh-CN/permissions#read-and-edit) 了解四种锚定形式以及来自设置文件的规则如何解析。87使用 `//path` 表示绝对文件系统路径:`Edit(//secrets/**)` 的拒绝规则会阻止在磁盘上 `/secrets` 下任何位置的写入。使用单个前导斜杠时,`Edit(/secrets/**)` 在规则的源处锚定。对于通过 `allowed_tools` 或 `disallowed_tools` 传递的规则,这意味着会话的工作目录,因此规则不会阻止磁盘上的 `/secrets`。请参阅 [Read 和 Edit 规则](/docs/zh-CN/permissions.md#read-and-edit) 了解四种锚定形式以及来自设置文件的规则如何解析。
86 88
87> [!WARNING]89> [!WARNING]
88>90>
89> **自动批准的工具永远不会到达 `canUseTool`。** 在任何早期步骤中被批准的工具调用,通过 `acceptEdits` 或 `bypassPermissions`,或通过允许规则,会跳过你的 `canUseTool` 回调,因此你在那里放置的权限检查会被该工具无声地绕过。91> **自动批准的工具永远不会到达 `canUseTool`。** 在任何早期步骤中被批准的工具调用,通过 `acceptEdits` 或 `bypassPermissions`,或通过允许规则,会跳过你的 `canUseTool` 回调,因此你在那里放置的权限检查会被该工具无声地绕过。
90>92>
91> 允许规则永远不会自动批准 `AskUserQuestion`、标记为 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具、连接器工具[你的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools),或针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的 `rm` 和 `rmdir` 移除。在 `dontAsk` 模式中,Claude Code 拒绝这些调用而不调用回调。在其他模式中,前三个会到达回调。根据[权限模式](/docs/zh-CN/permission-modes#critical-paths),关键路径移除要么到达回调,要么 Claude Code 拒绝它而不调用它,就像它在 `auto` 模式中对 Agent SDK 会话默认做的那样。93> 允许规则永远不会自动批准 `AskUserQuestion`、标记为 [`_meta["anthropic/requiresUserInteraction"]`](/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具、[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具,或被识别出的 `rm` 和 `rmdir` [关键路径移除](/docs/zh-CN/permission-modes.md#critical-paths)。在 `dontAsk` 模式中,Claude Code 拒绝这些调用而不调用回调。在其他模式中,前三个会到达回调。[关键路径模式表](/docs/zh-CN/permission-modes.md#critical-path-removals-in-each-permission-mode)列出了每种模式如何处理关键路径移除。识别这些移除操作的检查[可能会遗漏某些命令](/docs/zh-CN/permission-modes.md#critical-paths)。
92>94>
93> 覆盖范围取决于条目的形式:像 `Read` 或 `mcp__github__get_issue` 这样的裸名称会自动批准对该工具的每个调用,上述例外和[从网络路径读取](/docs/zh-CN/permissions#network-paths)除外,而像 `Bash(npm test *)` 这样的限定规则仅自动批准匹配的调用,其他需要批准的 `Bash` 调用仍然会进入回调。对于必须在每个工具调用上运行的检查,使用 [`PreToolUse` hook](/docs/zh-CN/agent-sdk/hooks):hook 在每个其他步骤之前运行,hook 拒绝即使在 `bypassPermissions` 模式中也适用。95> 覆盖范围取决于条目的形式:像 `Read` 或 `mcp__github__get_issue` 这样的裸名称会自动批准对该工具的每个调用,上述例外和[从网络路径读取](/docs/zh-CN/permissions.md#network-paths)除外,而像 `Bash(npm test *)` 这样的限定规则仅自动批准匹配的调用,其他需要批准的 `Bash` 调用仍然会进入回调。对于必须在每个工具调用上运行的检查,使用 [`PreToolUse` hook](/docs/zh-CN/agent-sdk/hooks):hook 在每个其他步骤之前运行,hook 拒绝即使在 `bypassPermissions` 模式中也适用。
94 96
95对于锁定的代理,将 `allowedTools` 与 `permissionMode: "dontAsk"` 配对:97对于锁定的代理,将 `allowedTools` 与 `permissionMode: "dontAsk"` 配对:
96 98
101};103};
102```104```
103 105
104列出的工具被批准,[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)和[从网络路径读取](/docs/zh-CN/permissions#network-paths)除外。每个其他会提示的调用则会被拒绝,不过您安装的 [mod](/docs/zh-CN/plugins/mods/overview) 仍然可以批准[其中的部分调用](/docs/zh-CN/permissions#precedence-among-rules-hooks-and-mods)。106列出的工具被批准,[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes.md#actions-no-mode-auto-approves)和[从网络路径读取](/docs/zh-CN/permissions.md#network-paths)除外。每个其他会提示的调用则会被拒绝,不过您安装的 [mod](/docs/zh-CN/plugins/mods/overview.md) 仍然可以批准[其中的部分调用](/docs/zh-CN/permissions.md#precedence-among-rules-hooks-and-mods)。
105 107
106在 `default` 模式中不需要批准的调用会运行,无论您是否列出它们。其中包括[只读 Bash 命令](/docs/zh-CN/permissions#read-only-commands)、不在运行前询问的 `Agent` 等工具,以及工作目录内的文件读取。要将工具从请求中完全移除,请将其裸名称添加到 `disallowedTools`。108在 `default` 模式中不需要批准的调用会运行,无论您是否列出它们。其中包括[只读 Bash 命令](/docs/zh-CN/permissions.md#read-only-commands)、不在运行前询问的 `Agent` 等工具,以及工作目录内的文件读取。要将工具从请求中完全移除,请将其裸名称添加到 `disallowedTools`。
107 109
108> [!WARNING]110> [!WARNING]
109>111>
110> **`allowed_tools` 不限制 `bypassPermissions`。** `allowed_tools` 预批准你列出的工具。其他未列出的工具不匹配任何允许规则,会进入权限模式,其中 `bypassPermissions` 批准它们。将 `allowed_tools=["Read"]` 与 `permission_mode="bypassPermissions"` 一起设置仍然会批准每个工具,包括 `Bash`、`Write` 和 `Edit`。如果你需要 `bypassPermissions` 但想要阻止特定工具,请使用 `disallowed_tools`。112> **`allowed_tools` 不限制 `bypassPermissions`。** `allowed_tools` 预批准你列出的工具。其他未列出的工具不匹配任何允许规则,会进入权限模式,其中 `bypassPermissions` 批准它们。将 `allowed_tools=["Read"]` 与 `permission_mode="bypassPermissions"` 一起设置仍然会批准每个工具,包括 `Bash`、`Write` 和 `Edit`。如果你需要 `bypassPermissions` 但想要阻止特定工具,请使用 `disallowed_tools`。
111 113
112你也可以在 `.claude/settings.json` 中声明式地配置允许、拒绝和询问规则。当启用 `project` 设置源时会读取这些规则,默认 `query()` 选项就是这样。如果你显式设置 `setting_sources`(TypeScript:`settingSources`),请包含 `"project"` 以使其应用。请参阅[权限设置](/docs/zh-CN/settings-reference#permission-settings)了解规则语法。114你也可以在 `.claude/settings.json` 中声明式地配置允许、拒绝和询问规则。当启用 `project` 设置源时会读取这些规则,默认 `query()` 选项就是这样。如果你显式设置 `setting_sources`(TypeScript:`settingSources`),请包含 `"project"` 以使其应用。请参阅[权限设置](/docs/zh-CN/settings-reference.md#permission-settings)了解规则语法。
113 115
114## 权限模式116## 权限模式
115 117
124| 模式 | 描述 | 工具行为 |126| 模式 | 描述 | 工具行为 |
125| :- | :- | :- |127| :- | :- | :- |
126| `default` | 标准权限行为 | 无基于模式的自动批准;需要批准且不匹配任何允许规则的调用会触发您的 `canUseTool` 回调 |128| `default` | 标准权限行为 | 无基于模式的自动批准;需要批准且不匹配任何允许规则的调用会触发您的 `canUseTool` 回调 |
127| `dontAsk` | 拒绝而不是提示 | 任何原本会提示的调用都会被拒绝,不过您安装的 [mod](/docs/zh-CN/plugins/mods/overview) 仍可以批准[其中部分调用](/docs/zh-CN/permissions#precedence-among-rules-hooks-and-mods)。由 `allowed_tools` 或规则批准的调用会运行,`default` 模式下不需要批准的调用也会运行。[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具和需要用户交互的工具即使您已预先批准也会被拒绝。[来自网络路径的读取](/docs/zh-CN/permissions#network-paths)以及针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的 `rm` 和 `rmdir` 删除即使您已预先批准也会被拒绝。`canUseTool` 永远不会被调用 |129| `dontAsk` | 拒绝而不是提示 | 任何原本会提示的调用都会被拒绝,且不调用 `canUseTool`,不过您安装的 [mod](/docs/zh-CN/plugins/mods/overview.md) 仍可以批准[其中部分调用](/docs/zh-CN/permissions.md#precedence-among-rules-hooks-and-mods)。由 `allowed_tools` 或 `settings.json` 允许规则批准的调用会运行,`default` 模式下不需要批准的调用也会运行。某些调用,例如[来自网络路径的读取](/docs/zh-CN/permissions.md#network-paths),即使 `allowed_tools` 或允许规则与之匹配也会被拒绝。有关完整列表,请参阅[不要询问模式](#don’t-ask-mode-dontask) |
128| `acceptEdits` | 自动接受文件编辑 | 文件编辑和[文件系统操作](#accept-edits-mode-acceptedits)(`mkdir`、`rm`、`mv` 等)会自动批准 |130| `acceptEdits` | 自动接受文件编辑 | 文件编辑和[文件系统操作](#accept-edits-mode-acceptedits)(`mkdir`、`rm`、`mv` 等)会自动批准 |
129| `bypassPermissions` | 绕过权限检查 | 工具运行时无需权限提示,除了[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)。请谨慎使用 |131| `bypassPermissions` | 绕过权限检查 | 工具运行时无需权限提示,除了[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes.md#actions-no-mode-auto-approves)。请谨慎使用 |
130| `plan` | 规划模式 | Claude 在不编辑您的源文件的情况下探索和规划;文件编辑永远不会自动批准,而是通过您的 `canUseTool` 回调提示 |132| `plan` | 规划模式 | Claude 在不编辑您的源文件的情况下探索和规划;文件编辑永远不会自动批准,而是通过您的 `canUseTool` 回调提示 |
131| `auto` | 模型分类批准 | 模型分类器审查 shell 命令和网络请求等操作,允许或阻止它审查的每一个操作。有关可用性和决策顺序,请参阅[自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) |133| `auto` | 模型分类批准 | 模型分类器审查 shell 命令和网络请求等操作,允许或阻止它审查的每一个操作。有关可用性和决策顺序,请参阅[自动模式](/docs/zh-CN/permission-modes.md#eliminate-prompts-with-auto-mode) |
132 134
133> [!WARNING]135> [!WARNING]
134>136>
135> **子代理继承:** 子代理在父会话的权限模式下运行,除非您在其[`AgentDefinition`](/docs/zh-CN/agent-sdk/typescript#agentdefinition)上设置 `permissionMode`,且父会话处于 `default`、`dontAsk` 或 `plan` 模式。即使这样,Claude Code 也永远不会应用 `"bypassPermissions"` 值,并且仅当该子代理[可以使用自动模式](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)时才会应用 `"auto"` 值。子代理仅在父会话本身处于 `bypassPermissions` 模式时才在该模式下运行。 `bypassPermissions` 异常需要 Claude Code v2.1.267 或更高版本。137> **子代理继承:** 子代理在父会话的权限模式下运行,除非您在其[`AgentDefinition`](/docs/zh-CN/agent-sdk/typescript#agentdefinition)上设置 `permissionMode`,且父会话处于 `default`、`dontAsk` 或 `plan` 模式。即使这样,Claude Code 也永远不会应用 `"bypassPermissions"` 值,并且仅当该子代理[可以使用自动模式](/docs/zh-CN/permission-modes.md#eliminate-prompts-with-auto-mode)时才会应用 `"auto"` 值。子代理仅在父会话本身处于 `bypassPermissions` 模式时才在该模式下运行。 `bypassPermissions` 异常需要 Claude Code v2.1.267 或更高版本。
136>138>
137> 子代理可能具有不同的系统提示和比主代理更少受限的行为,因此继承 `bypassPermissions` 会授予它们完整的自主系统访问权限。[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes#actions-no-mode-auto-approves)仍然适用。139> 子代理可能具有不同的系统提示和比主代理更少受限的行为,因此继承 `bypassPermissions` 会授予它们完整的自主系统访问权限。[任何模式都不自动批准的操作](/docs/zh-CN/permission-modes.md#actions-no-mode-auto-approves)仍然适用。
138 140
139### 设置权限模式141### 设置权限模式
140 142
251 253
252* 在该范围之外的路径上工作254* 在该范围之外的路径上工作
253* 写入受保护的路径255* 写入受保护的路径
254* 使用 `rm` 或 `rmdir` 删除[关键路径](/docs/zh-CN/permission-modes#critical-paths)256* 使用 `rm` 或 `rmdir` 删除 Claude Code 识别为[关键路径](/docs/zh-CN/permission-modes.md#critical-paths)的路径
255 257
256**使用场景:** 您信任 Claude 的编辑并希望更快地迭代,例如在原型设计期间或在隔离目录中工作时。258**使用场景:** 您信任 Claude 的编辑并希望更快地迭代,例如在原型设计期间或在隔离目录中工作时。
257 259
258#### 不要询问模式(`dontAsk`)260#### 不要询问模式(`dontAsk`)
259 261
260将任何权限提示转换为拒绝,而不调用 `canUseTool`,不过您安装的 [mod](/docs/zh-CN/plugins/mods/overview) 仍可以批准[其中部分调用](/docs/zh-CN/permissions#precedence-among-rules-hooks-and-mods)。由 `allowed_tools`、`settings.json` 允许规则或 hook 预先批准的工具会正常运行。`default` 模式下不需要批准的调用也会运行,例如在您的工作目录内的文件读取和对 `Agent` 的调用。262将任何权限提示转换为拒绝,而不调用 `canUseTool`,不过您安装的 [mod](/docs/zh-CN/plugins/mods/overview.md) 仍可以批准[其中部分调用](/docs/zh-CN/permissions.md#precedence-among-rules-hooks-and-mods)。由 `allowed_tools`、`settings.json` 允许规则或 hook 预先批准的工具会正常运行。`default` 模式下不需要批准的调用也会运行,例如在您的工作目录内的文件读取和对 `Agent` 的调用。
261 263
262[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具、需要用户交互的工具、[来自网络路径的读取](/docs/zh-CN/permissions#network-paths),以及针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的 `rm` 和 `rmdir` 删除即使允许规则匹配也会被拒绝。`PreToolUse` hook 允许也不会放行关键路径删除或来自网络路径的读取。264[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具、需要用户交互的工具、[来自网络路径的读取](/docs/zh-CN/permissions.md#network-paths),以及已识别的[关键路径删除](/docs/zh-CN/permission-modes.md#critical-paths)即使允许规则匹配也会被拒绝。`PreToolUse` hook 允许也不会放行已识别的关键路径删除或来自网络路径的读取。识别这些删除操作的检查[可能会遗漏某些命令](/docs/zh-CN/permission-modes.md#critical-paths)。
263 265
264**使用场景:** 您希望为无头代理提供固定的、明确的工具表面,并且更喜欢硬拒绝而不是依赖 `canUseTool` 不存在的无声依赖。266**使用场景:** 您希望为无头代理提供固定的、明确的工具表面,并且更喜欢硬拒绝而不是依赖 `canUseTool` 不存在的无声依赖。
265 267
266#### 绕过权限模式(`bypassPermissions`)268#### 绕过权限模式(`bypassPermissions`)
267 269
268自动批准工具使用而无需提示,除了下面警告中列出的情况。钩子仍会执行,如果需要可以阻止操作。在 Linux 和 macOS 上,Claude Code 拒绝在此模式下以 root 身份或在[已识别的沙箱](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)外的 `sudo` 下启动,查询在第一轮之前失败。270自动批准工具使用而无需提示,除了下面警告中列出的情况。钩子仍会执行,如果需要可以阻止操作。在 Linux 和 macOS 上,Claude Code 拒绝在此模式下以 root 身份或在[已识别的沙箱](/docs/zh-CN/permission-modes.md#skip-all-checks-with-bypasspermissions-mode)外的 `sudo` 下启动,查询在第一轮之前失败。
269 271
270> [!WARNING]272> [!WARNING]
271>273>
274> `allowed_tools` 不会限制此模式。每个工具都被批准,而不仅仅是您列出的工具。这些控制仍然适用:276> `allowed_tools` 不会限制此模式。每个工具都被批准,而不仅仅是您列出的工具。这些控制仍然适用:
275>277>
276> * 拒绝规则、显式 `ask` 规则和钩子在模式检查之前被评估,仍然可以阻止工具。278> * 拒绝规则、显式 `ask` 规则和钩子在模式检查之前被评估,仍然可以阻止工具。
277> * 连接器工具[您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools)、需要用户交互的工具,以及 `rm` 和 `rmdir` 针对[关键路径](/docs/zh-CN/permission-modes#critical-paths)的删除仍然会转到您的 `canUseTool` 回调。279> * [您的组织设置为 `ask`](/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具、需要用户交互的工具,以及已识别的[关键路径删除](/docs/zh-CN/permission-modes.md#critical-paths)仍然会转到您的 `canUseTool` 回调。识别这些删除操作的检查[可能会遗漏某些命令](/docs/zh-CN/permission-modes.md#critical-paths)。
278> * [跨会话消息保护措施](/docs/zh-CN/permission-modes#skip-all-checks-with-bypasspermissions-mode)仍然适用。280> * [跨会话消息保护措施](/docs/zh-CN/permission-modes.md#skip-all-checks-with-bypasspermissions-mode)仍然适用。
279 281
280#### 规划模式(`plan`)282#### 规划模式(`plan`)
281 283
285 287
286在 TypeScript SDK 中,如果您在 `permissionMode: 'plan'` 旁边设置 `allowDangerouslySkipPermissions: true`,文件编辑和修改文件的 shell 命令仍然会到达您的 `canUseTool` 回调。该选项让您稍后可以使用 `setPermissionMode()` 切换到 `bypassPermissions`。288在 TypeScript SDK 中,如果您在 `permissionMode: 'plan'` 旁边设置 `allowDangerouslySkipPermissions: true`,文件编辑和修改文件的 shell 命令仍然会到达您的 `canUseTool` 回调。该选项让您稍后可以使用 `setPermissionMode()` 切换到 `bypassPermissions`。
287 289
288Claude 可能会使用 `AskUserQuestion` 在最终确定计划之前澄清需求。有关处理这些提示的信息,请参阅[处理批准和用户输入](/docs/zh-CN/agent-sdk/user-input#handle-clarifying-questions)。290Claude 可能会使用 `AskUserQuestion` 在最终确定计划之前澄清需求。有关处理这些提示的信息,请参阅[处理批准和用户输入](/docs/zh-CN/agent-sdk/user-input.md#handle-clarifying-questions)。
289 291
290**使用场景:** 您希望 Claude 提议更改而不执行它们,例如在代码审查期间或当您需要在进行更改之前批准更改时。292**使用场景:** 您希望 Claude 提议更改而不执行它们,例如在代码审查期间或当您需要在进行更改之前批准更改时。
291 293
292#### 自动模式(`auto`)294#### 自动模式(`auto`)
293 295
294分类器模型会在 shell 命令和网络请求等操作运行之前对其进行审查,并允许或阻止它审查的每一个操作。有关自动模式所需的模型和提供商以及它评估操作的顺序,请参阅[使用自动模式消除权限提示](/docs/zh-CN/permission-modes#eliminate-prompts-with-auto-mode)。296分类器模型会在 shell 命令和网络请求等操作运行之前对其进行审查,并允许或阻止它审查的每一个操作。有关自动模式所需的模型和提供商以及它评估操作的顺序,请参阅[使用自动模式消除权限提示](/docs/zh-CN/permission-modes.md#eliminate-prompts-with-auto-mode)。
295 297
296如果您使用 [`set_model()`](/docs/zh-CN/agent-sdk/python#claudesdkclient)、[`setModel()`](/docs/zh-CN/agent-sdk/typescript#query-object) 或 [`applyFlagSettings()`](/docs/zh-CN/agent-sdk/typescript#applyflagsettings) 将处于自动模式的会话切换到自动模式不支持的模型,会话将更改为 `default` 模式:298如果您使用 [`set_model()`](/docs/zh-CN/agent-sdk/python#claudesdkclient)、[`setModel()`](/docs/zh-CN/agent-sdk/typescript#query-object) 或 [`applyFlagSettings()`](/docs/zh-CN/agent-sdk/typescript#applyflagsettings) 将处于自动模式的会话切换到自动模式不支持的模型,会话将更改为 `default` 模式:
297 299
304 306
305有关权限评估流程中的其他步骤:307有关权限评估流程中的其他步骤:
306 308
307* [处理批准和用户输入](/docs/zh-CN/agent-sdk/user-input):交互式批准提示和澄清问题309* [处理批准和用户输入](/docs/zh-CN/agent-sdk/user-input.md):交互式批准提示和澄清问题
308* [Hooks 指南](/docs/zh-CN/agent-sdk/hooks):在代理生命周期中的关键点运行自定义代码310* [Hooks 指南](/docs/zh-CN/agent-sdk/hooks.md):在代理生命周期中的关键点运行自定义代码
309* [权限规则](/docs/zh-CN/settings-reference#permission-settings):`settings.json` 中的声明式允许/拒绝规则311* [权限规则](/docs/zh-CN/settings-reference.md#permission-settings):`settings.json` 中的声明式允许/拒绝规则