Clawk:为AI编码代理提供一次性Linux虚拟机
速览
Clawk是一个新工具,允许用户为AI编码代理提供一个临时的、可丢弃的Linux虚拟机环境,而非直接访问用户个人电脑。此举可防止AI代理在编码或执行任务时意外损害主机系统或泄露敏感数据。它适用于需要给AI代理较高权限但又希望保障安全性的场景,旨在平衡AI代理的便利性和安全性。
AI 深度解读
背景
当前的 AI 编码代理(coding agent)要真正发挥效用,必须被允许执行实际操作:安装软件包、运行自己编写的代码、启动服务器、使用网络。但在用户自己的机器上,这产生了两个糟糕的选择:要么批准每一个命令(结果每隔几秒就要盯着提示),要么使用 --dangerously-skip-permissions 这类跳过权限的选项,然后祈祷不会因为一次 rm -rf 或一次令牌泄露而造成重大损失。
Clawk 提供了一个第三种选项:让代理在一个一次性的 Linux 虚拟机中工作,而不是直接使用你的笔记本电脑。
核心内容
Clawk 是一个通用型的本地环境,专为自主编码代理设计。其核心思路是:给代理一台独立的、用完即弃的 Linux 机器,而不是把你的电脑交出去。
使用方法
进入一个仓库目录,输入 clawk,Claude Code(或 Codex,或一个 shell)就会在一个一次性 Linux 虚拟机里工作(你的代码被挂载进去,代理在虚拟机中以 root 身份运行,无需权限提示),而你本地的文件、钥匙串和电脑的其他部分则无法被触及。代理得到的是 它自己的机器,而不是你的。
- 一条命令即可启动一个可工作的代理。
- 尝试向未知服务器发送数据时,会被网络允许列表(allow-list)阻止。
- 使用
clawk attach可以稍后恢复会话。
边界不是写在一个提示词(prompt)中的规则(代理可能会被说服绕过),而是一台独立的机器,唯一的出入口是你挂载的内容。
工作原理
从沙盒的 shell 中可以看到:
$ curl https://tracker.evil.example # 不在允许列表中:被阻止
curl: (7) Failed to connect to tracker.evil.example port 443 after 2 ms: Connection refused
$ cat ~/.ssh/id_rsa # 你的密钥从未进入虚拟机
cat: /home/agent/.ssh/id_rsa: No such file or directory
$ git push # ...但这可以工作:ssh-agent 被转发
Enumerating objects: 5, done.
需要诚实说明限制:允许列表阻止连接到未知服务器,但不阻止你已允许的服务器。例如 github.com 是预先允许的,转发的 ssh-agent 可以执行 push 操作,所以任何代理能读取的内容都应被视为可能被发布的内容。安全模型对此有明确说明。
如果代理破坏了虚拟机,运行 clawk destroy && clawk:一台全新的虚拟机,同一个仓库,加上 --resume 可恢复对话。
主要特性
- 让代理做任何事:它在一次性的 VM 中运行,有受限的网络,因此
rm -rf、软件包安装、不可信代码都无法触及你的宿主机、你的文件,以及你未明确共享的任何内容。 - 一条命令即可工作:进入仓库目录,运行
clawk。无需 Dockerfile、devcontainer 或设置文件。首次启动从你的镜像构建 rootfs,后续启动只需几秒钟。 - 破坏后不丢失任何东西:可自由销毁和重建;你的代码和代理的对话记录保存在宿主机上,只有一次性 VM 磁盘被丢弃。
- 真正的 Linux 机器,你的工具链:任何 OCI 镜像都可以作为 rootfs——一个包含项目所需工具的完整操作系统。无需 Docker 守护进程。
- 密钥留在你的机器上:出站流量被允许列表限制,ssh-agent 被转发,因此
git push无需密钥进入 VM 即可工作。 - 每个项目或工单一个沙盒:可同时运行多个;跨仓库的工单每个仓库有一个 git worktree,协调 PR。空闲 VM 自动释放内存并挂起到磁盘,因此忘记的沙盒几乎不消耗资源。
为什么是 VM,而不是进程沙盒?
- 独立内核:客户机运行自己的 Linux 内核,因此宿主机文件系统并非通过拒绝规则隐藏——它从未被挂载。
- 常规 Linux 环境:标准内核、标准用户空间、符合
/dev/kvm预期的行为,工具按照文档描述的方式运行,没有系统调用过滤的意外。 - 客户机中的 root:可以安装系统包、编辑
/etc、加载模块、绑定特权端口。这是代理可以重新配置的机器。 - 一次性生命周期:易于破坏,快速重建;一个被破坏的 VM 只需
clawk destroy && clawk,你的仓库和对话记录在宿主机上不受影响。 - 与宿主机更强的隔离:隔离依赖于 hypervisor 边界,而不是依赖进程沙盒策略的精确性。
这种组合能够运行那些受限进程沙盒往往会阻止的工作负载:
- 安装软件包和原生依赖;
- 运行后台服务(数据库、队列、开发服务器);
- 全速执行不可信构建和测试;
- 使用期望真正机器的系统级 Linux 工具;
- 在支持 KVM 的客户机内核和硬件上,运行容器和 Kubernetes 开发工作流(如 Docker 或 Kind 在沙盒内部运行)。此为可选且受硬件限制。
安装
需要 macOS 14+(Apple Silicon)。Linux 通过 firecracker 支持,目前为实验性质。
brew install clawkwork/tap/clawk
或从源码安装(需要 Go 1.26+):
git clone https://github.com/clawkwork/clawk && cd clawk
make install
两者都不需要额外宿主机工具:无需 Docker、qemu、sudo。Hypervisor 是 Apple 的 Virtualization.framework,已链接到二进制文件中。首次运行时会检测缺少的内容并提供修复。
卸载:
clawk destroy # 销毁所有沙盒
rm -rf ~/.clawk
brew uninstall clawk # 或从 $GOBIN 删除
没有安装其他东西:没有 launchd 任务;每个沙盒的守护进程是普通进程,随 VM 退出而结束。
日常使用
最简单的场景,为当前目录创建一个沙盒:
cd ~/code/my-project
clawk # 启动沙盒 + 附加 claude
clawk run shell # 进入同一沙盒的 shell
clawk run codex # 或其他代理:codex, opencode, shell
clawk down # 停止 VM(仓库和代理状态保留)
clawk attach # 回来——如果停止则启动,重新附加 claude
clawk destroy # 删除 VM(对话历史保留)
常用选项:
clawk run claude -- --resume # 将参数传递给代理
clawk forward add my-project 3000 # 暴露客户机开发服务器到 localhost:3000
clawk network allow my-project api.example.com
跨仓库工单场景:clawk work INFRA-123 创建一个沙盒,每个仓库一个 git worktree,并附加 claude。之后 clawk pr INFRA-123 为每个仓库推送分支并创建 PR。
关于令牌授权
使用 Claude Code?运行一次 claude setup-token 然后 clawk auth set-token,之后每个沙盒启动时自动登录,无需 /login,且并行沙盒之间不会登录冲突。
持久化规则
一条规则决定持久化:VM 是可丢弃的;你会在意的所有内容都保存在宿主机上。
有两个例外:恢复 clawk snapshot 会按暂停时的状态恢复磁盘和内存;Linux/firecracker 提供者将磁盘保留到 destroy。每次启动所需的工具应放在镜像中(vm ( image ... )),每次启动的设置属于 on up 钩子。
代理状态按沙盒主机挂载:客户机中的 ~/.claude/projects/ 和 ~/.claude/memory/(以及 codex 的 ~/.codex/)位于宿主机的 ~/.clawk/namespaces/default/state/<name>/ 下,因此重建的沙盒可以使用 --resume 恢复旧对话。
关于跳过权限标志
运行器在其“外部沙盒化”模式下启动:Claude Code 获得 --dangerously-skip-permissions,Codex 获得 --dangerously-bypass-approvals-and-sandbox。在你的机器上这些
