Auto Mode 是 Claude Code v2.1.83 引入的新权限模式——在"每步都确认"和"完全跳过权限"之间提供了第三条路。基于分类器自动判断每个操作的风险,安全操作直接执行,危险操作拦截通知。
为什么需要 Auto Mode?
Claude Code 的三种权限模式对比:
| 模式 | 权限行为 | 适合场景 |
|---|---|---|
| 默认模式 | 每个操作都询问确认 | 对代码库不熟悉时 |
| Auto Mode | 分类器自动判断,安全放行,危险拦截 | 日常开发的主力模式 |
--dangerously-skip-permissions | 完全跳过所有权限检查 | CI/CD、完全信任的自动化环境 |
Auto Mode 解决了一个真实痛点:做一个复杂的重构,每隔几分钟就被权限确认打断注意力,或者要在任务开始前记住加 --dangerously-skip-permissions 标志。
开启 Auto Mode 的三种方式
方式一:快捷键切换(最快)
在 Claude Code 终端里按 Shift+Tab 在三种模式间循环:
默认模式 → Auto Mode → dangerously-skip-permissions → 默认模式
终端左下角会显示当前模式:
- 无标记:默认模式
auto mode on(黄色):Auto Mode 已开启
方式二:设置文件(持久生效)
// .claude/settings.json(当前项目)
{
"permissions": {
"defaultMode": "auto"
}
}// ~/.claude/settings.json(全局所有项目)
{
"permissions": {
"defaultMode": "auto"
}
}方式三:启动时指定
# 以 auto 模式启动
claude --permission-mode auto
# 等效于
claude -p auto分类器如何判断风险
Auto Mode 的分类器根据操作类型和影响范围判断:
自动放行(安全操作):
- 读取文件
- 编辑源代码文件
- 运行测试
- Git 操作(add、commit、status、diff)
- 安装依赖(npm install、pip install)
- 运行构建命令
拦截并通知(危险操作):
- 删除文件或目录
- 执行可能有副作用的系统命令
- 写入配置文件(超出项目范围)
- 网络请求到外部服务(视配置)
- 任何看起来超出当前任务范围的操作
高级配置:细化自动放行规则
如果默认的分类结果不符合你的需求,可以通过 permissions 配置细化:
给特定命令开绿灯
// .claude/settings.json
{
"permissions": {
"defaultMode": "auto",
"allow": [
"Bash(npm run *)",
"Bash(yarn *)",
"Bash(git *)",
"Bash(docker-compose *)"
]
}
}给特定操作加保险
即使在 Auto Mode 下,强制要求确认某些操作:
{
"permissions": {
"defaultMode": "auto",
"deny": [
"Bash(rm -rf *)",
"Bash(kubectl delete *)",
"Write(**/.env*)"
]
}
}组合配置(推荐的生产安全配置)
{
"permissions": {
"defaultMode": "auto",
"allow": [
"Read(**)",
"Write(src/**)",
"Write(tests/**)",
"Bash(npm *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(git push *)"
],
"deny": [
"Bash(rm -rf *)",
"Write(.env*)",
"Write(*.key)",
"Write(*.pem)"
]
}
}PermissionDenied Hook(v2.1.86 新增)
当分类器拦截了一个操作,会触发 PermissionDenied Hook。你可以用这个 Hook 实现自定义逻辑:
// .claude/settings.json
{
"hooks": {
"PermissionDenied": [{
"hooks": [{
"type": "command",
"command": ".claude/hooks/permission-denied-handler.sh"
}]
}]
}
}# .claude/hooks/permission-denied-handler.sh
#!/bin/bash
# 读取被拦截的操作信息
TOOL_NAME=$(echo "$CLAUDE_TOOL_NAME")
TOOL_INPUT=$(echo "$CLAUDE_TOOL_INPUT")
# 记录日志
echo "[$(date)] 被拦截: $TOOL_NAME" >> .claude/permission-log.txt
# 如果返回 retry: true,让 Claude 尝试不同的方式
if [[ "$TOOL_NAME" == "Bash" && "$TOOL_INPUT" == *"rm -rf"* ]]; then
echo '{"retry": true, "message": "请使用 trash 命令而不是 rm -rf"}'
fi/permissions 面板:查看和管理权限
# 打开权限管理面板
> /permissions
# 查看最近的权限决定
> /permissions → Recent
在 Recent 视图里可以:
- 查看每个操作是被放行还是拦截
- 手动重试被拦截的操作(按
r)
实际使用场景
场景一:大型重构任务
# 以 Auto Mode 启动,让 Claude 自主完成整个重构
claude --permission-mode auto
> 重构 src/api/ 目录,把所有 callback 风格改成 async/await。
保持接口不变,所有测试通过后再汇报给我。
Claude 会自动:修改文件 → 运行测试 → 修复失败 → 循环,全程无需手动确认。
场景二:监控危险操作
// 在 Auto Mode 下,对危险操作做审计日志
{
"permissions": {
"defaultMode": "auto"
},
"hooks": {
"PermissionDenied": [{
"hooks": [{
"type": "command",
"command": "echo \"[$(date)] 被拦截: $CLAUDE_TOOL_NAME\" >> audit.log"
}]
}]
}
}场景三:只对特定目录开放写权限
// 只允许修改 src/ 和 tests/,其他目录只读
{
"permissions": {
"defaultMode": "auto",
"allow": [
"Write(src/**)",
"Write(tests/**)"
],
"deny": [
"Write(**)" // 其他所有写操作需要确认
]
}
}Auto Mode vs 其他工具的权限管理
| 工具 | 权限控制 |
|---|---|
| Claude Code Auto Mode | AI 分类器 + 可配置规则,操作级别 |
| Cursor | 手动确认每步,无自动化 |
| GitHub Copilot | 只在 IDE 里,不执行系统命令 |
| Devin | 沙箱隔离,代价是无法访问本地文件 |
Auto Mode 在"能力"和"安全"之间找到了一个实际可用的平衡点。
来源:Claude Code Permission Modes 文档 | Week 13 What's New | 整理:ClaudeEagle