乐于分享
好东西不私藏

我把 AI 助手放到两台机器之间跑,差点把代码删光了

我把 AI 助手放到两台机器之间跑,差点把代码删光了

先想一个很具体的风险场景:让本地 AI 助手在工作机和远程开发机之间搬测试文件,跑一个跨机器构建的小流程。它先 dir_list,接着不是去 /tmp 写中间产物,而是开始往项目源码目录里探,准备写一个”它觉得需要”的临时文件。

如果这类跨节点文件工具没有默认拒绝、路径白名单和人工确认,风险就不是”AI 能不能聪明一些”,而是它一旦想错,能不能真的碰到源码目录、覆盖文件,甚至把临时清理动作做成破坏动作。

这也是我去翻 OpenClaw 5/4 版本 release notes 的原因。我之前对 harness 的理解太泛泛——以为它就是个壳子负责把 prompt 喂给模型,其实 harness 真正的价值不是让 AI 更聪明,是 AI 出错时能够阻挡它。

升级 + doctor 跑通

OpenClaw 在 2026-05-04 下午发了 v2026.5.3。先升级:

openclaw self-updateopenclaw --version   # 确认是 2026.5.3

升级完先别急着接节点,跑一下 doctor:

openclaw doctor

release notes 里提到这版修了 update / doctor 相关问题,所以升级后先跑 doctor 是个稳妥的动作。它至少能帮你先确认当前 OpenClaw 环境有没有明显配置或迁移问题;至于具体检查项和输出格式以你本机实际 doctor 结果为准,不要按文章里的示意去反推官方 schema。

file-transfer 这类能力不应该在没写清楚节点和路径边界时就默认可用。比起”默认开启再去关”显式配置会更稳妥——你不会在还没配好白名单的时候因为忘了某个开关而让 AI 已经能改动到文件了。

如果 doctor 报错按实际输出逐项修;如果 doctor 没覆盖 file-transfer 的完整权限策略,也不要跳过人工 review。

第一份 file-transfer 配置:把权限边界写明白

这一段不要直接抄。下面只是配置思路示意,用来说明应该把”节点、可读路径、可写路径、文件大小上限”这些边界写清楚;真实字段名和层级必须以 OpenClaw 官方 schema / 当前版本文档为准。

plugins:  entries:    file-transfer:      enabled: true      config:        max_file_size_mb: 16        nodes:          - name: node-A          # 我的工作机            host: 192.168.1.20            paths:              allowed_read:                - /home/me/projects/demo                - /tmp              allowed_write:                - /home/me/projects/demo/build                - /tmp          - name: node-B          # 远程开发机,只允许读            host: dev.internal:22            paths:              allowed_read:                - /var/log                - /opt/app/dist              # 没写 allowed_write 等价于不允许写

几个我自己踩过的坑:

路径白名单应该按默认拒绝来设计: 官方 release notes 里提到 file-transfer 使用 per-node path policy,并且默认拒绝未授权路径。也就是说,设计配置时不要想着”先全开再慢慢收”,而是先只给任务必需的目录。

写权限要比读权限更窄: 如果一个节点只是提供日志、构建产物或配置文件给 AI 读取,就不要给它写路径。需要落盘的中间产物尽量放在专门的 build / tmp 目录里,而不是源码目录。

16MB 上限不要随手调大: 官方 release notes 提到 file-transfer 有 16MB ceiling。它不只是性能考虑也能避免 AI 把超大日志、dump 或二进制文件塞进 agent loop。真有大文件需求走 rsync 或 scp,别走 AI loop。

4 个文件工具怎么用

配置生效后,release notes 里提到这版给 AI 暴露的 4 个工具:

dir_list — 列目录,让 AI 跑「列一下 node-B 的 /var/log」时,理想状态下应该拿到类似这样的结构化 entries(下面仍是示意):

{  "node": "node-B",  "path": "/var/log",  "entries": [    {"name": "syslog", "type": "file", "size": 2418293},    {"name": "nginx",  "type": "dir"}  ]}

如果当前版本返回的是结构化数组而不是一段 ls 文本,AI 就能少一层解析误差;如果真实输出字段不同就按真实 tool output 调整 prompt 和解析逻辑。

file_fetch — 拉文件。适合读取白名单内的具体文件,比如远端构建日志、配置片段或产物摘要。

dir_fetch — 拉目录。适合读取白名单内的一组文件。这个能力要特别谨慎,因为目录范围一旦给大,AI 能接触到的上下文也会迅速变大。

file_write — 写文件。建议只开放到明确的输出目录,例如 build、tmp、artifacts,而不是源码根目录:

{  "node": "node-A",  "path": "/home/me/projects/demo/build/out.txt",  "operation": "create",  "bytes_written": 142}

上面这个 JSON 只是理想化的结构化返回示意,不代表官方实际字段。写作或实测时要以当前版本真实 tool output 为准。

四个工具加起来够大部分跨机器文件读取和写入场景。chmod、chown、删除、软链接这类更危险的操作,release notes 里没有列成这次 file-transfer 暴露的工具;如果要做这些应该交给更严格的人工流程或额外 plugin,不要默认塞进 AI loop。

建议验证 3 个翻车点 + 用 /steer 拉回

配完之后建议至少验证三个会失败的场景,确认默认兜底是不是真兜得住。下面的错误内容是预期形态示意,不代表 OpenClaw 官方实际错误码。

翻车 1:访问白名单外路径: 让 AI 在 node-B 跑 dir_list /etc

error: path_not_allowednode: node-Brequested_path: /etcallowed_read: [/var/log, /opt/app/dist]

理想状态下错误应该能让 AI 明确知道这是权限边界,不是路径拼错或临时失败,至于它会不会自动掉头要看模型和当前 agent loop 的行为,不要把这件事当成必然。

翻车 2:超 16MB 文件: 伪造一个 18MB 文件让它 fetch:

error: size_limit_exceededfile_size_mb: 18.2limit_mb: 16

这里要确认的是:超出上限时是否直接拒绝,以及是否会留下半个文件或中间状态,实际行为以当前版本实测为准。

翻车 3:往只读节点写: AI 试图在 node-B(没配 allowed_write)写 patch:

error: write_not_permittednode: node-Bhint: this node has no allowed_write paths configured

如果错误里能提示”这个节点没有写权限”,AI 才更容易改去有写权限的节点;但这仍然要实测确认,不要假设它一定会自动修正。

用 /steer 当场改方向: 如果跑到一半发现 AI 在 dir_list 完 /var/log 之后开始递归翻每个子目录明显跑偏,可以在 prompt 里敲:

/steer 只看顶层 .log 文件,不进子目录,找到最近 1 小时修改的就停

如果 /steer 生效下一步它应该回到顶层、按 mtime 过滤、停在第一个匹配。比起重启 session 再讲一遍上下文这种当场改方向的价值在于保留中间结果;但具体能省多少时间、模型是否完全照做,都要按实际 session 表现判断。

收尾:

我现在的做法是:把这份 file-transfer 配置当成项目级配置文件签进仓库。新人 clone 下来运行的时候权限边界已经写好。

AI 助手在这个项目里能做什么、不能做什么,跟开发者本人无关,是项目模板的一部分,跟 lint 规则、CI 配置一样。

适合三类人:① 本地多机器跑工作流的,比如一台跑模型、一台跑数据;② 在 SSH 远程开发机里改代码的,本地 AI 但访问远端文件;③ 团队内部自建工具 Agent 的小队,需要把权限策略变成可审计、可 review 的配置。

一句话:别给 Agent 全权限,先给路径策略,模型再强也有犯错的时候。