Claude Code v2.1.311 免批准变量:6 种权限模式与拦截差异

一句话结论:Anthropic 在 Claude Code v2.1.311 里塞进了一个名为 CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS 的环境变量,它把智能体删除文件前最后一道人工确认彻底拆掉,同时也把谁来为误删负责这个问题的责任边界推到了开发者自己身上。

10 月 28 日,科技媒体 The Register 报道了 Anthropic 工程师 Daisy Hollman 在社交平台上的一段说明。她先纠正了一个流传很广的误解。Claude Code 那个命令行选项 –dangerously-skip-permissions 名字虽然吓人,但并没有放行一切,系统底层仍然会拦截部分一眼就能看出危险性的指令,典型的例子是递归强删用户主目录的 rm -rf ~。紧接着她补充了一句,同一天发布的版本允许你把这一层拦截也关掉,方式是设置一个环境变量,名字写得毫不掩饰,CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS=1。

变量名太直白,加上这项变更没有出现在 v2.1.311 的官方更新日志里,一度有人怀疑是假消息。Hollman 的回应是两个字加一句自嘲:不是玩笑,并补充希望这个变量名好记。

v2.1.311 这次到底改了什么

先把这个版本的时间线摆清楚。Claude Code v2.1.311 的发布时间是 2026 年 10 月 26 日,v2.1.312 紧随其后一天。Anthropic 的 GitHub release 页面把 v2.1.311 的变更列成三条,给 self-hosted-runner 增加 –hold-idle-file 与 –max-hold-min 两个参数,让宿主可以把空闲会话保持在运行状态;给 Explanatory 输出风格补上一条提示;以及修复启动阶段和若干环节的长时间卡死。

关于免批准环境变量的说明,确实没有出现在这个清单里。这解释了为什么它一时没被大多数用户发现,也解释了为什么它在被曝光后需要工程师本人下场确认。

从功能角度看,这个变量做的事情非常单一。让智能体执行 rm、rmdir 这类删除操作时不再逐次弹出确认框,并且允许关闭那条针对 rm -rf ~ 之类的兜底拦截。除此之外,Claude Code 的其它安全机制照旧运转,包括组织通过托管设置下发的策略,管理员施加的限制依然有效。换句话说,这不是一个默认开启的放宽,而是需要开发者自己在 shell 里主动声明的表态。

六种权限模式:每一级各拿走一个人工检查点

要理解这个变量的位置,得先看清 Claude Code 的权限分层。官方文档把权限模式列成一张表,CLI、VS Code 与 JetBrains 插件、桌面端在命名上略有差异,核心差别在于谁来批准这一列。

模式 谁做判定 典型行为
default / Manual 人工 读取与检索在工作目录内免打扰,执行 Bash 命令、编辑文件等动作先问一次
acceptEdits 人工 文件编辑自动放行,一组固定的 Bash 命令免批,其余仍然提示
plan 人工 只规划不落盘,产出方案供人确认后再执行
auto 独立分类器模型 由另一个模型审查动作并拦下它认为不安全的操作,人工规则继续叠加
dontAsk 配置决定 不弹窗,未被规则覆盖的动作直接不执行
bypassPermissions 不判定 名义上放行一切,且不做后台安全检查

–dangerously-skip-permissions 对应的是 bypassPermissions 模式,这个模式最早出现在 Claude Code v1.0.18,日期是 2025 年 6 月 9 日。auto 模式则在 2025 年 8 月成为交互式终端与 VS Code 会话的默认起始模式,它名义上也是放行一切的,但多了一层后台安全检查兜底。

这就是为什么 Hollman 要专门澄清。开发者以为 –dangerously-skip-permissions 已经是终极形态,实际上它里面还保留着几道人工闸门,rm 与 rmdir 的提示就是其中一道。新变量把最后这一道也拆掉,权限阶梯到此触底。

三层拦截对照表:这个变量到底拿走了什么

把官方文档的行为描述与 Hollman 的说明对齐,可以整理出下面这张对照表。三个维度分别是普通动作是否弹窗、删除类动作是否弹窗、以及针对 rm -rf ~ 这类明显危险指令的兜底拦截。

配置状态 普通动作 rm / rmdir rm -rf ~ 类兜底
默认权限流 按常规流程询问 询问 被拦截
–dangerously-skip-permissions 跳过询问 仍然询问 仍然被拦截
–dangerously-skip-permissions 加新环境变量 跳过询问 不再询问 拦截可以被关闭

这三点之外还有一条经常被忽略的边界。即便开了新变量,组织托管设置仍然有效。Anthropic 允许管理员在 claude.ai 控制台向全组织下发托管设置,这类设置只有服务端能读取,无法通过本地环境变量绕过。也就是说,真正需要担心的场景是个人开发机上跑无人值守任务,而不是公司统一管控的终端。

官方权限规则体系:规则怎么被求值

理解放权风险的前提,是知道 Claude Code 剩下那些拦截是怎么工作的。官方文档给出三条硬规则。

第一,规则的求值顺序固定为 deny、ask、allow,先命中先决定,与规则的精细程度无关。一条 deny 规则会封住所有匹配调用,哪怕同时存在一条更窄的 allow 规则,allow 也无法在 deny 里挖例外。第二,四类设置文件按优先级叠加,组织托管设置压过一切,命令行参数只影响单次会话,项目级 .claude/settings.json 覆盖本地 .claude/settings.local.json,用户级 ~/.claude/settings.json 垫底。第三,某些权限类配置项可以写进仓库提交给团队共享,而环境变量这一类必须写在项目本地配置里,不要入库。

官方文档同时明确了 Bash 类规则的边界。写成 Bash(npm run build) 时只匹配这一条精确命令,不匹配 npm run build –watch;写成 Bash(npm run *) 才会匹配 npm run build 和 npm run test –watch 这类前缀命令,但并不覆盖 npm install。deny 侧的匹配更严格,Bash(curl *) 能拦住 curl https://example.com,却拦不住 /usr/bin/curl https://example.com 与 sh -c 里的 curl。

这套机制的存在提醒了一件事,拦截从来不是靠一个总开关兜底,而是靠一层层细粒度规则堆出来的。新环境变量关掉的是最后那层针对删除动作的兜底,前面那些人为配置的 allow 与 deny 规则照旧生效。真正需要人为兜底的部分,恰恰是没有任何人认真配置过规则的环境。

放权之后:审批疲劳与 rm 事故的两种典型成因

一个容易被忽略的背景是,开发者要求少弹窗并不是出于冲动。让智能体跑一次跨几小时的批量重构,提示框会在第三分钟出现一次、第四十分钟再一次,而人往往根本不在键盘前。审批疲劳本身会推动用户去选一键全放,而一个仍会在 rm 上停下来的放行模式,对无人值守流水线来说等于没用。构建脚本清理目录、测试后复位生成文件,这类动作天然依赖删除操作,Claude Code 这一版变量针对的正是这条需求。

风险也在同一处。真正造成数据损失的原因通常不是模型产生敌意,而是模型误读了任务范围却以机器速度执行。让智能体在宽泛的工作区里清理旧配置文件,它挑中的集合可能和人想的不是一份。有提示框的时候,人至少能看见那份清单;没有提示框的时候,人只能看见后果。已有多起智能体执行 rm -rf ~ 导致数据丢失的公开记录,但因为没有统一的统计口径与事件登记,具体频率无法核实,任何精确到数字的说法都缺乏依据。

变量名里那个 EVEN MORE 并没有夸张。skip-permissions 阶段交出的是常规审批,这个变量交出的是删除类动作的最后一道拦截。差别体现在版本上是几天,体现在后果上是不可撤销。

怎么用才不至于翻车

如果确实需要无人值守的删除动作,把变量放在一个一次性容器或干净的沙箱里,而不是日常笔记本的工作目录。有版本控制和可重置快照的环境,一次误删的恢复成本是秒级;一个未推送的项目加上一堆密钥的家目录,恢复成本无法估量。

其次,把环境变量限定在需要它的那个 shell 会话里,不要写进 shell 的全局配置。它默认不开启、需要主动设置,这个设计本身就是一道提醒,写进全局配置相当于把一次性的实验变成长期状态。

第三步是补回规则层。既然默认拦截被关了,就该自己写清楚边界。官方文档的 deny 优先级最高,先把 .env、密钥目录、生产配置目录写进 deny,再在 allow 里逐条列出需要免批的构建与清理命令。相比于整目录放行,这种写法在误操作时的损失要小得多。

第四点是别把 Claude Code 直接指向家目录启动。官方文档提到,在家目录直接启动 Claude Code 时,工作目录信任确认只对当前会话有效,不会写盘,下次启动提示还会再出现,这条设计在放开权限的场景里恰好提供了一层额外的心理提示。

相关阅读

常见问题

CLAUDE_CODE_EVEN_MORE_DANGEROUSLY_SKIP_PERMISSIONS 是 v2.1.311 新增的吗

是。Daisy Hollman 在 10 月 28 日的说明里明确指向当天的版本发布。该变更没有写进 GitHub release 页面列出的 v2.1.311 更新日志条目,需要通过社交平台公告才能确认。

它和 –dangerously-skip-permissions 有什么区别

后者跳过的只是常规审批,删除类动作仍会逐次询问,明显危险的指令仍会被底层拦截。前者在此基础上把删除类动作的最后一道拦截也拆掉,等于触到了权限阶梯的底部。

开启之后组织的安全策略还会生效吗

会。通过 claude.ai 控制台下发的托管设置只有服务端能读取,本地环境变量无法绕过,组织管理员施加的限制继续起作用。变量需要开发者主动设置,默认不开启。

小结

Claude Code v2.1.311 把一个此前被广泛误解的选项补成了真正的完全体。–dangerously-skip-permissions 从 2025 年 6 月的 v1.0.18 起就在,但它一直保留着删除类动作的提示与 rm -rf ~ 的兜底拦截,一层一层往上垒的安全设计到这次被拆到了底。Anthropic 选择用近乎玩笑的变量名来发布它,态度也很明确,能力给到,是否使用由开发者自己判断。

对要把智能体放进无人值守流水线的团队,这个变量解决的是真实痛点,构建与清理环节的反复弹窗确实会打断自动化。对在日常开发机上工作的人,开关的成本要重新算一遍,代价不是一次误删,而是主目录、项目文件与密钥同时暴露在一次误读的范围里。把变量关进一次性容器,用 deny 规则守住边界,再考虑要不要打开,这是更稳妥的顺序。