六种模式一张表
权限模式决定 Claude 做一件事之前要不要先问你。逐条确认的那个模式在界面上叫 Manual,配置值是 default(v2.1.200 起也接受 manual 作别名)。
| 模式 | 不问就能做的 | 适合 |
|---|---|---|
default(Manual) | 只有读取 | 逐条审、敏感工作 |
acceptEdits | 读取、文件编辑、常见文件系统命令(mkdir、touch、mv、cp 等) | 边改边在编辑器里 review |
plan | 读取;auto 可用时命令交分类器审 | 先探索再动手 |
auto | 一切,但有后台安全检查 | 长任务、消除弹窗疲劳 |
dontAsk | 只有预先 allow 的工具 | 锁死的 CI 与脚本 |
bypassPermissions | 一切 | 只在隔离容器 / 虚拟机里用 |
有几样东西任何模式都不会自动放行,包括 bypass:命中显式 ask 规则的工具、组织设为 ask 的连接器工具、需要用户交互的工具(内置 AskUserQuestion、标了 requiresUserInteraction 的 MCP 工具)、 对关键路径(根目录、home、工作目录及其父目录等)的 rm / rmdir、跨会话消息的两道安全阀。 另外 deny 规则在所有模式生效,allow 规则在 bypass 下无效。
你的会话现在从哪个模式开始
终端新会话按这个顺序取模式:--permission-mode 或 --dangerously-skip-permissions 标志 → 某个 settings 文件里的 permissions.defaultMode → 内置默认。内置默认取决于你怎么跑、什么套餐、feature flag 有没有拉到,首个匹配的行生效:
| 怎么运行 | 内置起始模式 |
|---|---|
任一 settings 文件把 disableAutoMode 设为 disable | default |
| 关闭了 feature-flag 拉取 | default |
| 安装或升级到带此默认值版本后的第一个会话(除非 flag 及时拉到) | default |
claude -p 或 Agent SDK | default |
| Bedrock、Google Cloud Agent Platform、Foundry、Claude Platform on AWS、Claude apps gateway | default |
| Pro / Max / Team,终端或 VS Code 扩展 | auto |
| Enterprise 套餐或 Claude Console API key | default |
这个内置 auto 默认需要 v2.1.228+(macOS / Linux / WSL),原生 Windows 需要 v2.1.233+。第一次以 auto 启动会提示一次;如果你的 ~/.claude/settings.json 已经设了别的 defaultMode,会话仍按你的设置启动,Claude Code 会问一次要不要改成 auto,拒绝就保持原样。
最常见的坑:把 "defaultMode": "auto" 写进项目的 .claude/settings.json 或 settings.local.json——这两个文件里的 auto 和 bypassPermissions 都不生效,会话会退回内置默认。要设 auto,放到 ~/.claude/settings.json。 VS Code 扩展另有一套顺序:claudeCode.initialPermissionMode(不接受 auto)→ 你上次在模式指示器里选的 Manual / Edit automatically / Auto → Pro / Max / Team 下的 managed 或用户级 defaultMode → 内置默认;它从不读项目级设置。
会话中 Shift+Tab 循环切换:从 auto 按一下先到 default,然后 default → acceptEdits → plan → 回到 default,auto 排在可选模式的最后。 v2.1.247 起,Manual / acceptEdits 下 Bash 命令的权限框会多一项「Yes, and switch to auto mode」,批准这条命令的同时把会话切到 auto;由 ask 规则或 hook 强制的弹窗不给这个选项,因为切了也照样弹。
分类器怎么审:固定的四步顺序
- 命中你的 allow / ask / deny 规则的动作立即按规则处理。例外:对受保护路径的写入即使命中 allow 也送分类器;v2.1.218 起关键路径的 rm 同样如此;按命令内容匹配的 ask 规则如
Bash(git push *)退回弹窗。 - 只读动作和工作目录内的文件编辑直接放行——受保护路径的写入,以及第一次读工作目录之外的文件(会问你一次「要不要继续允许」)除外。
- 其余全部送分类器。
- 分类器拦下时 Claude 收到原因并换一种做法。v2.1.208 起大多数会话里原因就是固定文本「Blocked by classifier」,不是一段解释。
进入 auto 模式时,授予任意代码执行的宽泛 allow 规则会被临时丢弃:Bash(*)、PowerShell(*)、Bash(python*) 这类通配解释器、包管理器的 run 命令、Agent 与 Monitor 的 allow; 像 Bash(npm test) 这样窄的规则保留,离开 auto 时恢复。想让每条 shell 命令都过分类器而不是被窄规则直接放行,设 autoMode.classifyAllShell: true(v2.1.193+),代价是延迟和分类器调用次数。
分类器看得到:你的消息、除只读查找之外的工具调用、CLAUDE.md。看不到:工具结果——所以文件或网页里的恶意内容不能直接操纵它;你可以用 PostToolUse hook 的 classifierContext 字段给某次结果加注。 另有一道服务端探针在 Claude 读到工具结果之前扫描可疑内容。执行 git reset --hard、rm -rf 这类会丢未提交工作的命令之前,Claude Code 会自己先跑一次 git status 把有没有未提交改动告诉分类器。
子智能体在三个点被检查:派出前审任务描述(v2.1.178+)、运行中每个动作按同样规则审(frontmatter 里的 permissionMode 被忽略)、结束时复核完整动作历史,有疑虑就在结果前面加安全警告。
分类器默认跑在 Claude Sonnet 5 上,与你的 /model 无关;会话模型是 Sonnet 4.6 或组织白名单排除了 Sonnet 5 时改用会话模型,会话跑 Fable 时改用 Opus。 auto mode 本身要求会话模型是 Opus 4.6+、Sonnet 4.6+ 或 Fable(Anthropic API 与 Claude Platform on AWS);Bedrock / Agent Platform / Foundry 上只支持 Sonnet 5、Opus 4.7+ 和 Fable。Sonnet 4.5、Opus 4.5、Haiku 在任何平台都不支持。
默认拦什么、放什么
分类器默认只信任工作目录和会话开始时配好的 remote(会话中 git remote add / set-url 加的不算),其他一切视为外部。完整清单用 claude auto-mode defaults 打印成 JSON,下面是精选。
默认拦
- 下载即执行(
curl | bash)、向外部端点发送敏感数据、生产部署与迁移、云存储批量删除、授予 IAM 或仓库权限、修改共享基础设施、不可逆销毁会话前就存在的文件、force push。 - 提交或推送会把密钥送出仓库的改动(CI 工作流把 secret 交给新目的地、脚本读密钥库外发、放宽 deploy 发布范围的配置),任何分支、公开仓库也一样(v2.1.211 起;之前只管默认分支)。
git reset --hard、git checkout -- .、git restore .、git clean -fd、git stash drop / clear;对不是本会话创建、或已推送的提交做--amend(只改 message 的 reword 除外);terraform / pulumi / cdk / terragrunt destroy。- v2.1.195 起新增:写密钥管理器、改 DNS 或 TLS 证书;合并无人批准的 PR、批准 Claude 自己的 PR、关闭 CI 检查;发本身就是自动化指令的评论(
atlantis apply、bot 的 /deploy /merge);切换或删除生产 feature flag;对受保护 IaC 范围 apply;打开隧道或反向 shell、把凭证明文打进对话或文件;绕过内部包源直连公共源;带--insecure一类解除防护的参数;启动不受监督的自主智能体循环(--dangerously-skip-permissions、--no-sandbox);Claude in Chrome 可能把页面内容或 cookie 发到站外的动作。 - v2.1.198–2.1.205 陆续新增:按通配符或时间批量删 /tmp;PR、issue、commit message 里夹带内部路径、代号、API 返回的个人数据;操纵 Claude Code 自己的 tmux 窗格;注释掉或强制通过守护安全行为的测试;删除不是本会话创建的有状态资源;把 API base URL、代理、webhook、镜像指向不相干的第三方;
git remote set-url / add;向已知公开仓库推密钥或个人数据;向别的仓库或组织开 PR、fork、推送;把 SSH key、云凭证、浏览器配置、shell 历史、会话转录这类敏感本地内容带进提交或 PR;写入~/.claude/projects/下的会话转录;目标是未在对话里赋值的变量的rm -rf "$VAR"。 - v2.1.257 起新增:向云实例元数据端点(169.254.169.254)要凭证、用节点身份认证;用隧道 / 反向 shell / 改写解析器绕路访问公网;读取属于宿主机而非任务的凭证;连接或扫描相邻容器、Pod、虚拟机或底层节点。在确实允许这些的环境里,用 environment 的 Host containment 条目描述清楚。
默认放
- 工作目录内的本地文件操作;安装 lock 文件或 manifest 里声明的依赖;读
.env并把凭证发给对应的 API;只读 HTTP 请求。 - 推送到当前仓库的任何分支,包括默认分支(v2.1.211 起;名字像部署目标的分支如
production、gh-pages除外,推送内容仍按其他规则检查,deny 规则和远端分支保护照常生效);创建与你请求相符的 PR。 - v2.1.195 起:删除本会话里 Claude 自己创建的任务;作为任务一部分读写安全相关代码、配置和威胁模型;同一多智能体会话内的消息;向 environment 里列出的可信域名、桶、服务发数据(只覆盖数据流,不覆盖破坏性或凭证操作);Chrome 导航到可信内网域名、localhost 或你点名的 URL。
沙箱的网络访问请求也走分类器而不是默认放行,判定会缓存:一次 allow 沿用到有新内容进入对话为止;一次评估得出的 deny 在交互式命令行里管一轮,在 -p 和 SDK 会话里管整次运行;改权限模式或规则会清掉所有缓存判定(v2.1.198+)。
划边界:三种手段,可靠程度不同
| 你要的 | 手段 | auto 模式下的行为 |
|---|---|---|
| 动作前弹窗 | permissions.ask | 按内容匹配的 ask 规则一定弹窗,分类器不能替你批准 |
| 绝不执行 | permissions.deny | 在分类器之前就拦,分类器与用户意图都越不过 |
| 本次会话临时边界 | 对话里说「先别推,等我 review」 | 分类器把它当拦截信号,直到你在后面的消息里解除;但边界不存成规则,上下文压缩把那句话压掉就丢了 |
auto 默认允许推到当前仓库任何分支和开 PR,想在这两步前留人工检查点,加两条 ask 规则即可,其余照常自动:
{
"permissions": {
"ask": [
"Bash(git push *)",
"Bash(gh pr create *)"
]
}
}被拦了怎么办
- 被拦的动作会有一条通知,并记进
/permissions的 Recently denied 标签,按r标记重试,退出对话框后 Claude Code 告诉模型可以重试并继续。输入框旁的提示(如bash denied by auto mode · Blocked by classifier · /permissions)不带命令原文,被折叠的调用按Ctrl+O在转录视图里展开看;要程序化抓取被拦输入,用PermissionDeniedhook。 - 连续 3 次或累计 20 次被拦,auto mode 暂停、Claude Code 恢复弹窗;你批准那个动作就恢复 auto。阈值不可配置。任何一次放行重置连续计数,累计计数整个会话持续。
-p运行没有--permission-prompt-tool时无处可退:到达阈值的动作不执行,Claude 继续干别的,运行不会停。- 看到「auto mode cannot determine the safety of an action」并点名一个模型,意思是分类器自己的请求失败了(通常是暂时的;Bedrock 上可能持续到你的账号能调用那个模型为止),这种拒绝不计入阈值,也不进 Recently denied。
- 按被拦动作要去的地方选修法:整个任务都要用的目的地(包源、内网域名、仓库主机)→ 加进
autoMode.environment;以后都不想审的命令 → 加 allow 规则;确实想做的一次性动作 → 下一条消息里明说意图让 Claude 重试。同一目的地反复被拦,基本就是分类器缺基础设施上下文。
告诉分类器你的基础设施
对大多数团队,autoMode.environment 是唯一需要设的字段。条目是自然语言而不是正则,像给新同事介绍基础设施那样写;数组里放一个字面量 "$defaults" 就能把内置条目拼在那个位置,你的条目可前可后:
{
"autoMode": {
"environment": [
"$defaults",
"Source control: github.example.com/acme-corp and all repos under it",
"Trusted cloud buckets: s3://acme-build-artifacts, gs://acme-ml-datasets",
"Trusted internal domains: *.corp.example.com, api.internal.example.com",
"Key internal services: Jenkins at ci.example.com, Artifactory at artifacts.example.com"
]
}
}- 读取范围:只读
~/.claude/settings.json、managed settings 和--settings/ SDK 内联 JSON;不读项目级.claude/settings.json与settings.local.json——它们在仓库目录里,签入的仓库或构建步骤可以塞自己的放行规则(v2.1.207 之前还读 local 文件,请把里面的 autoMode 挪到用户级)。各作用域条目相加,开发者可以扩展但不能删掉 managed 提供的条目。 - 三类槽位:Context(组织、主要用途、云厂商、仓库可见性、密钥管理、CI 部署目标、Host containment……)、Trust(可信仓库、源码托管、内网域名、云桶、关键内部服务、内部包源,除仓库和 remote 外全部默认 None configured)、Sensitivity(敏感数据位置与受众、敏感远端目标、受保护 IaC 范围,默认用启发式如名字含 prod 即敏感,写了具体目标就按目标来)。
- /auto-mode-setup(Pro / Max / Team,v2.1.228+,云端会话不可用):读项目的 CLAUDE.md、README、配置、git remote、你的 autoMode 与 allow 设置、最近会话里跑过的命令的主机和命令名(不读你的消息),可选再扫 shell 历史首词和 home 下仓库的 remote,起草后整体接受或丢弃,写进
~/.claude/settings.json。被拦几次又没有 environment 时,回合末会弹「Teach auto mode about your environment?」主动提议。 - 四层规则优先级:
hard_deny无条件拦(意图与 allow 都无效)→soft_deny拦但可被意图或 allow 覆盖 →allow作为 soft_deny 的例外 → 用户明确、具体地描述了这个动作则放行(「清理一下仓库」不算,「force-push 这个分支」算)。 - 危险:这四个数组任何一个不写
"$defaults"就整段替换内置列表——soft_deny 会丢掉 force push、curl | bash、生产部署等全部内置规则,hard_deny 会丢掉内置的数据外泄规则。要接管就先claude auto-mode defaults打出来逐条评估。 - 工具:
claude auto-mode config打印实际生效的合并结果;claude auto-mode critique让 AI 点评你的自定义规则是否含糊、冗余或易误报;claude auto-mode reset(v2.1.212+)清掉用户级 autoMode;v2.1.246 起/permissions多了 Auto mode 标签,可以不开文件直接增删规则和编辑 environment。
和 plan 模式、沙箱、受保护路径的关系
- plan 模式:auto 可用且
useAutoModeDuringPlan(默认开)时,探索阶段的 shell 命令由分类器审而不是弹窗;否则只读命令集之外的都要问。有 bypass 的会话里 plan 模式的限制不强制。 - 沙箱:权限模式管「要不要问」,沙箱管「跑起来能碰什么」,两者独立且可叠加;想少弹窗又不想用分类器,官方给的组合是 Manual + 沙箱 auto-allow。plan 模式下 auto-allow 不放宽审批。
- 受保护路径(
.git、.claude、.vscode、shell rc 文件、.npmrc、.mcp.json等):auto 下写入送分类器,Manual / acceptEdits 弹窗,dontAsk 拒绝,只有 bypass 直接放行;settings 里的 allow 规则不能预批这些写入。--restricted(v2.1.248+)会话里分类器也批不了。 - 关键路径的 rm:auto 下送分类器,其他模式问你或拒绝;藏在
$(...)里也躲不过。
组织怎么管
Team / Enterprise 默认可用 auto;管理员在 managed settings 里把 permissions.disableAutoMode 设为 "disable" 就把它从 Shift+Tab 循环里拿掉,--permission-mode auto 启动会退回 Manual,正在 auto 的会话也会在设置到达时退出并显示「auto mode disabled by settings」(v2.1.251 起)。 只想改默认但允许员工自己切,就在 managed settings 里设 permissions.defaultMode。 Bedrock、Agent Platform、Foundry 上 auto 在循环里但不是默认,要作为默认需在用户级或 managed 设置里写 "defaultMode": "auto"。 对必须永远禁止的动作,别依赖分类器配置,用 managed settings 的 permissions.deny——它在分类器之前生效且不可覆盖。