周五,Claude Code 不再向你请求许可。随之而来的那个数字很扎心。

周五,Claude Code 不再征求你的许可。与之相伴的数字很扎心。


8月14日,也就是两天后,自动模式将成为Claude Code Pro、Max 和 Team 套餐的默认设置。说白了,不会再弹出小窗口问你是否允许执行某条命令。工具自己决定并执行。

我的第一反应大概和你一样。啊?把按钮拿走了?

然后我读到了 Anthropic 在公告里公布的数字。我马上就没那么得意了。

一名疲惫的员工闭着眼睛,把一大堆授权请求逐一盖章,而一张纸在堆中间燃烧,他却完全没有看到

在这堆东西里的某个地方,有一条会把一切抹掉的命令。他说了是。

你每100次会点97次是

97%。这就是用户批准的授权请求比例。不是60%。不是80%。是百分之九十七。

换句话说,这个所谓的安全护栏已经管不了什么了。它就是多加了一步的“下一步”按钮。

Anthropic 对1,053名有偿测试者进行了研究。两组人收到的是同一套危险操作。结果是,人工确认拦下了143个。自动模式拦下了937个。

柱状图:重新检查的人工操作拦下了13.6%的危险操作,自动模式拦下了89%

蓝色那根柱子就是我们。就当这是一天快结束了吧。

而且这不只是在实验室里成立。在5月和6月的真实会话中,手动确认的会话有6.3%出现了严重且非预期的损害,而自动模式下是2.4%。超过两倍,而且不是朝着好的方向。

这个问题早就为人所知。它叫作确认疲劳。这就是你面对 Cookie 横幅、使用条款和手机授权请求时的感觉。第三个请求之后,你的大脑就不再阅读了。你的手却还在继续点击。

好吧,那现在它到底会拦截什么?

自动模式并没有取消控制。它只是换了控制者。每个操作都会先交给 Anthropic 所称的分类器。那是另一个实例,它会检查工具准备做什么,然后决定是否允许。它的要求很简单:拦截不可逆、有破坏性或指向你环境外部的操作。

一个保安机器人放行了一个拿着文件夹和扳手的小机器人,却拦住了另一个扛着电锯、汽油桶和上锁手提箱的机器人

保安不看你的代码。他看你带着什么。

具体来说,有些操作无一例外地仍然被禁止,比如把代码或机密发送到外部。这条规则既不能通过选项解除,也不能靠纠缠来解除。其他操作仍然会被拦截,除非你明确提出要求。比如 force push,它会强行重写 Git 历史记录,删除远程分支或标签,重写历史记录,那个著名的 curl | bash,以及部署到生产环境。

围绕“明确”这个词的细微差别挺漂亮。它甚至出现在文档里。让 Claude “清理仓库”并不代表允许它执行 force push。让它“force-push 这个分支”,就可以。一条模糊的请求不等于同意。这也是一条不错的人生准则。

另一个设计得很周到的细节是,分类器默认只信任你的工作目录和已经配置好的远程仓库。你的企业 bucket、内部 GitLab 或私有软件包仓库?根本没在名单里。因此它们都会被视为外部来源,在你声明它们之前一直处于阻止状态。

没人会去读的那个坑

确实有一个。还很阴险。

自动模式开启时,你的通用授权规则,比如允许终端里执行一切操作的那条,会被放到一边。这很合理,因为它们会绕过分类器。相反,更具体的规则,也就是允许某条特定命令的规则,仍然拥有优先权。问题在于,具体规则授权的是命令前缀,而不是命令结果。如果命令接收到规则没有预料到的危险参数,它就会直接通过,不会受到检查。

一个巨大的检查闸门前排着队,旁边却有一扇敞开的小服务门,一个机器人正悠闲地拿着一根炸药棒从那里通过

花了这么多安全预算,服务门却还开着。

解决办法是在你的个人设置文件里加上一行配置:

{
  "autoMode": {
    "classifyAllShell": true
  }
}

这个设置会强制所有终端命令都经过分类器,包括那些已经获得授权的命令。你每执行一条命令都要多花一点时间,因为得等它做出决定。我个人更喜欢这样。

第二点,这一点值得鼓掌。分类器不会读取放在项目目录里的设置。它只会查看你账户里的设置,以及由你的企业部署的设置。文档里把原因写得清清楚楚。否则,一个克隆下来的仓库或一个简单的编译步骤就可以添加自己的授权规则,自己给自己亮绿灯。Anthropic 有人考虑到了恶意仓库的问题。让人挺开心。

如何用四种办法掌握主动权

如果你想在每次发送代码之前都进行人工确认,可以让一条规则优先于分类器,并且每次都显示请求。把下面这段加到你的设置里:

{
  "permissions": {
    "ask": [
      "Bash(git push *)",
      "Bash(gh pr create *)"
    ]
  }
}

我就是这么用的。其余操作都在自动模式下运行。唯一能让我警醒的,是我的工作离开我这台机器的那一刻。

如果要中途切换模式,终端里的 Shift+Tab 会循环切换各种模式。要查看分类器在你的环境中实际应用的规则,可以使用这条命令。它比看起来有用得多:

claude auto-mode config

它会显示实际应用的规则,也就是把你的规则和原始规则合并之后的结果。你也可以使用 claude auto-mode defaults 查看内置规则,还可以使用 claude auto-mode reset,在你折腾过头之后把一切恢复原状。

注意,因为这个错误可能会让你付出高昂代价。如果你写自己的规则列表,却没有保留 "$defaults" 这一项,你就会替换掉原来的整个列表。这其中包括阻止数据外泄的规则。你以为自己要添加一行。结果刚刚删掉了三十行。

最后一个有用的反射动作是,当某个操作被拒绝时,输入 /permissions,然后查看最近拒绝的选项卡。你可以指出某个操作应该重试。总比因为认定门卫太蠢而把一切都禁用掉好。

然后还有更上面的一层,那就是我还没提过、需要你自己编写的东西:hooks。

hook 就是一小段脚本,Claude Code 会在使用工具之前运行它。它会先于授权规则,先于分类器,先于其他一切执行。自动模式不会禁用它。文档明确说明,hook 会在输入数据中收到当前模式,包括 "auto"。我们不会把参数传给一个根本不执行的东西。

区别很简单。分类器是负责做出决定的模型。它读取意图,在几百毫秒内分析上下文,也可能犯错。而 hook 什么都不判断。十五行代码查看文件路径,然后回答不行。没有意见,没有细微差别,也不会疲倦。还不会花掉一个 token。

我这里有两个。正是你想象的那两个。第一个会阻止读取任何 .env 文件、.pgpass 文件、SSH 密钥或凭据文件的操作。不管是什么模式,也不管是什么理由,就算是我客客气气地提出请求也不行。第二个会在每次 git push 之前要求我的同意。一次授权永远不会对下一次尝试生效。而且这确实有用。写这篇文章时,我想重新阅读一个放在错误位置的文档文件。结果我自己的脚本把我赶走了。烦了三秒钟,然后反倒挺高兴。

在设置里,只需要几行:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Read|Edit|Write",
        "hooks": [
          { "type": "command", "command": "~/.claude/hooks/block-secrets.sh" }
        ]
      }
    ]
  }
}

脚本以退出代码 2 结束,所以工具不会启动。如果只能记住一句话,就是这一句:当你已经知道什么事情绝对不能发生时,就别去征求模型的意见。写三行脚本。

如果你不写代码,这也和你有关

这个 97% 的数字不只和开发者有关。它也和你有关。

你有多少次没读使用条款就接受了?为了让 cookie 横幅消失而点击“全部接受”?因为某个应用拒绝以其他方式打开,就给了它访问你的照片、位置和联系人的权限?你做的事情和这些开发者一模一样。你点击了确认,只为了能够继续。

真正值得吸取的教训是,那个复选框从来没有真正保护过你。它主要是用来转移责任的。如果出了问题,总有人可以说是你接受了。一种放过十个危险中的九个的保护,不算保护。这是一把法律保护伞。

所以,当机器比我们机械地点一下做得更好时,就得承认这一点。就算这多少有点刺痛。

我的看法

数字很顽固,我相信它们。Claude Code 的负责人 Boris Cherny 声称,他和他的团队已经连续几个月只使用自动模式。老实说,我也已经在用了。

让我感到不舒服的,不是自动模式。而是“默认”这个词。

只要是我做选择,我就承担责任。当这个设置对所有人启用,问题不再需要考虑时,责任就变得模糊了。如果出了什么问题,我们最后总会听到“这是出厂设置”。话虽如此,如果你已经选择了自己的模式,它就会保持不变。只会问你一次是否要切换。

周五,我会看看结果如何。我会保留我关于代码发送的规则。这项研究或许说服了我,但还没到让我不抬头就把自己的工作发出去的程度。

Join the conversation

You need an account to comment on this article. Creating one is free and takes under a minute.

  • The XMLTV file, free to download every day
  • Comment on articles and reply to other readers
  • Get an e-mail when an article you follow is updated

No comments yet.

Une erreur s'est produite. Cette application peut ne plus répondre jusqu'à ce qu'elle soit rechargée.Veuillez contacter l'auteur. Reload 🗙