Permission:模型提出动作,Claude Code检查动作
↓
↓
权限系统检查
你电脑上的本地Claude Code说了算
↓
⚖️
✓允许
?询问用户
✗拒绝
⇢交给auto分类器
↓
权限检查,先记住三个问题
↓
2
命中写过的规则?
比如允许npm test、拒绝git push
自定义权限规则
↓
只读通常不问,Bash和改文件要问
🔍
只读操作
ReadGrepGlob
没有直接修改你的系统
通常不问
>_
Bash命令
npm installgit push
装依赖、联网、删文件,什么都干得了
通常要问
✏️
文件修改
EditWrite
会改你的代码和配置
通常要问
allow自动允许·ask一定询问·deny直接拒绝
写在项目的.claude/settings.json里,输入/permissions能看到当前项目的规则
{
"permissions": {
"allow": [
"Bash(npm run test)",
"Bash(git status)",
"Read(src/**)",
"WebFetch(domain:example.com)"
],
"ask": [
"Bash(git commit *)"
],
"deny": [
"Bash(git push *)",
"Read(./.env)"
]
}
}
permission mode:本次任务的基线策略
| 模式 |
它做什么 |
怎么切换 |
| default |
默认模式:读通常放行,危险动作询问 |
Shift+Tab循环切换 |
| acceptEdits |
自动接受工作目录内的文件编辑和常见文件操作 |
Shift+Tab循环切换 |
| plan |
只读和探索,不直接改源码 |
Shift+Tab循环切换 |
| auto |
很多待审批动作交给后台classifier自动判断 |
— |
| dontAsk |
不弹窗:没预先允许就拒绝 |
显式启动或写配置 |
| bypassPermissions |
跳过大多数权限提示,只适合隔离环境 |
显式启动或写配置 |
启动时指定
claude --permission-mode acceptEdits
写进 .claude/settings.json
{
"permissions": {
"defaultMode": "acceptEdits"
}
}
acceptEdits:工作目录内编辑自动过,外部副作用照样问
✓ 工作目录内,这些自动批准
EditWriteMultiEdit
Bash(mkdirtouchrmrmdirmvcpsed)
Edit src/app.ts
自动批准
工作目录内改项目文件
Edit ~/.ssh/config
提示或阻止
跑到工作目录外,还碰敏感配置
Bash(npm install)
仍可能提示
改依赖、改lockfile,还可能联网跑安装脚本
Bash(git push origin main)
仍可能提示
影响远程仓库,明显的外部副作用
自动接受的是「工作目录内的文件编辑」,不是「所有命令随便跑」
dontAsk:不弹窗,没允许就拒绝
{
"permissions": {
"defaultMode": "dontAsk",
"allow": [
"Read", "Grep", "Glob",
"Bash(npm test)",
"Bash(npm run lint)"
],
"deny": [
"Bash(git push *)",
"Bash(rm -rf *)"
]
}
}
npm install没命中任何规则——本来要弹窗的动作,在这里直接拒绝
dontAsk不是更自由,而是更适合自动化场景
auto:机械审批交给后台classifier
1
命中allow / deny规则的,先直接处理
2
只读动作、工作目录内文件编辑,通常自动批准
3
其他动作,连同上下文一起发给classifier判断
4
classifier拦住的,Claude收到原因,换一种安全做法
classifier在判断什么
- ▪这个动作符合用户请求吗
- ▪有没有越权
- ▪有没有碰危险路径
- ▪像不像prompt injection驱动的动作
- ▪风险能不能接受
临时提醒写在对话里,硬约束一定写成deny规则
bypassPermissions:跳过权限提示,直接执行
claude --dangerously-skip-permissions
✓ 可以开
- ✓容器、dev container
- ✓虚拟机VM
- ✓可以随时重置的沙盒目录
✗ 不要开
- ✗真实的home目录
- ✗真实的生产仓库
- ✗真实的云环境
bypass解决的是「我愿意承担这个沙盒里的风险」,不是「这东西本身安全」