跳到正文
Cooing's Blog
返回
长青 #Tailscale #SSH #Herdr #Remote Development #Agent

在手机上接回电脑里的 Coding Agent:Tailscale + Termius + Herdr

记录一套我最近在用的移动远程开发方案:Tailscale 组私网,Termius 从手机 SSH 进机器,Herdr 保留远端 Workspace、Worktree 和 Coding Agent。重点是离开电脑后还能接回原来的开发现场。


TL;DR

最近我把手机、Mac 和 Windows 开发机重新串了一遍:Tailscale 负责设备之间的私网连接,Termius 负责手机 SSH,Herdr 留住远端的 Workspace、Worktree 和 Coding Agent。

实际用下来,手机并不适合承担完整开发。它更适合处理几分钟就能完成的操作:看 Agent 跑到哪、补一句 Prompt、确认测试结果、重启任务。代码和进程继续留在开发机上,SSH 断了也不影响 Herdr Session。

flowchart LR
    Phone["手机"] --> Tail["Tailscale"]
    Tail --> Termius["Termius / SSH"]
    Termius --> Host["开发机"]
    Host --> Herdr["Herdr"]
    Herdr --> W1["Worktree A / Agent"]
    Herdr --> W2["Worktree B / Agent"]
    Herdr --> Remote["其他 SSH Machine"]

一、三个轮子串起手机与终端Coding Agent

我最早试过的思路更接近“把电脑搬到手机上”:远程桌面、浏览器 IDE、移动端编辑器,甚至直接在 SSH 里改文件都能用,但屏幕和键盘很快就会成为限制,Coding Agent 普及之后,我真正需要在手机上做的事情少了很多。大部分时候,代码已经在远端被修改,我只需要重新进入现场,看看任务有没有卡住,loop是否需要我进行部分决策和超时重试continue心跳

这条链路中的三层职责分开为:

工具我实际用它做什么
Tailscale让手机和开发机在不同网络下仍然能互相访问
Termius手机端建立 SSH 连接
Herdr保存开发 Session,管理 Workspace、Worktree 和 Agent

Tailscale 省掉了公网 IP、端口转发和局域网地址变化这些麻烦。设备进入同一个 tailnet 后,可以直接使用 Tailscale IP 或设备名访问1。

登录层我仍然使用标准 OpenSSH。这样 Mac、Windows、Linux 都能沿用同一套 SSH 配置,Termius 和 Herdr 也使用额外协议,让Agent去进行本地配置部署10分钟搞定一套链接

Herdr 则负责 Session。客户端退出以后,Pane 里的进程继续运行;重新执行 herdr 就能 attach 回去2,这一点对手机远程接管很重要,因为移动网络本来就不稳定,远程主机只要有电就能一直跑

二、多台机器怎么组织

一台开发机时,链路很简单:

手机
  ↓
Tailscale
  ↓
Termius SSH
  ↓
开发机
  ↓
Herdr

机器多了以后,我会选一台最常用的电脑作为入口,再让 Herdr/Termius 保存其他 SSH Machine。

flowchart TB
    Phone["手机:Tailscale + Termius"] --> Main["常用开发机"]
    Main --> H["Herdr"]

    H --> Local["Local Session"]
    H --> Mac["Mac / SSH"]
    H --> Win["Windows / SSH"]
    H --> Linux["Linux / SSH"]

    Local --> A["Agent / Worktree"]
    Mac --> B["Agent / Worktree"]
    Win --> C["Agent / Worktree"]
    Linux --> D["Build / Test"]

Saved SSH Machines 会把远端机器挂到同一个 Herdr 控制面中,但每台机器仍然保留自己的 Session 和进程3。Mac 可以跑日常开发,Windows 留给特定工具链,Linux Server 跑构建或长任务。

Termius 里我仍然保存几台关键机器的直接 Host。入口机挂了,也不影响从手机直接 SSH 到目标机器。

三、配置方法:把环境细节交给 Agent

macOS、Windows、Linux 的 SSH 服务方式不同,iOS 和 Android 的 Termius 权限也不完全一样。再加上每个人的用户名、主机名、现有 SSH Key 和 Tailscale Policy 都不同,照着文章抄命令很容易留下错误配置。

让你本机 Coding Agent 先读取实际环境,再按官方文档完成配置,下面这些 Prompt 可以直接复制。先替换花括号里的内容

3.1 开发机:Tailscale + SSH

你正在配置我的开发机用于手机远程开发。

环境:
- 电脑系统:{macOS / Windows / Linux}
- 当前用户名:{用户名}
- 设备名称:{例如 dev-mac}
- 手机系统:{iOS / Android}

目标:
1. 检查并安装/配置 Tailscale,使本机加入我现有的 tailnet。
2. 检查系统当前 SSH Server 状态,优先使用系统标准 OpenSSH。
3. 只允许通过 Tailscale 私网访问 SSH,不配置公网 22 端口映射。
4. 保留我已有 SSH 配置;修改前先读取现状。
5. 给出手机侧需要填写的 Host、用户名和验证方式。
6. 每完成一层都实际验证:Tailscale 可达 → SSH 可登录。
7. 涉及权限、安全策略或可能导致失联的修改时,先说明影响再执行。

请根据当前操作系统实际检查后执行,不要直接套用通用命令。

先让普通 ssh user@host 跑通,再继续 Herdr。

3.2 手机:Termius

我要用 {iOS / Android} 手机上的 Termius 连接已经加入 Tailscale 的 {macOS / Windows / Linux} 开发机。

已知:
- 开发机 Tailscale 名称:{dev-mac}
- SSH 用户:{用户名}

请指导我完成:
1. 手机安装并登录 Tailscale。
2. 在 Termius 中创建独立的 mobile SSH Key,不复用电脑主私钥。
3. 把公钥安全加入开发机。
4. 新建 Termius Host,使用 Tailscale 设备名连接。
5. 验证手机关闭 Wi-Fi、切到蜂窝网络后仍能 SSH。
6. 给出 Key 撤销方法,方便手机丢失或换机时立即失效。

只给当前手机系统实际需要的操作,不展开其他平台。

我会让手机单独使用一把 Key。移动设备丢失、更换或维修时,只撤销这一把即可。

3.3 Herdr:Session 和 Worktree

请在当前开发机检查并配置 Herdr,用于 Coding Agent 的长期 Session。

目标:
1. 检查 Herdr 是否已安装及当前版本。
2. 不破坏已有项目和终端配置。
3. 选择一个现有 Git 项目演示:
   - 启动 Herdr Session
   - detach 后确认进程仍运行
   - 重新 attach
4. 演示创建两个独立 Git Worktree,并分别作为 Workspace 使用。
5. 如果本机已有 Codex / Claude Code 等 Coding Agent,检查 Herdr 能否识别并控制。
6. 最后输出我以后最常用的 5 条命令即可。

请先检查当前环境和 `herdr --help` / 官方文档,再执行,不要假设命令参数。

多个 Agent 同时开发时,我会尽量让一个任务对应一个 branch 和 Worktree。这样从手机接进来,也比较容易判断每个 Agent 正在改什么。

3.4 多机器:Herdr Saved Machines

我要从当前这台 {入口机系统} 的 Herdr 管理其他开发机。

目标机器:
- {dev-mac / macOS}
- {dev-win / Windows}
- {dev-linux / Linux,可选}

请完成:
1. 检查当前 `~/.ssh/config`,复用已有 Host,不覆盖有效配置。
2. 分别验证普通 SSH 可以登录每台目标机器。
3. 确认远端 Herdr 版本和 Session 是否可用。
4. 使用当前版本支持的方式把这些主机加入 Herdr Saved Machines。
5. 验证 `herdr --machine ...` 可以查看 Agent / Workspace。
6. 给出从手机 SSH 到入口机后最常用的多机控制命令。
7. 某台远端不可用时必须明确失败,不允许自动改在 Local 执行。

所有命令以当前安装版本的 `herdr --help` 和官方文档为准。

配置完成后,我最常用的操作其实只有几条:

herdr --machine "MacBook" agent list
herdr --machine "MacBook" agent prompt w1:p1   "检查当前测试失败的原因,只处理这次问题,完成后总结修改和测试结果"

或者直接进入 TUI:

herdr

四、平时怎么用

桌面端正常开发时,我会把任务拆到不同 Worktree:

my-project
├─ feature-a
│  └─ Codex
├─ fix-b
│  └─ Claude Code
└─ main
   └─ tests / logs

离开电脑时不用专门做什么,只要 Agent 本来就在 Herdr Session 里运行。

路上想看进度,手机打开 Tailscale 和 Termius,SSH 到入口机:

herdr

如果 Agent 在等输入,就读最近输出,再补一句 Prompt。

我很少在手机上直接改代码。几十个字的指令很适合触屏键盘,复杂 Diff、merge conflict 和跨文件 Review 还是留给电脑,测试和构建继续在远端跑。回到桌面后重新 attach,看到的还是之前那组 Workspace。,这也是我现在最常用的远程方式:手机只负责把开发流程往前推一点/清除阻塞/快速阅读决策,完整开发环境还是在MAC/Win上

五、几个需要提前知道的限制

第一,机器必须真的在线。Mac 合盖进入深度睡眠、Windows 关机或者家里断电,软件层没有办法补救。如果长任务已经很多,常在线的小主机或 Linux Server 会比强行让笔记本 24 小时不休眠更合适,有需要还是自己起个ECS玩玩开源Personal Agent并兼职开发,ClaudeCode反监控使用会更好

第二,手机上的 TUI 仍然受屏幕限制。Termius 的额外键盘已经够处理常规操作,但长时间看 Diff 并不舒服,我现在会优先使用 agent list、agent prompt 这种短命令,更多的时候是发送长任务,离开座位后不时只读看一眼

六、最后

这套环境稳定以后,我对“手机远程编码”的预期不由的降了很多,回看现有市面上很多手机远程Coding的软件,发现大多数是重复造轮子,我们需要的应当是一个更加合适的UX入口和更加丝滑可控的Personal Agent交互体验,远不是“连上了/看见了”,这点我用UU远程都能做,为什么要大费周章呢?

我不需要在地铁里写一百行代码,只需要在 Agent 卡住时回一句话;不用把 IDE 塞进手机,只要能随时接回电脑里的 Session,电脑继续承担主要开发,Agent 在各自的 Worktree 里运行,手机负责短暂接管。现在这套组合已经覆盖了我绝大多数离开电脑后的操作,这就足以


Footnotes

  1. Tailnet 是 Tailscale 中由用户、设备与资源组成的私有网络。设备加入后可以通过 tailnet 内的身份与地址互相访问,而不需要把服务直接暴露到公网。Tailscale Docs: What is a tailnet? ↩

  2. Herdr CLI 可以启动或重新 attach 到 Session,并提供 Workspace、Tab、Pane、Worktree、Agent 与远程能力的统一控制入口。Herdr Docs: CLI reference ↩

  3. Herdr Saved SSH Machines 可以在一个客户端中连接 Local 与多个远端 Herdr Server。每台机器保留独立 Session 和运行进程;Machine Profile 保存目标与 Session 信息,但 SSH 认证仍交给 OpenSSH。Herdr Docs: Connecting machines ↩