SupaStore

返回博客列表

Claude Code 权限怎么设置?permissions 配置与 6 种权限模式详解(2026)

Claude Code 权限怎么设置?本文讲清 Claude Code 默认的权限规则,演示 settings.json 中 permissions 的 allow、ask、deny 写法与 Bash、文件、网络、MCP 规则语法,对比 default、acceptEdits、plan、auto、dontAsk、bypassPermissions 六种权限模式,并给出安全减少确认弹窗的推荐配置。

SupaStore 开发者体验组 ·

Claude Code 权限怎么设置?permissions 配置与 6 种权限模式详解(2026)

Claude Code 权限设置决定了 Claude 哪些操作可以直接做、哪些要先问你、哪些绝对不能碰。设置得太紧,每改一个文件、跑一条命令都要点确认;设置得太松,又可能让 Claude 误删文件或推送代码。用好 permissions 规则和权限模式,能在安全和效率之间找到平衡。

本文讲清 Claude Code 默认的权限规则、settings.json 中 allow / ask / deny 的写法,对比 6 种权限模式,最后给出一份推荐配置。还不熟悉 Claude Code 的话,先看《Claude Code 教程:2026 Claude Code 安装与使用指南》。


Claude Code 默认的权限规则

操作类型 是否需要确认 选择"不再询问"后
读文件、搜索(Read、Grep) 工作目录内不需要 —
执行 Bash 命令 需要(内置的只读命令除外) 对该仓库的该命令永久生效
修改文件(Edit、Write) 需要 本次会话内有效
抓取网页(WebFetch) 需要(预置的文档域名除外) 对该仓库的该域名永久生效
网页搜索(WebSearch) 需要 对该仓库永久生效

ls、cat、pwd、grep、git status 等内置只读命令在任何模式下都不需要确认。选择"不再询问"时,规则会保存到仓库根目录的 .claude/settings.local.json。


Claude Code permissions 配置:allow、ask、deny

在会话中输入 /permissions,可以查看所有权限规则以及每条规则来自哪个 settings 文件。也可以直接编辑 settings 文件:

{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(git commit *)"
    ],
    "ask": [
      "Bash(git push *)"
    ],
    "deny": [
      "Read(./.env)",
      "Read(./secrets/**)",
      "Bash(rm -rf *)"
    ]
  }
}
  • allow:直接执行,不再询问;
  • ask:每次都弹出确认;
  • deny:禁止执行。

规则的匹配顺序

规则按 deny → ask → allow 的顺序检查,第一个匹配的生效,与规则写得多具体无关。也就是说,deny 里有 Bash(aws *) 时,即使 allow 里写了 Bash(aws s3 ls),这条命令仍然会被拦截——allow 不能在 deny 上"开例外"。

配置文件放在哪里

文件 生效范围
~/.claude/settings.json 你的所有项目
.claude/settings.json 当前项目,可提交到 Git 与团队共享
.claude/settings.local.json 当前项目,仅自己使用
组织托管设置 整个组织,优先级最高

Claude Code 权限规则语法

规则格式是 工具名 或 工具名(说明)。

Bash 命令规则

规则 匹配 不匹配
Bash(npm run build) 只有 npm run build 其他所有命令
Bash(npm run *) npm run build、npm run test --watch npm install
Bash(ls *) ls -la、ls lsof
Bash(git log *) 所有 git log 命令 其他 git 命令

两个注意点:

  1. * 要放在子命令后面:Bash(git *) 会放行所有 git 命令,包括 git push;
  2. 组合命令要每段都被允许:Bash(safe-cmd *) 不会放行 safe-cmd && other-cmd,Claude Code 能识别 &&、||、;、| 等分隔符。

文件读写规则

Read 和 Edit 规则使用 gitignore 风格的路径:

写法 含义 示例
//path 文件系统绝对路径 Read(//Users/alice/secrets/**)
~/path 用户主目录下的路径 Read(~/Documents/*.pdf)
/path 相对 settings 文件所在位置的路径 Edit(/src/**/*.ts)
path 或 ./path 相对当前目录的路径 Read(*.env)

注意 /Users/alice/file 不是绝对路径,绝对路径要写成 //Users/alice/file。deny 掉某个路径的 Read,同时也会禁止 Edit 这个路径。网上流传的 .claudeignore 文件对 Claude Code 没有效果,要排除文件请用 Read 的 deny 规则。

网络与 MCP 规则

  • WebFetch(domain:example.com):只允许抓取 example.com;
  • WebFetch(domain:*.example.com):允许子域名,但不包括 example.com 本身;
  • mcp__github__*:GitHub MCP 服务器的全部工具;
  • mcp__github__create_issue:只匹配一个工具;
  • Agent(Explore):匹配内置的 Explore 子代理。

MCP 的配置方法见《Claude Code MCP 怎么配置?2026 Claude Code MCP 配置教程》,子代理见《Claude Code 子代理怎么用?Subagents 配置教程》。


Claude Code 6 种权限模式

权限模式是"没有规则覆盖时"的默认行为:

模式 行为 适用场景
default 每种工具首次使用时询问,CLI 中显示为 Manual 重要项目、刚开始使用
acceptEdits 自动接受工作目录内的文件修改和 mkdir、mv、cp 等常见文件命令 信任当前任务,想少点确认
plan 只读代码、出方案,不修改源文件 复杂任务先规划再动手
auto 不逐条询问,由后台分类器检查每个操作是否符合你的要求 日常开发,兼顾效率与安全
dontAsk 凡是需要询问的操作一律拒绝,只执行已允许的 自动化脚本、CI
bypassPermissions 跳过几乎所有确认 只在容器、虚拟机等隔离环境中使用

怎么切换权限模式

  • 会话中按 Shift+Tab 循环切换:default → acceptEdits → plan(启用 auto 时从 auto 开始);
  • 启动时指定:claude --permission-mode plan;
  • 设置默认模式:在 settings 中写 "permissions": {"defaultMode": "acceptEdits"}。

dontAsk 不在 Shift+Tab 的循环里,需要用 --permission-mode dontAsk 启动。

auto 模式:分类器帮你把关

auto 模式下,一个独立的分类器模型会在操作执行前审查,拦截超出你请求范围、指向陌生基础设施,或疑似被恶意内容诱导的操作。默认会拦截的操作包括:curl | bash 这类下载并执行代码、把敏感数据发到外部、生产环境部署和数据库迁移、强制推送、git reset --hard、terraform destroy 等。工作目录内的文件操作、安装锁文件中声明的依赖、只读的 HTTP 请求则默认放行。

分类器连续拦截 3 次或累计拦截 20 次后,auto 模式会暂停,回到逐条询问。新版 Claude Code 在 auto 模式可用时,交互式会话默认以 auto 模式启动。

bypassPermissions:只在隔离环境中用

bypassPermissions(即 --dangerously-skip-permissions)会跳过包括写入 .git、.claude 等受保护目录在内的确认。官方明确建议只在容器或虚拟机这类隔离环境中使用,在 Linux 和 macOS 上以 root 或 sudo 运行时会拒绝启动。即使在这个模式下,删除根目录、主目录、工作目录这类关键路径的操作依然不会被自动批准。

团队想禁止使用这两个模式,可以在 settings 中设置 permissions.disableBypassPermissionsMode 或 permissions.disableAutoMode 为 "disable"。


推荐的 Claude Code 权限配置

日常开发可以从这份配置开始,放在项目的 .claude/settings.json 中与团队共享:

{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(npm test *)",
      "Bash(git diff *)",
      "Bash(git log *)",
      "Bash(git add *)",
      "Bash(git commit *)"
    ],
    "ask": [
      "Bash(git push *)",
      "Bash(npm install *)"
    ],
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)",
      "Read(./node_modules/**)"
    ]
  }
}

需要更灵活的拦截逻辑(比如按文件内容判断),可以配合 PreToolUse Hook 使用,写法见《Claude Code Hooks 怎么用?2026 Claude Code Hooks 配置教程》。


常见问题 (FAQ)

Q: Claude Code 怎么设置不再每次询问?

答: 把常用命令写进 settings.json 的 permissions.allow,例如 Bash(npm run *);或按 Shift+Tab 切换到 acceptEdits 模式自动接受文件修改;也可以在确认时选择"不再询问",规则会保存到 .claude/settings.local.json。

Q: Claude Code 权限规则的优先级是什么?

答: 规则按 deny、ask、allow 的顺序检查,第一个匹配的生效,所以 deny 规则总是优先,allow 规则无法在 deny 规则上开例外。

Q: 怎么禁止 Claude Code 读取 .env 文件?

答: 在 settings.json 的 permissions.deny 中加入 Read(./.env) 和 Read(./.env.*),deny 掉 Read 的同时也会禁止编辑这些文件;.claudeignore 文件对 Claude Code 没有效果。

Q: --dangerously-skip-permissions 安全吗?

答: 这个参数会进入 bypassPermissions 模式,跳过几乎所有确认,官方建议只在容器或虚拟机等隔离环境中使用,不要在存放重要数据的本机上直接使用。

Q: Claude Code 的 auto 模式和 acceptEdits 模式有什么区别?

答: acceptEdits 只自动接受文件修改和常见文件命令,其他命令仍会询问;auto 模式不逐条询问,而是由后台分类器审查每个操作,拦截高风险或超出请求范围的操作。