详细说明 Claude Code 的权限控制机制
| 模式 | 说明 | 适用场景 |
|---|---|---|
default |
使用默认权限规则 | 标准使用 |
acceptEdits |
允许编辑文件 | 需要修改代码 |
bypassPermissions |
跳过权限检查 | CI/自动化环境 |
dontAsk |
不询问,静默拒绝未授权操作 | 无交互环境 |
plan |
规划模式,只分析不执行 | 预览操作 |
auto |
自动模式(实验性,需要 TRANSCRIPT_CLASSIFIER 功能开启) | 智能权限判断 |
# 命令行
claude --permission-mode acceptEdits
# 环境变量
# CLAUDE_PERMISSION_MODE 环境变量不存在,应使用 CLI 参数或 settings.json
# CLI 参数
claude --permission-mode acceptEdits
# 配置文件
{
"permissions": {
"defaultMode": "acceptEdits"
}
}权限规则包含以下属性:
| 属性 | 类型 | 说明 |
|---|---|---|
source |
string | 规则来源 |
ruleBehavior |
allow | deny | ask |
规则行为 |
ruleValue.toolName |
string | 工具名称 |
ruleValue.ruleContent |
string | 可选的匹配模式 |
ToolName # 允许/拒绝该工具
ToolName(pattern) # 匹配特定调用模式
| 模式示例 | 匹配内容 |
|---|---|
Bash |
所有 Bash 调用 |
Bash(npm *) |
npm 开头的命令 |
Bash(*.sh) |
所有 shell 脚本 |
Bash(git push) |
git push 命令 |
Write(*.env) |
所有 .env 文件 |
Read(/etc/*) |
/etc 目录文件 |
规则按来源分组管理:
| 来源 | 说明 |
|---|---|
userSettings |
用户级配置 (~/.claude/settings.json) |
projectSettings |
项目级配置 (.claude.json) |
localSettings |
本地覆盖配置 |
flagSettings |
命令行标志设置 |
policySettings |
企业策略配置 |
cliArg |
CLI 参数指定 |
command |
命令注入 |
session |
会话内动态设置 |
- 明确拒绝 (deny) > 允许 (allow) > 询问 (ask)
- 模式越具体优先级越高
- 正则匹配优先于通配符
policySettings (最高) > flagSettings > localSettings > projectSettings > userSettings > pluginSettings (最低)
注意:从低优先级到高优先级遍历配置,后面的覆盖前面的。
请求工具
↓
检查规则 (从高优先级来源开始)
↓ [命中 deny]
↓
拒绝执行
↓ [命中 allow]
↓
允许执行
↓ [命中 ask]
↓
询问用户
↓ [未命中任何规则]
↓
检查默认权限模式
Claude Code 使用 Hook 系统处理动态权限请求。
在工具执行前触发:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "check_permission.sh"
}
]
}
]
}
}Hook 返回 JSON 格式的决策:
{
"continue": true,
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"permissionDecisionReason": "Trusted command"
}
}支持 permissionDecision 值:
allow- 允许执行deny- 拒绝执行ask- 询问用户
工具被拒绝后触发:
{
"hooks": {
"PermissionDenied": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "log_denial.sh"
}
]
}
]
}
}{
"continue": true,
"hookSpecificOutput": {
"hookEventName": "PermissionDenied",
"retry": false
}
}# 使用 acceptEdits 模式
claude --permission-mode acceptEdits
# 绕过所有权限检查(不推荐)
claude --permission-mode bypassPermissions用户可以在运行时批准单个调用:
⚠️ 工具请求: Bash(rm -rf node_modules)
是否允许? [y/N/a]
| 选项 | 含义 |
|---|---|
y |
仅允许本次 |
n |
拒绝 |
a |
允许所有后续类似调用 |
{
"permissions": {
"defaultMode": "acceptEdits"
}
}{
"permissions": {
"defaultMode": "default",
"allow": ["Read", "Glob", "Grep"],
"deny": ["Bash(rm -rf *)", "Write(/etc/**)"]
}
}{
"permissions": {
"defaultMode": "dontAsk",
"allow": ["Read", "Glob", "Grep", "Bash(npm run build)", "Bash(npm test)"],
"deny": ["Bash(sudo *)", "Bash(chmod *)", "Write(/etc/**)", "Write(*.pem)", "Write(*.key)"]
}
}{
"permissions": {
"defaultMode": "plan"
}
}通过 Hook 记录权限决策:
{
"hooks": {
"PermissionDenied": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "audit_permission.sh"
}
]
}
]
}
}#!/bin/bash
# audit_permission.sh
read input
echo "$input" >> ~/.claude/permission_audit.logQ: 所有命令都被拒绝
// 检查 permissions 配置
{
"permissions": {
"allow": ["Bash"]
}
}Q: Hook 返回后权限仍不生效
// 确保返回正确的 hookSpecificOutput
{
"continue": true,
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow"
}
}Q: 规则不生效
// 检查优先级顺序
// policySettings > flagSettings > localSettings > projectSettings > userSettings
// 确保高优先级来源的规则正确配置- 最小权限原则: 仅授予必要权限
- 分层配置: userSettings < projectSettings < localSettings < flagSettings < policySettings
- 定期审计: 记录权限请求
- 危险命令黑名单: rm -rf, sudo 等
- 模式具体化: 避免使用
*通配符