tmux + SSH 能让 Claude Code 活下去,但从没为手机设计过
如果你已经在用手机 SSH 进服务器、在 tmux 里跑 Claude Code,那最难的问题已经解决了:进程不会因为断线而死。剩下的是一份 tmux 和 SSH 从来没被要求解决的问题清单——这是一份真实存在的差距,不是在挑两个工具的毛病。
该给的功劳先给
tmux 让一个进程在服务器上独立于任何一次具体连接持续运行——关掉 SSH 会话,tmux 里的 claude 进程照样跑着,之后重新 attach 会直接回到同一个窗口,连回滚缓冲都还在。SSH 负责让你的手机 SSH 客户端先安全连上那台服务器。两者加在一起解决的是唯一真正会丢工作量的失败模式:连接断开直接干掉正在跑的任务。有一篇实践博客正好写的是这个问题——作者在一次 SSH 断线弄丢了正在跑的 Claude Code 长任务之后,最终靠重新 attach 到终端复用器解决,因为一个裸的 TUI 进程需要真正的终端在下面撑着,连接一消失它自己是撑不住的。(来源,他人报告,我们未复现)
这两个工具从来没承诺过的事
tmux 是 2007 年出的,SSH 协议的历史比智能手机还早——两者设计时想的都是坐在键盘鼠标前的人,不是拿着一块玻璃、用两个大拇指操作的人。这不是缺陷,只是超出了它们的设计范围,而且每次都是在同样三个地方露出来:
- 触屏输入。 Ctrl、Alt、Esc、方向键,手机软键盘上根本没有。大部分 SSH 客户端 App 会自己加一行按键补上,有帮助,但终究是搭在一个默认你有实体键盘的协议之上的补丁。
- 通知。 tmux 和 SSH 都没有"前台进程需要输入了,告诉我一声"这个概念。要么开着 App 盯着,要么等你想起来去看的时候任务早就跑完了。
- 网络切换。 从 WiFi 走到蜂窝网络,或者穿过一段信号盲区,普通 SSH 连接直接就断。每次都得自己手动重连、重新 attach——tmux 保护的是进程,不是通向它的那条连接。
大家通常接下来会找什么
| 工具 | 改善的是哪一层 |
|---|---|
| mosh | 连接本身——能在网络切换中漫游,扛得住会直接搞死普通 SSH 的短暂断线,所以你碰到完全断开的次数会少一些 |
| 带自定义按键行的 SSH 客户端 | 修饰键和方向键的触屏输入——是终端上面的一层 UI 补丁,不是协议层面的改动 |
| Termux(仅 Android) | 把整套工具链跑在手机本地——完全是另一个类别,因为根本不存在要连的另一台机器 |
这几样各自把差距缩小了一点,但都没补全。mosh 让连接更结实,可它仍然是个没有推送通知概念的终端会话,键盘问题它一点没碰。自定义按键行能让你打出 Ctrl-C,但断线重连之后怎么办、Claude Code 什么时候跑完不看屏幕怎么知道,它都不管。Termux 本身只有 Android 版,但 iOS 上其实有自己的本地 shell 类 App:iSH 在本地跑一套完整的 Alpine Linux 用户态、自带包管理器;a-Shell 是原生终端,内置 Python、Lua、vim,还有一个 git 客户端(lg2)。但它们都是手机本地的沙盒环境,没有一款能连到你开发机上跑着的项目——而这才是这篇文章真正要解决的问题。
PocketShell 的不同之处
PocketShell 从客户端这一侧、而不是从连接层去补同样这三个差距。它通过加密 WebSocket(Noise IK)直接和自己的 agent 通信,不依赖另外一个 SSH 客户端 App;而且不像 mosh 那样在传输层做丢包恢复,它在应用层做重放:每个会话维护一个连接级的序号和最近输出的环形缓冲区,不管什么原因断线重连——WiFi 切到蜂窝网络也算——都会精确补发你在上次确认位置之后错过的那部分,含缺口检测。输入这一侧有一套独立的触屏键盘,三种可切换布局(经典、分层、Flick),把手机键盘没有的 Ctrl/Alt/Esc/方向键/功能键全补齐,外加一个独立的输入法缓冲区标签页,可以先用系统输入法拼好一整句再一次性发送。因为它直接接入了 Claude Code、Codex、opencode、Kimi CLI 的会话完成钩子,任务跑完或者需要你输入的那一刻就能推送——走 Web Push 或者外发 Webhook,前台后台分别处理——不用自己去轮询屏幕。
说清楚它没改变的地方:它不是像 mosh 那样的连接层协议——底下没有 UDP 层的漫游或丢包恢复,就是标准 WebSocket 加上面说的那层应用级重放。它也不管你的 tmux 配置——tmux 里的鼠标滚动、复制模式,还是你自己配的那套。而且和 Termux 不一样,它仍然假设某个地方有一台一直开着的机器在跑真正的 agent——它不是一种把 Claude Code 整个搬到手机上跑的办法。
三种情况下,这些都帮不上忙
- 你的电脑有时候要关机。 PocketShell、mosh、带自定义按键行的 SSH 客户端,都还是需要一台开着的机器。如果计划是"合上笔记本,工作还得继续",那是官方 Cloud sessions 该管的事——这里的任何一个,包括这个项目本身,都改变不了这一点。
- 你只是偶尔想瞄一眼进度。 如果偶尔看看就是全部需求,官方 Remote Control 已经能做到,不用自己搭任何东西,只要账号订阅层级对就行。
- 你不想维护一个服务。 自托管 PocketShell 意味着你得自己让进程一直活着、自己更新,跟任何自托管工具一样。如果这不是你想接受的代价,继续用纯 SSH 加 mosh,或者用官方托管选项,才是更诚实的选择。