是什么
permissions 是 Claude Code 的工具访问控制系统,通过 allow/ask/deny 规则精确控制 Claude 可以执行哪些操作。规则可以提交到版本控制分发给团队,也可以由个人自定义。
核心机制
权限层级
| 工具类型 | 示例 | 默认行为 |
|---|---|---|
| 只读 | 文件读取、Grep | 无需批准 |
| Bash 命令 | Shell 执行 | 需批准,“不再询问”永久生效(按项目目录+命令) |
| 文件修改 | Edit/Write | 需批准,“不再询问”到 session 结束 |
规则评估顺序:deny → ask → allow,第一个匹配的规则生效,deny 始终优先。
权限模式
| 模式 | 说明 |
|---|---|
default | 首次使用每个工具时提示 |
acceptEdits | 自动批准文件编辑和常见文件系统命令 |
plan | 只读模式,不编辑源文件 |
auto | 后台安全检查,自动批准(research preview) |
dontAsk | 自动拒绝未预批准的工具 |
bypassPermissions | 跳过所有权限提示(仅隔离环境使用) |
规则语法
Tool # 匹配所有使用
Tool(specifier) # 精确匹配
Bash(npm run *) # 通配符
Read(./.env) # 文件路径
WebFetch(domain:example.com) # 域名匹配
Managed-only Settings
permissions.disableBypassPermissionsMode: "disable":禁止 bypassPermissions 模式permissions.disableAutoMode: "disable":禁止 auto 模式allowManagedPermissionRulesOnly: true:只允许 managed settings 中的权限规则
通过 Hooks 扩展权限 PreToolUse hook 可以动态批准或拒绝工具调用,实现比静态规则更灵活的权限控制。
关键细节
- 权限由 Claude Code 强制执行,不是模型层面的限制;CLAUDE.md 中的指令不改变权限
Bash(*)等价于Bash,匹配所有 Bash 命令- 通配符
*可出现在命令的任意位置 /permissions命令查看当前所有权限规则及其来源文件
与其他概念的关联
- settings - 权限规则在 settings.json 中的配置位置
- server-managed-settings - 组织级权限策略下发
- auto-mode-config - auto 模式的分类器配置
实践要点
- 安全边界用 permissions/hooks 强制执行,不要依赖 CLAUDE.md 指令
bypassPermissions只在容器/VM 等隔离环境中使用,生产环境通过 managed settings 禁用- 团队共享的 allow 规则放
.claude/settings.json,个人偏好放 user settings