# 一行命令 Bootstrap 新设备 > **理念**:人类只做最少特权操作,buddy agent 接管后续。 ## 概述 这套方法论解决了一个经典问题:如何让一台全新的设备快速接入 Agent 生态,同时把人类需要手动操作的步骤压缩到最低? 核心思路: 1. 人类在新设备上执行一条 bootstrap 命令 2. 脚本自动安装必要组件,建立公网 SSH 隧道 3. 客户端 buddy agent 通过隧道 SSH 进入新设备 4. buddy agent 完成剩余所有配置 **人类只需要:** 运行一行命令,然后把隧道地址告诉 agent。 脚本仓库:[https://github.com/shazhou-ww/oc-bootstrap](https://github.com/shazhou-ww/oc-bootstrap) --- ## 流程图 ```mermaid sequenceDiagram participant H as 人类(新设备) participant S as Bootstrap 脚本 participant CF as Cloudflare Quick Tunnel participant A as Buddy Agent(客户端) H->>S: bash <(curl -fsSL ) S->>S: 安装依赖(cloudflared、OpenClaw 等) S->>CF: cloudflared tunnel --url tcp://localhost:22 CF-->>S: 返回隧道域名 xxx.trycloudflare.com S->>H: 显示隧道地址,等待 agent 接管 H->>A: 把隧道地址发给 agent A->>CF: cloudflared access tcp --hostname xxx.trycloudflare.com --url localhost:2222 A->>A: ssh -p 2222 user@localhost A->>A: 执行剩余配置(复制公钥、配置 OpenClaw 等) ``` --- ## 快速上手 ### 新设备端(人类操作) 在新机器的终端执行: ```bash bash <(curl -fsSL https://raw.githubusercontent.com/shazhou-ww/oc-bootstrap/main/bootstrap.sh) ``` 脚本会: 1. 检测系统类型(macOS / Ubuntu / Debian) 2. 安装 `cloudflared`(如未安装) 3. 启动 Quick Tunnel 暴露本地 22 端口 4. 在终端打印隧道地址,格式类似: ``` ✅ Tunnel ready: https://abc-def-ghi.trycloudflare.com Tell your agent: ssh -o ProxyCommand="cloudflared access tcp --hostname abc-def-ghi.trycloudflare.com --url localhost:2222" user@localhost ``` 5. 脚本保持前台运行,**不要关闭终端**,等待 agent 接管完成 ### 客户端 Buddy Agent 操作 收到隧道地址后,agent 执行: ```bash # 建立本地代理(后台运行) cloudflared access tcp --hostname abc-def-ghi.trycloudflare.com --url localhost:2222 & # SSH 进入新设备 ssh -p 2222 username@localhost ``` 进入后完成剩余配置:复制 SSH 公钥、安装 OpenClaw、配置 Telegram Bot Token 等。 ### 验收标准 Bootstrap 完成的标志: - [ ] 可以通过正式 SSH 公钥直接登录新设备(无需密码) - [ ] OpenClaw 已安装并启动 - [ ] Agent 可以通过 Telegram 收到新设备的心跳 - [ ] 关闭 Quick Tunnel 后,通过正式方式(Tailscale / 固定 SSH)仍可访问 --- ## 技术方案 ### Bootstrap 脚本执行方式 ```bash bash <(curl -fsSL https://raw.githubusercontent.com/shazhou-ww/oc-bootstrap/main/bootstrap.sh) ``` !!! warning "为什么不用 `curl | bash`" `curl | bash` 会把 curl 的 stdout 接到 bash 的 stdin,导致脚本内的 `read` 命令无法从终端读取用户输入。即使加 `&1 | \ grep -o 'https://[a-z0-9-]*\.trycloudflare\.com' ``` ### 客户端连接隧道 Buddy agent 在自己的机器上建立本地代理,再 SSH 连入: ```bash # 第一步:建立本地 TCP 代理(后台运行) cloudflared access tcp --hostname xxx-yyy-zzz.trycloudflare.com --url localhost:2222 & # 第二步:SSH 到本地代理端口 ssh -p 2222 user@localhost ``` 两步也可以合并为 SSH ProxyCommand: ```bash ssh -o ProxyCommand="cloudflared access tcp --hostname %h --url localhost:2222" \ -p 22 user@xxx-yyy-zzz.trycloudflare.com ``` ### Bootstrap 脚本的工作内容 脚本按顺序执行以下操作: | 步骤 | 操作 | 说明 | |------|------|------| | 1 | 检测 OS 类型 | macOS/Ubuntu/Debian,选择对应包管理器 | | 2 | 安装 cloudflared | brew / apt / 直接下载二进制 | | 3 | 确认 SSH 服务运行 | macOS 需要手动开启"远程登录",Linux 通常已启动 | | 4 | 启动 Quick Tunnel | `cloudflared tunnel --url tcp://localhost:22 --protocol http2` | | 5 | 提取并显示隧道地址 | 解析 cloudflared stderr 输出 | | 6 | 等待 agent 接管 | 保持前台运行,Ctrl+C 可中断 | --- ## 踩过的坑 ### 1. `curl | bash` 导致 `read` 失效 **问题**:`curl https://... | bash` 模式下,脚本中的交互式 `read` 命令无法读取用户输入,因为 stdin 已被 curl 的输出占据。 **尝试过的修复**(均不可靠): - `read var