让 AI 半夜替自己干活,是很多人的梦想,但真正敢睡着的没几个。老金这篇把两篇截然相反的实践放在一起读——一个人拼命放权、一个人拼命收权——然后给出了一把统一的尺子。我觉得这是目前中文圈把"无人值守 AI"讲得最清楚的一篇:问题从来不是怎么跑起来,而是你敢不敢去睡。
一、同一道题的两个相反答案
一篇是个人博客:作者翻出一台闲置 Mac,抹盘,建一个不登 Apple ID 的干净账号,打开 SSH,配好免密 sudo,装上 Claude Code,所有会话统一带 --dangerously-skip-permissions 跑。他管这台机器叫 the box。另一篇是国内独立开发者的实测:把 Claude 挂进 GitHub Actions 审 PR,做法完全相反——工具收成白名单,只给 Read、Grep、Glob,连 Edit 都不给;容器 --network none 直接断网;单次预算 --max-budget-usd 0.50 兜底。一个人在拼命放权,一个人在拼命收权,可他们想干的事一模一样:让 Claude 在自己睡觉的时候干活。
技术门槛其实只有一行:claude -p "分析 src/ 目录的安全漏洞"(-p 是 --print 的短写,跑完直接退出,不进交互式)。真正的门槛在下一句:你敢去睡吗?想清楚这件事,得先想清楚交互式模式在干什么——你每次按下的那个回车都是一次授权判断:要不要动这个文件、跑这条命令、装这个包,全靠你那一下。这个权限系统长在你手上,所以你从来没意识到它存在。无人值守就是把回车键拿掉,拿掉之后那个位置不能空着,得有别的东西补上。补的方式只有两种:换一台机器,或者换一套参数。
二、路线一:换一台没什么可失去的机器
第一篇文章的思路很干脆——不去限制 agent 能干什么,而是让它干什么都不要紧。作者原话:"在一台没什么可失去的机器上运行拥有广泛权限的代理更安全。"

他明确拒绝了容器方案,理由两条:容器仍跑在宿主机上,网络请求还是从你的 IP 出去;容器里跑不了 macOS 独有的东西——他想让 agent 开 Unity 做游戏开发、点击拖拽真实 App 界面,容器给不了。关键动作按顺序:抹盘 → 建不登 Apple ID 的本地管理员账号 → 开 SSH → 写 /etc/sudoers.d/ 免密 sudo → ssh-copy-id 配免密登录 → 装 Claude Code。
真正值钱的是几个自己摸绝对要栽的坑:它会睡过去——macOS 插着电闲置十分钟也照样睡,一睡就断网,半夜派的活直接停住,三条 pmset 命令按住(插电永不睡眠、合盖不睡、显示器常开);PATH 要写 .zshenv 不是 .zshrc——非交互式 ssh 走的会话不读 .zshrc;被授权的是 tmux,不是 claude——这条最反直觉,macOS 把屏幕录制和辅助功能权限绑在 GUI 登录会话上,SSH 进程摸不到显示器,办法是让 LaunchAgent 在 GUI 会话里维持一个固定 socket 的 tmux 服务器,claude 作为子进程继承会话,而捕获权限归给链条上的"负责进程"——所以系统设置里要给 /opt/homebrew/bin/tmux 授权,不是给 claude,授完还得重启 tmux 服务器。另外两条保险:GitHub 登小号;出口 IP 用 VPN 分开。配完之后有两个很馋人的用法:clip send/clip get 让剪贴板在两台机器间端到端同步(图片也能传,不过第三方服务);更狠的是所有会话挂同一个 tmux socket,主力机上的 Claude 可以直接 send-keys 给盒子上的 Claude 派活、再 capture-pane 读回复——agent 对 agent。
三、路线二:机器动不了,那就收权限
第二篇的处境不同:在 GitHub Actions 的 runner 上有他的仓库、secrets、合并权限——机器换不掉。所以他反过来,把交互式里"人按回车"的隐式约定全部显式化成参数:--output-format json 给机器解析、stream-json 一行一事件实时盯长任务;--max-turns 5 加 --max-budget-usd 0.50 做成本护栏;--allowedTools "Read,Grep,Glob" 只读最安全,细粒度白名单可以写成 Bash(git log *) 这样只放行特定命令。--allowedTools 是整条路线的地基:审查任务本来不需要写文件,那就一个写权限都别给——提示词它可以不听,工具不给它就是真的没有,这比任何"请不要修改代码"的提示词都硬。

还有几笔账值得抄走:concurrency 必配(同一个 PR 连推三个 commit 不配就是三份账单);分级跑(阶段一 Haiku 查格式,过了阶段二才上 Sonnet 做安全扫描,单条 PR 审查成本从 0.15 美元压到约 0.06 美元);CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 关掉自动更新和遥测;--fallback-model 让主模型 429 时自动切便宜档,管道不至于挂在过载上。
四、两条路,一把尺子
| 维度 | 换机器 | 收权限 |
|---|---|---|
| 手段 | 隔离宿主 | 白名单工具权限 |
| 姿态 | 全开(skip-permissions) | 最小(连 Edit 都不给) |
| 前期成本 | 一台闲置 Mac + 半天配置 | 十几行 YAML |
| 边际成本 | 几乎为零(吃订阅额度) | 按次计费,需预算护栏 |
| 适合 | 探索性、要装东西、要点 GUI 的活 | 结论明确、可重复、要卡门禁的活 |
| 失败长什么样 | 盒子被搞坏,重装 | 报告不准,人工复核 |
两条路用的是同一个公式:爆炸半径 = 这台机器上你丢不起的东西 × agent 能碰到它的概率。换机器把第一项清零,所以敢完全不管第二项;收权限第一项动不了,只能死磕第二项。最危险的状态自己浮出来了:两项都拉满——在你自己的主力机上开 --dangerously-skip-permissions。那台机器上有你的 SSH 私钥、云控制台登录态、生产库连接串、没提交的代码、家人的照片。这是现在绝大多数人的状态,包括老金自己。

五、无人值守真正的账,记在别处
无人值守把"验证器"从最好有变成必须有:你不在场,就没有"中途叫停"这个选项,只剩事前限权和事后验证两道。第二篇里的 Gate 就在做事后那道——评审结果出现 critical 就让 CI 挂掉、真的拦住 merge,方向完全对;不过 grep -qi critical 的实现挺脆,Claude 换个措辞写"严重问题"就漏了,真要用应让它输出结构化的 severity 字段卡枚举值,别卡关键词。另一笔账:无人值守最贵的代价不是它搞坏什么,是你不知道它干过什么——所以任何无人值守任务的输出都应走 json 并 tee 落盘(claude -p "任务" --output-format json | tee -a ~/claude-audit.jsonl),谁、什么时候、跑了多少轮、花了多少钱,全在这一行里。今天就能动手的三件事:先列单子再挑教程(列出那台机器上所有丢不起的东西,单子长就收权限,单子空就放权限);找一件已经在手工重复的活,用只读白名单接上去跑通最小闭环;把审计打开。
我的总结:这把"爆炸半径尺子"不只适用于 Claude,适用于一切自动化。想把手感变成标准,可以按老金的零基础三天上线小程序流程那种清单化思路,把"哪些命令直接放过、哪些必看 diff"写成文件;工具链的起步配置,参考5 分钟把 DeepSeek 配成代码助手。