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 权限设置决定了 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 命令 |
两个注意点:
*要放在子命令后面:Bash(git *)会放行所有 git 命令,包括git push;- 组合命令要每段都被允许:
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/**)"
]
}
}
- 测试、构建、查看和提交代码直接放行,减少确认弹窗;
- 推送代码、安装新依赖保留确认;
- 敏感文件禁止读取,
node_modules禁止读取还能顺带节省 Token,原理见《Claude Code Token 消耗太快?10 个 Claude Code 省 Token 技巧》。
需要更灵活的拦截逻辑(比如按文件内容判断),可以配合 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 模式不逐条询问,而是由后台分类器审查每个操作,拦截高风险或超出请求范围的操作。