目录
Claude Code 的权限规则通过 settings.json 中的 allow / ask / deny,指定哪些工具、命令、文件或域名无需确认即可使用、需要询问或禁止使用。团队可以共享规则,禁止匹配的调用,并减少已检查过的例行任务所需的批准。但它并不会一律封锁同一程序的其他调用写法或脚本途径。
本文将介绍什么是权限规则(以及它与权限模式的区别)、allow/ask/deny 的优先级、规则语法、settings.json 的层级,以及实用配置示例——全部基于官方规范。
用 allow / ask / deny 实现精细控制
按 deny → ask → allow 评估(先匹配者胜)
deny
先评估匹配的 deny 规则
ask
每次都询问
allow
无需询问直接运行
1. 什么是权限规则(与模式的区别)
Claude Code 使用分层权限系统。以 Manual 为基准,工作范围内的读取通常无需确认,编辑与 Bash 执行通常需要确认,但内置只读命令、allow 等属于例外。在这个基础上,规则可指定个别例外(来源:官方文档 Configure permissions)。
不要与权限模式混淆:模式设置整体确认策略(default、acceptEdits、auto 等),规则指定个别工具与命令。两者共同作用:模式确定基础,规则再通过“始终允许这个”或“禁止这次调用”等要求加以调整。
💡 规则由 Claude Code 强制执行,而非模型。你的提示词或 CLAUDE.md 会影响 Claude 尝试去做什么,但不会决定什么是被允许的。请通过 /permissions、规则、模式或 PreToolUse 钩子来授予或撤销访问权限。
2. allow / ask / deny 与优先级
共有三种规则类型。/permissions 命令可以列出并编辑它们(并显示每条规则来自哪个 settings.json)。
无需询问直接运行
指定的工具/命令无需手动批准即可运行。
每次都询问
每次使用都请求确认。即使有更宽泛的 allow 也匹配,匹配到的 ask 仍会触发询问。
禁止(最高优先级)
禁止使用。在设置规则之间,allow 不能覆盖匹配的 deny。
评估顺序为 deny → ask → allow。普通设置规则中,首次匹配决定结果,具体程度不会改变顺序。宽泛的 Bash(aws *) deny 也会阻止更具体的 Bash(aws s3 ls) allow。要点是 allow 不能覆盖匹配的 deny。Read/Edit 相对路径的否定模式是另一项功能。
⚠️ 两种 deny 写法行为不同:像 Bash 这样仅写工具名会把该工具从 Claude 的上下文中完全移除(Claude 根本看不到它)。而像 Bash(rm *) 这样限定范围的规则会保留该工具可用,仅阻止匹配的调用。
3. 规则语法(Tool(specifier))
格式为 Tool(全部)或 Tool(specifier)(特定)。每个工具都有自己的指定符风格。
| 工具 | 示例 | 含义 |
|---|---|---|
| Bash | Bash(npm run *) | 以 npm run 开头的命令(末尾的 * = 单词边界) |
| Read / Edit | Read(./.env) | 读取当前目录下的 .env(gitignore 风格路径) |
| WebFetch | WebFetch(domain:example.com) | 抓取到 example.com |
| MCP | mcp__github__get_* | github 服务器的 get_ 系列工具 |
| Agent | Agent(Explore) | Explore 子智能体 |
MCP 规则只对其指定的服务器生效。从 v2.1.299(2026年10月14日)起,mcp__a 不允许名为 a__b 或 a_ 的其他服务器。名称包含 __ 或以 _ 结尾的服务器,请在规范化后的完整名称后加上 __* 来书写,例如 mcp__reports__v2__*(官方文档和更新日志,2026年10月18日确认)。
Bash 通配符可以出现在任何位置。Bash(ls *)(空格 + *)能匹配 ls -la,但不匹配 lsof(单词边界);Bash(ls*)(无空格)则两者都匹配。末尾的 :* 等同于 *。
// 允许或禁止指定调用,但不会封锁同一程序的所有途径
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git commit *)"
],
"deny": [
"Bash(git push *)"
]
}
}
复合命令逐个匹配子命令,并在判定前移除可识别的包装器。但同一程序的其他调用写法未必匹配:Bash(git push *) 不匹配 git -C . push。内置只读命令通常省略确认,但工作范围外的读取限制、auto 分类器的等待等是另行处理的条件。
Read/Edit 路径遵循 gitignore 语义,有四种锚点:
| 写法 | 锚点 | 示例 |
|---|---|---|
//path | 文件系统绝对路径 | Read(//tmp/x) |
~/path | 主目录 | Read(~/.ssh/**) |
/path | 设置文件的基准位置(项目设置为项目根目录,用户设置为 ~/.claude) | Edit(/src/**) |
path / ./path | 当前目录 | Read(.env) |
* /Users/... 并非绝对路径——它相对于该设置文件的基准位置(项目设置中即项目根目录)。在用户设置中,Read(/secrets/**) 指的是 ~/.claude/secrets/**,想让规则在所有项目中生效,请用 // 或 ~/ 书写。绝对路径请使用 //Users/...(双斜杠)。Read(.env) 等同于 Read(**/.env),会匹配其下的每一个 .env。
相对路径 deny 的否定模式是独立功能。在同一来源的数组中,将 Read(!sample.env) 放在 Read(*.env) 后面,可将 sample.env 排除在该规则之外。它不能解除其他来源的 deny、用 /、~/ 或 // 锚定的规则,也不能解除整个目录的拒绝。请与通过 allow 覆盖 deny 区分。官方文档:否定模式。
4. settings.json 的层级与优先级
设置值按层级解析。对于权限规则,匹配的 deny 先于 allow 评估。下表描述设置文件与 CLI 规则的优先关系,不是涵盖 mod 改变判定在内的绝对保证。
| 优先级 | 位置 | 用途 |
|---|---|---|
| 1(最强) | 托管设置(Managed settings) | 组织策略。无法被用户/CLI 覆盖 |
| 2 | 命令行参数 | 临时的会话级覆盖 |
| 3 | .claude/settings.local.json | 个人项目设置(已 gitignore) |
| 4 | .claude/settings.json | 共享项目设置(已提交) |
| 5 | ~/.claude/settings.json | 跨所有项目的用户设置 |
// .claude/settings.json(团队共享)
{
"permissions": {
"defaultMode": "acceptEdits",
"allow": ["Bash(npm run *)", "WebFetch(domain:docs.example.com)"],
"deny": ["Read(.env)", "Read(**/secrets/**)", "Bash(git push *)"],
"additionalDirectories": ["../shared-lib"]
}
}
默认权限模式也在这里设置,即 defaultMode(模式详情)。不过,auto 和 bypassPermissions 写在项目设置(.claude/settings.json、.claude/settings.local.json)里不会生效,要写在用户设置或托管设置里。要读取/编辑工作目录之外的内容,请把路径添加到 additionalDirectories。
5. 实用配置示例
基本做法是将 allow 限于已检查的例行调用,对要限制的调用使用 ask/deny。它不会自动控制同一操作的其他写法或获准脚本中的全部行为。
🔒 保护密钥文件
deny: ["Read(.env)", "Read(**/secrets/**)", "Read(~/.ssh/**)"]。限制内置文件工具与目标路径可识别的文件命令,但递归搜索、任意脚本、MCP 等途径仍然存在。
🚀 为指定调用添加确认
ask: ["Bash(git push *)", "Bash(rm *)"]。即使在 auto 中,也为匹配调用添加确认。注意其他调用写法及 mod 对判定的改变。
⚡ 自动化日常工作
allow: ["Bash(npm run *)", "Bash(git commit *)"]。测试/构建/提交不被打断地运行。不过在 auto mode 下,Bash(npm run *) 这类包管理器 run 命令的宽泛许可会被移除,改由分类器审查。
Bash 参数匹配不足以强制限制 URL。即使拒绝 curl/wget 并改用 WebFetch,也仍有绝对路径、sh -c 和其他程序的通信途径。WebFetch 域名规则控制该工具,而非全部 Bash 流量。若需强制限定目标,应结合沙箱网络许可列表等措施,并另行管理沙箱外工具及重试。
6. 易错点与常见混淆
- deny 由 Claude Code 强制执行,而非模型。在提示词或 CLAUDE.md 中写“别读这个”,如果没有规则是拦不住的。
- Read/Edit deny 无法阻止间接访问。它适用于内置文件工具及
cat/head/sed,但不适用于 Python/Node 脚本自行打开文件的操作。不点名目标文件的递归操作,如grep -r pattern .,也是例外。操作系统限制适用于沙箱内进程;内置 Read、MCP 等途径需另行控制。 - 留意环境运行器。
devbox run *、npx和docker exec会把它们的参数当作命令来运行,所以Bash(devbox run *)也会允许devbox run rm -rf .。请编写包含内层命令的规则。 - 钩子不覆盖规则。PreToolUse 钩子可扩展权限,但无论其结果如何,deny/ask 都会评估。不过 mod 的
tool.check可在后续阶段替换判定:批准 ask,在没有 managed 设置的个人环境等条件下,也可批准 deny。受管理设备及 Team/Enterprise 默认优先 deny,但组织设置可以改变这一点。需要判断已安装 mod 是否可信。 - 在 auto mode 下,即使写进 allow 的命令也可能交给分类器审查。进入 auto mode 时,可执行任意代码的宽泛 allow 规则(不加限定的
Bash(*)、Bash(python*)这类带通配符的解释器、包管理器的 run 命令、Agent规则等)会被移除,退出该模式后恢复;Bash(npm test)这类范围窄的规则仍然有效。规则只按书写的原样匹配,所以Bash(git push *)匹配不到git -C . push,没有匹配到规则的命令由分类器判断。写入受保护路径时,即使有匹配的 allow 规则也会交给分类器。正当操作被拦截时,可以在/permissions的 Recently blocked(v2.1.314 之前为 Recently denied)中重试(见权限模式)。GitHub 上也有“写进 allow 仍被拦截”的报告(例如 #95996)。本条依据截至2026年10月9日的官方文档(Choose a permission mode)。
* 行为依据 Claude Code 官方文档 Configure permissions / Settings files and precedence / Choose a permission mode,截至 2026 年 10 月 9 日。行为可能变化,请核对最新官方文档。
总结
关于 Claude Code 权限规则的三个要点。
- 它是什么:在
settings.json中用 allow/ask/deny 针对每个工具、命令、文件和域名进行授予/询问/禁止。模式设定基线;规则处理具体细节。 - 优先顺序:deny → ask → allow(首次匹配决定结果,具体程度无关)。设置规则中,allow 不能覆盖匹配的 deny。层级:managed > CLI > local > project > user。
- 语法:
Tool(specifier)。Bash 使用通配符(空格 + * 是单词边界),Read/Edit 使用 gitignore 风格路径,WebFetch 使用 domain:。复合命令需要每个子命令都匹配。
理解规则匹配范围,只减少需要减少的批准。结合权限模式与钩子使用。若需要强制限制文件或通信,可考虑沙箱。区分每一层适用的途径。
如果只想调查现状并获取建议,不修改代码,请参阅仅用 Codex 与 Claude Code 调查的操作指南。其中介绍应用、IDE 与 CLI 的操作,并提供要求提交报告后停止、不进入实施的提示词。
FAQ
Q. 权限规则和模式有什么不同?
A. 模式是宽泛的确认基线(default/acceptEdits/auto 等);规则是针对每个工具、每条命令的具体指定。二者协同工作,规则会覆盖模式(例如在 auto 模式下,ask/deny 规则仍然生效)。
Q. 我已经 allow 了——为什么还是会询问?
A. 因为评估顺序是 deny → ask → allow。如果有另一条 ask(或 deny)也匹配这次调用,它就会获胜,即使存在更具体的 allow 也一样。具体程度不会改变这个顺序。
Q. settings.json 应该放在哪里?
A. 团队共享:.claude/settings.json(已提交)。个人:.claude/settings.local.json(已 gitignore)。跨所有项目:~/.claude/settings.json。如需组织范围的强制约束,请使用托管设置(无法被覆盖)。
问:如何限制读取 .env?
答:deny: ["Read(.env)", "Read(**/secrets/**)"] 限制内置文件工具及可识别的文件命令,但不保证封锁未指明目标路径的递归搜索、Python/Node、MCP 等所有途径。对于 shell,请核对操作系统读取权限或沙箱内 denyRead;其他工具的权限需另行检查。
Q. 可以通过 Bash 参数来限制 URL 或文件吗?
答:命令字符串匹配无法封锁其他调用写法或其他程序执行的相同通信、文件操作。WebFetch 域名规则适用于 WebFetch。若需强制限制,请结合 shell 的文件系统与网络隔离,并另行控制沙箱外访问。
权限与隔离的作用范围及例外条件已于 2026 年 10 月 9 日重新对照官方原文。未更改设备设置,也未进行启动测试。