2026-08-07

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 协议的历史比智能手机还早——两者设计时想的都是坐在键盘鼠标前的人,不是拿着一块玻璃、用两个大拇指操作的人。这不是缺陷,只是超出了它们的设计范围,而且每次都是在同样三个地方露出来:

大家通常接下来会找什么

工具改善的是哪一层
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 整个搬到手机上跑的办法。

三种情况下,这些都帮不上忙

← 所有文章