权限模型
Claude Code 的权限规则、权限模式与安全边界
Claude Code 在调用工具前会经过权限系统。理解这套机制,重点不是背某个版本的弹窗文案,而是知道三件事:
- 工具权限:哪些工具能用,哪些命令或路径必须先问你
- 权限模式:默认模式、计划模式、自动模式等会改变审批策略
- 安全边界:显式拒绝规则、受保护路径、沙盒和企业策略会继续生效
权限规则
在 settings.json 中可以用 permissions.allow、permissions.ask、permissions.deny 精细控制工具权限。
{
"permissions": {
"allow": [
"Read",
"Glob",
"Grep",
"Bash(pnpm test)",
"Bash(pnpm build)"
],
"ask": ["Bash(git push *)"],
"deny": ["Read(.env)", "Bash(rm -rf *)"]
}
}规则按安全优先级处理:deny 高于 ask,ask 高于 allow。也就是说,一个宽泛的拒绝规则不会被更窄的允许规则绕过。
规则语法
"Bash(pnpm test)":只匹配这个命令"Bash(pnpm *)":匹配pnpm前缀命令"Read(.env)":阻止读取当前目录及子目录里的.env"Edit(/src/**/*.ts)":匹配项目根目录下的 TypeScript 文件"mcp__github__*":匹配某个 MCP server 暴露的工具
Bash 规则会理解常见的 shell 分隔符和子命令。比如只允许 Bash(git status),并不等于允许 git status && git push。
权限模式
| 模式 | 行为 | 适用场景 |
|---|---|---|
default | 标准模式,首次使用需要审批的工具会询问 | 入门使用、敏感项目 |
acceptEdits | 自动接受文件编辑和常见工作区文件操作 | 日常编码迭代 |
plan | 读取文件和运行只读命令,不编辑源码 | 代码探索、重构规划 |
auto | 在后台安全检查下自动批准更多工具调用 | 长时间任务、减少频繁确认 |
dontAsk | 未预先允许的工具自动拒绝 | CI、脚本化、确定性流程 |
bypassPermissions | 跳过大多数权限提示 | 仅限隔离容器或 VM |
auto 仍是偏激进的模式,适合你已经能接受自动化执行风险的环境。bypassPermissions 更进一步,不适合日常开发主机;如果要用,最好放在一次性容器、临时 worktree 或 VM 里。
切换权限模式
快捷键
在交互模式中按 Shift+Tab 可以在常用模式之间切换。具体循环顺序会随版本和配置变化,以终端底部显示为准。
如果你想让 bypassPermissions 出现在快捷键循环里,需要显式允许。
启动时指定
claude --permission-mode acceptEdits也可以在 CI 或脚本里使用更严格的 dontAsk:
claude -p "检查这次 diff 是否有安全问题" \
--permission-mode dontAsk \
--allowedTools "Read,Grep,Glob,Bash(git diff *)"设为默认
在 ~/.claude/settings.json 或项目的 .claude/settings.json 中配置:
{
"permissions": {
"defaultMode": "acceptEdits"
}
}Hooks 与权限
PreToolUse Hook 可以参与权限决策,比如拒绝危险命令、要求人工确认、给工具输入加额外校验。
权限规则适合表达稳定边界;Hook 适合表达项目里的动态逻辑,例如:
- 阻止向生产数据库执行写入 SQL
- 阻止编辑
.env、证书、私钥 - 在写文件后自动运行格式化,但失败时提醒你
受保护路径与沙盒
Claude Code 会对关键路径、凭证文件、配置文件和 destructive shell 命令施加额外保护。具体规则会随版本、企业管理策略和沙盒配置变化,但下面这些区域应该默认当成高风险:
.git/.claude/.ssh/- shell 启动文件,如
.zshrc、.bashrc - IDE、hook、容器和包管理器配置目录
- 密钥、令牌、生产配置、数据库连接串
如果你需要让 Claude 在更大范围内操作,优先用沙盒、临时目录或独立 worktree 隔离风险,而不是简单把权限模式调到最宽。