Claude Code
Claude Code 权限:allow、ask 和 deny 规则、规则语法与允许的工具
Claude Code 的权限如何工作?如何允许或禁止特定工具?
Claude Code 会将每次工具调用与设置文件中的权限规则进行比对。规则写在 permissions.allow、permissions.ask 和 permissions.deny 中,格式为 Tool 或 Tool(specifier),评估顺序为先 deny,再 ask,最后 allow。使用 /permissions 可查看所有规则及其来源文件,也可以传入 --allowedTools 和 --disallowedTools 仅对单次会话生效。
本文译自英文版指南。命令、配置键与代码均保持原样;如有出入,以英文版为准。 阅读英文原版 → · 其他语言: 日本語 · 한국어 · Español · Português (Brasil)
设置一变,第一时间知道
当这些工具的设置、参数或权限规则发生变化时,每周一封邮件通知你(英文),内容均对照官方文档核实。
Allow、ask 和 deny
- Allow 规则让 Claude Code 无需询问即可使用匹配的工具。
- Ask 规则在每次使用匹配的工具时都会请求确认。
- Deny 规则会阻止匹配的工具。
- 顺序为先 deny,再 ask,最后 allow。首个匹配生效,具体程度不会改变顺序,因此像 Bash(aws *) 这样宽泛的 deny 会胜过 Bash(aws s3 ls) 这样更窄的 allow。
- 只写工具名的 deny 规则(如 Bash)会将该工具从 Claude 的上下文中移除。带范围的 deny(如 Bash(rm *))会保留工具,只阻止匹配的调用。
规则由 Claude Code 强制执行,而不是由模型执行。CLAUDE.md 中的指令会影响 Claude 尝试做什么,但不会改变它被允许做什么。
各工具的规则语法
- 整个工具:不带括号的 Bash、Read 或 WebFetch。Bash(*) 等同于 Bash。
- Bash:Bash(npm run build) 匹配该精确命令。Bash(npm run *) 匹配所有 npm 脚本。把 * 放在子命令之后:Bash(git log *) 只允许 git log,而 Bash(git *) 允许所有 git 命令。
- Bash(ls *) 要求 ls 后有空格,因此不会匹配 lsof。Bash(ls:*) 是尾部通配符的等效写法。
- Read 和 Edit 使用 gitignore 模式。Read(./.env) 阻止当前目录下的 .env 文件,Read(./secrets/**) 阻止整个文件夹。对于任何工具都不得修改的路径,请使用 Edit 规则,而不是 Write 规则。
- 路径://path 是从文件系统根目录开始的绝对路径,~/path 从你的主目录开始,/path 相对于设置文件所在项目,path 或 ./path 相对于当前目录。
- WebFetch:WebFetch(domain:example.com) 只匹配 example.com。要包含子域名,请添加 WebFetch(domain:*.example.com)。
- MCP:mcp__github 匹配 github 服务器的所有工具,mcp__github__get_* 匹配其 get_ 工具,mcp__github__create_issue 匹配单个工具。
- Subagent:Agent(Explore) 或 Agent(my-custom-agent)。将其放入 deny 可阻止 Claude 使用该 subagent。
示例设置
.claude/settings.json
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git commit *)",
"WebFetch(domain:docs.example.com)",
"mcp__github__get_*"
],
"ask": ["Bash(git push *)"],
"deny": [
"Read(./.env)",
"Read(./secrets/**)",
"Bash(rm *)"
]
}
}项目 .claude/settings.json 中的 allow 规则和 additionalDirectories 只有在你接受该文件夹的工作区信任对话框后才会生效。Deny 和 ask 规则立即生效。
命令行中的允许工具
- --allowedTools(或 --allowed-tools):无需提示即可运行的工具,使用相同的规则语法。
- --disallowedTools(或 --disallowed-tools):本次会话的 deny 规则。"mcp__*" 会移除所有 MCP 工具。
- --tools:限制哪些内置工具可用,例如 "Bash,Edit,Read"。
- --add-dir:添加 Claude 可以读取和编辑的工作目录。将其保存到 permissions.additionalDirectories 中即可长期保留。
终端
claude -p "summarize recent changes" \ --allowedTools "Bash(git log *)" "Bash(git diff *)" "Read" \ --disallowedTools "Edit"
默认会询问哪些操作,以及 "don't ask again" 会保存什么
- 只读工具(如文件读取和 Grep):在工作目录和附加目录内不提示。
- Bash 命令:会提示,内置的一组只读命令除外。"Yes, and don't ask again" 会针对该仓库和命令永久保存。
- 文件编辑和写入:会提示。"Don't ask again" 仅持续到会话结束,不会保存到文件。
- WebFetch:会提示,内置的一组预先批准的文档域名除外。批准按仓库和域名保存。
- WebSearch:会提示。批准按仓库保存。
保存的批准会作为规则写入 git 仓库根目录下的 .claude/settings.local.json(通过 worktree 解析到主 checkout),因此也适用于子目录和 worktree。批准 git status && npm test 这样的复合命令时,会为每个需要批准的子命令分别保存一条规则,最多 5 条。你可以在 Claude 工作时打开 /permissions;添加或删除的规则从 Claude 的下一次工具调用起生效。
永不提示的 Bash 命令,以及 Claude Code 能识别穿透的包装命令
- 只读命令在所有模式下都无需提示即可运行:内置集合包括 ls、cat、echo、pwd、head、tail、grep、find、wc、which、diff、stat、du、cd 以及 git 的只读形式。该集合不可配置;如需让其中某个命令提示,请添加 ask 或 deny 规则。
- 部分只读命令在 Manual 模式下仍会提示,例如带未加引号 glob 的 find、sort、sed 或 git,或者与 git 组合使用的、进入其他目录的 cd。
- 匹配前,Claude Code 会剥离 timeout、time、nice、nohup、stdbuf、command、builtin 和 zsh noglob,因此 Bash(npm test *) 也能匹配 timeout 30 npm test。它还会剥离不带参数的 xargs 以及开头对已知安全环境变量的赋值。
- npx、docker exec、direnv exec、devbox run 和 mise exec 等运行器不会被剥离。Bash(devbox run *) 会匹配 run 之后的任何内容,因此请为每个内部命令单独写一条精确规则,例如 Bash(devbox run npm test)。
- 前缀规则无法自动批准 watch、setsid、ionice 和 flock 等 exec 包装命令,也无法批准带 -exec、-delete 或 -fprint 的 find。请为完整命令使用精确规则,或使用 PreToolUse hook。
Bash deny 规则无法阻止的情况
Bash 规则匹配的是 Claude 写出的命令文本。只要任一子命令匹配,deny 和 ask 规则就会生效,包括在子 shell、命令替换或 for 循环内部。但它们无法捕获以其他方式调用的同一程序。
- Bash(curl *) 能阻止 curl https://example.com,但无法阻止 /usr/bin/curl https://example.com 或 sh -c 'curl https://example.com'。
- Bash(rm *) 能阻止 rm -rf build/,但无法阻止 /bin/rm -rf build/ 或 bash -c 'rm -rf build/'。
- Bash(git push *) 能阻止 git push origin main,但无法阻止 git -C . push origin main。
- 试图限制参数的模式(如 Bash(curl http://github.com/ *))会漏掉 URL 之前的 flag、https、重定向和变量。
- 输出重定向(>、>>、2>)和 tee 目标会按 Edit 规则和工作目录进行检查,因此 Bash(git commit *) 允许该命令,但不允许其输出写入的位置。
如需不受命令文本影响的限制,请使用 sandbox 的网络和文件系统规则,或使用检查完整命令的 PreToolUse hook。要限制网络访问,请 deny curl 和 wget,并为你信任的站点 allow WebFetch(domain:...);在允许 Bash 的情况下,仅靠 WebFetch 规则无法阻止网络访问。
哪个设置优先
- 任何层级的 deny 都无法被其他层级 allow。如果用户设置允许某项而项目设置拒绝,则结果为拒绝,反之亦然。
- Managed 设置优先级最高。即使 --allowedTools 也无法覆盖 managed deny,而 --disallowedTools 可以添加更多限制。
- allowManagedPermissionRulesOnly 会让 managed 设置成为权限规则的唯一来源。
- 将 permissions.disableBypassPermissionsMode 或 permissions.disableAutoMode 设为 "disable" 可禁用这些模式。它们在 managed 设置中最有用。
权限模式
规则作用于会话的权限模式之上:default(Manual)、acceptEdits、plan、auto、dontAsk 或 bypassPermissions。使用 claude --permission-mode <mode> 或设置中的 permissions.defaultMode 来指定。dontAsk 会拒绝所有需要提示的操作,allow 规则已批准的工具除外。如需完全无提示运行,请参阅在 Claude Code 中允许所有命令的指南。
来源
以下为本指南核对过的官方文档(英文)。 英文版核对日期: 2026-10-18
更多中文指南
- 在任意 AI 编程 agent 中允许所有命令:Cursor、Claude Code、Codex、Gemini CLI、Copilot CLI 及另外 7 款(2026)
- 各 AI 编程 agent 的规则与指令文件:.cursor/rules、CLAUDE.md、AGENTS.md、GEMINI.md、Copilot instructions 等(2026)
- 各 AI 编程 agent 的设置文件位置:Claude Code、Cursor、Codex、Gemini CLI、OpenCode、Qwen Code、Amp 和 Factory Droid(2026)
- 为任意 AI 编程 agent 添加 MCP server:Claude Code、Cursor、Codex、Gemini CLI、VS Code 及另外 8 款(2026)
- 各 AI 编程 agent 中的 hook:Claude Code、Cursor、Gemini CLI、GitHub Copilot、Kiro 和 Factory Droid(2026)
- 各 AI 编程 agent 中的 Agent Skills(SKILL.md):Claude Code、Codex、Cline、Amp 和 OpenHands(2026)
- 如何允许 Claude Code 运行所有命令:权限模式、allow 规则与跳过权限
- 如何允许 Cursor 运行所有命令:Run Everything、allowlist 与 sandbox
- Cursor 规则设置:项目、用户和 Team Rules、.mdc frontmatter、globs 与 AGENTS.md
- 向 Claude Code 添加 MCP 服务器(claude mcp add、.mcp.json、作用域)
- Subagent 与自定义 agent 对比:Claude Code vs Codex vs Cursor vs Gemini CLI vs GitHub Copilot(2026)