跳转到内容

权限模式

权限模式(Permission Mode)是 Claude Code 的「自动驾驶等级」——从全程问你,到放手让它自己开,分了 6 档。选哪一档,决定了你和 Claude 之间的信任边界。

把权限模式想象成汽车的驾驶辅助等级,从 L0 到 L5,越往后越放手。

模式 像什么 行为
default L0 全程脚放在刹车上 每个敏感操作(编辑文件、跑命令)都问你
acceptEdits L2 自适应巡航 自动接受文件编辑,但跑 bash 命令仍问你
plan 停车场低速巡游 只读模式,只规划不动手,不改文件不跑命令
auto L3 有条件自动驾驶 分类器模型判断风险:安全操作自动放行,危险操作仍问你
dontAsk L4 大部分场景不问 不弹权限提示,但仍受 allow/deny 列表约束
bypassPermissions L5 完全脱手 跳过所有权限检查(危险,仅沙箱/容器内用)
  • default:陌生项目、第一次让它碰生产代码。
  • acceptEdits:信任它的代码风格,但不想它乱跑 rm -rf
  • plan:探索阶段,先想清楚再动手。
  • auto:日常开发主力档,平衡效率和安全。
  • dontAsk:CI 流水线、已知安全的批处理。
  • bypassPermissions:Docker 容器、一次性虚拟机、故意让它放飞。

两种方式:启动时指定,或会话中循环切换。

Terminal window
# 用 plan 模式启动,先只读分析
claude --permission-mode plan
# CI 里跑全自动化
claude --permission-mode dontAsk -p "跑测试并修复失败的用例"

Shift+TabAuto / Plan / Normal 之间循环切换,状态栏会显示当前档位。这是日常最常用的切换方式,不用退出会话。

auto 模式不是简单放行,它背后跑着一个分类器模型:每当 Claude 想执行一个工具调用,分类器先评估这条操作的风险,再决定是放行还是问你。

Claude 想执行 → 分类器评估风险 →
├─ 低风险(如 Read、安全 Edit)→ 自动放行
└─ 高风险(如 Bash 删除命令、改 CI 配置)→ 弹权限提示

这就像一个副驾驶帮你判断「这个变道安全吗」——大多数情况它比你判断得快,但最终决定权还在你手里。

配置 Auto Mode 的默认行为:

Terminal window
claude auto-mode defaults

会话中输入 /permissions 可以查看当前的权限规则,并实时增删。

/permissions

它会列出三张表(见下一节),你可以选择允许、询问或禁止某个工具或路径。

权限规则由三部分组成:工具 + 参数 + 决策(allow/ask/deny)

工具 规则写法 说明
Bash Bash(prefix:*) 匹配命令前缀,如 Bash(npm:*) 允许所有 npm 子命令
Read Read(path) 匹配文件路径
Edit EditEdit(path) 文件编辑
WebFetch WebFetch(domain) 抓取域名
MCP 工具 mcp__<server>__<tool> 命名格式为 mcp__服务器名__工具名
斜杠命令 SlashCommand(name) 自定义命令
# 允许跑 npm 和 git 子命令
Bash(npm:*) allow
Bash(git:*) allow
# 改 src 下的文件不用问,但改 .env 必须问
Edit(src/*) allow
Edit(.env) ask
# 禁止删数据库
Bash(rm -rf /:*) deny
# 允许某个 MCP 工具
mcp__github__create_issue allow

权限规则分三张表,按优先级 deny > ask > allow 匹配。

列表 含义 用途
allow 直接放行,不问 信任的安全操作
ask 每次都问 半信任操作
deny 直接拒绝,不弹 红线操作

匹配顺序:先查 deny,命中就拒;否则查 ask,命中就问;否则查 allow,命中就放;都没有则按当前权限模式决定。

deny > ask > allow > 当前模式默认

权限规则可以写在多个层级:

  • 项目级.claude/settings.jsonpermissions 字段(提交到仓库,团队共享)
  • 用户级~/.claude/settings.json(个人偏好)
  • 本地项目级.claude/settings.local.json(不提交,个人覆盖)

权限模式用得好是提效,用不好是事故。几条硬规矩:

  1. 生产代码用 defaultacceptEdits——别图省事上 bypassPermissions
  2. bypassPermissions 只在容器/虚拟机里用——给它一个能炸但炸不到你的环境。
  3. deny 表里永远放着危险命令——rm -rf /git push --forceDROP TABLE
  4. CI 用 dontAsk 而非 bypassPermissions——前者仍受 deny 表约束,后者完全脱缰。
  5. 敏感目录用 Edit(path) 显式 ask——.envterraform/k8s/ 都该进 ask 表。
// .claude/settings.json 示例
{
"permissions": {
"allow": ["Bash(npm:*)", "Bash(git:*)", "Edit(src/*)"],
"ask": ["Edit(.env)", "Edit(k8s/*)"],
"deny": ["Bash(rm -rf /*:*)", "Bash(git push --force*:*)"]
}
}

权限模式是信任的刻度盘:从「全程盯」到「完全放手」共 6 档,Shift+Tab 随时换挡,/permissions 精修边界。日常用 auto,敏感用 plan,容器里才用 bypass——把方向盘留在自己手里,把油门交给分类器。

继续看 模型配置 了解怎么给 Claude 选脑子。🧠