权限模型
Claude Code 想帮你干活,前提是它得先问过你能不能。权限模型就是这套问答规则。这一节把四种模式、规则语法、危险选项一次讲透。
为什么需要权限
Claude Code 手里握着一批本地工具,Bash、Read、Write、Edit、WebFetch,每一个都能对你的机器产生真实影响。默认所有工具在触发时都会跳出一个确认框,等你按 y 或 n。这个默认策略最安全,但如果你在一个安全项目里连点五十下 y,工作节奏就断了。所以需要有一套让你按场景放宽或收紧的机制。
四种模式
default(默认询问) 每次调用工具都会弹确认框。你按 y 通过一次,按 a 加入本会话白名单,按 n 拒绝。适合新项目、陌生代码、生产环境的排查会话。
acceptEdits(自动通过文件编辑) 对 Edit、Write、NotebookEdit 这些文件写入类操作自动放行,其余工具(Bash、WebFetch 等)仍然要问。适合你已经知道 Claude 要改哪些文件、就是想让它连续多改几个的场景,比如批量重构。
plan(只出方案不动手) Claude 只做只读操作,Read、Grep、Glob 都能用,但任何写入、执行、外部调用一律禁用,最终产出一份计划让你 review。适合让 Claude 帮你想清楚一件复杂任务应该怎么拆步、影响哪些文件、有什么风险,等你点头再切回 default 让它执行。
bypassPermissions(全放开) 所有工具无需确认直接跑。风险最高,只在你完全信任当前任务且清楚会发生什么时用。也是 --dangerously-skip-permissions 命令行标志启用的模式。
运行时切换模式
三种方式,怎么方便怎么来。
快捷键 Shift+Tab:一按就在四种模式间循环,界面下方会显示当前所在。这是最快的方式。
Slash 命令 /permissions:打开权限管理面板,除了模式还能看当前 allow / deny 规则,也能现场加一条。
启动参数:跑 claude 时直接指定,比如:
claude --permission-mode plan或者在 settings.json 里写死默认值:
{
"permissions": {
"defaultMode": "acceptEdits"
}
}2
3
4
5
规则语法
除了大模式,Claude Code 还允许你写细粒度规则。规则格式是 工具名(参数模式),放在 permissions.allow 或 permissions.deny 数组里。
工具名
Bash、Read、Write、Edit、WebFetch、Grep、Glob、NotebookEdit 等。写工具名不带参数,等价于对该工具的所有调用生效。
参数模式
参数用 glob 或前缀写法。
Bash 命令:写要匹配的命令前缀,末尾用 :* 表示任意参数。
"Bash(git status:*)"
"Bash(npm test:*)"
"Bash(git push:*)"2
3
Bash(git status:*) 匹配所有以 git status 开头的命令,不管后面跟什么参数。想更严格就把 :* 换成具体参数,比如 Bash(git push origin main)。
Read / Write / Edit 文件路径:写 glob,** 代表任意层目录。
"Read(**)"
"Read(src/**/*.ts)"
"Write(docs/**)"
"Edit(**/*.md)"2
3
4
Read(**) 是允许读所有文件,Read(**/.env) 是明确匹配所有 .env 文件。
WebFetch 域名:用 URL 模式匹配。
"WebFetch(https://*.anthropic.com/**)"
"WebFetch(https://api.github.com/**)"2
只允许访问指定域名的场景很常见,避免 Claude 把内部信息拉到未知外部服务。
allow 与 deny
allow 是白名单,命中的操作跳过确认直接执行。deny 是黑名单,命中的操作直接拒绝,连问都不问。
deny 优先级高于 allow,两者同时命中时以 deny 为准。这样你可以先大范围放开,再局部禁掉某几条高危动作,例如:
{
"permissions": {
"allow": [
"Read(**)",
"Bash(git:*)"
],
"deny": [
"Read(**/.env)",
"Read(**/credentials/**)",
"Bash(git push --force:*)",
"Bash(git reset --hard:*)"
]
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
上面这段的效果是允许 Claude 读任意文件、跑任意 git 子命令,但 .env 和 credentials/ 目录读不到,git push --force 和 git reset --hard 也跑不了。
一份日常项目的推荐配置
给你一份适合大多数 Web 项目的起手式,写到 .claude/settings.json 里就能用:
{
"permissions": {
"defaultMode": "default",
"allow": [
"Read(**)",
"Grep(**)",
"Glob(**)",
"Bash(git status:*)",
"Bash(git diff:*)",
"Bash(git log:*)",
"Bash(npm test:*)",
"Bash(npm run lint:*)",
"Bash(npm run build:*)"
],
"deny": [
"Read(**/.env)",
"Read(**/.env.*)",
"Read(**/secrets/**)",
"Read(**/credentials/**)",
"Bash(rm -rf:*)",
"Bash(git push --force:*)",
"Bash(git push --force-with-lease:*)",
"Bash(git reset --hard:*)"
]
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
读代码、看 diff、跑测试、build 都自动放行,敏感文件和高危 git 命令直接拉黑。剩下的(Edit、Write、WebFetch、其他 Bash)还是走 default 询问模式。
危险选项:--dangerously-skip-permissions
启动时加这个标志,直接进入 bypassPermissions 模式:
claude --dangerously-skip-permissions字面意思,跳过所有权限确认。所有 Bash、所有写入、所有网络请求都直接执行。名字前缀 dangerously- 是 Anthropic 官方在给你打预防针。
什么时候可以用:
- 一次性、无副作用、跑完就走的隔离环境。比如 CI 里的 sandbox 容器、临时 VM、Docker 里的自动化流水线。
- 你已经把 workspace 挂成只读、或者做了快照可回滚,跑完能一键重置。
什么时候不该用:
- 你自己的开发机、公司电脑、装了任何敏感凭据的机器。
- 有生产数据库连接、部署密钥、企业内网 VPN 的环境。
- 权限逻辑没搞清楚时想着先跳过看看效果。跳过的代价可能是一个
rm -rf或者一次误 push。 - 任何和账号资金相关的环境,比如接了付款 API、云账号 root key。
一条红线
如果你正在犹豫要不要开 --dangerously-skip-permissions,答案就是不开。有这一秒犹豫就说明当前环境不够干净。真需要放开时你会毫不犹豫。
排查权限没生效
三个最常见问题:
规则写了但被 deny 覆盖:deny 优先级高,检查 deny 列表里有没有更宽的规则命中你想放行的操作。
规则在错误的层级:项目私有的 settings.local.json 会覆盖项目共享的 settings.json,用 /status 看当前生效的是哪一层。
规则语法写错:Bash(git push) 和 Bash(git push:*) 不一样,前者只匹配裸命令,后者匹配任何 git push 开头的调用。用 /permissions 查看解析后的规则,比对是不是你想的那样。
一句话总结
先立墙、再开门。默认模式 + 敏感文件 deny + 明确白名单,是安全和效率的平衡点。真需要撒手时切 acceptEdits 就够了,别轻易碰 bypassPermissions,更别把 --dangerously-skip-permissions 当默认启动参数。
至此本章四节结束,Slash、键位、配置、权限四把钥匙都在你手里了。下一章我们进项目工作流,看看真实项目里怎么把这些能力串起来用。