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

更多中文指南