Mosh
会话在网络切换和设备休眠后继续存活,SwiftServer 如何引导 mosh-server,以及 UDP 出问题时怎么排查。
网络切换、信号变差、设备休眠,Mosh 都能让终端会话活着。会话进行中从 Wi-Fi 切到蜂窝网络,
shell 还在原处。SwiftServer 原生实现了 Mosh 协议,服务器上只需要装好 mosh-server。
为一台机器启用 Mosh
Mosh 是逐台机器设置的连接模式:
- 编辑这台机器,把连接设为 Mosh。
- 需要的话调整服务器可执行文件(默认是 PATH 上的
mosh-server; 如果你的装在别处,就填绝对路径)。 - 保存。这台机器的终端操作随之变成启动 Mosh 终端。
一次会话是怎么起来的
SwiftServer 先照常用 SSH 连接(同样的认证,同样的主机密钥校验),通过这条连接启动
mosh-server,然后把会话交给 UDP 并关闭 SSH 通道。Mosh 协议本身不带密码:
会话密钥是在加密的 SSH 引导过程中交换的,之后所有 Mosh 流量都用它加密。
机器编辑页里的测试连接只验证 SSH 引导,UDP 那一侧在你第一次启动终端时才会验证。
前提条件
- 服务器上装有
mosh-server(apt install mosh、dnf install mosh、brew install mosh等等)。 - 从你的设备到服务器,协商出的那个端口上 UDP 可达。默认情况下
mosh-server在它的标准范围(60000–61000)里挑一个端口,请放通这个范围,或者自己指定一个。
要固定端口范围,在机器编辑页打开使用自定义 UDP 端口范围,设置起始 UDP 端口和
结束 UDP 端口。SwiftServer 会把它们传给 mosh-server,这样你在防火墙上只需要放通
一个很小的范围。
跳板机与代理
Mosh 的引导过程会经过你配置的跳板机或代理,但 UDP 会话是直连的。 如果这台机器的地址只能通过代理到达,请在这台机器的 Mosh 设置里填一个可以直连的 UDP 主机。
一次 Mosh 会话的生命周期
- 换了网络,会话会跟着走:SwiftServer 把 UDP 流固定到一个解析好的地址上,并在路径变化时重建连接。 你可能会短暂看到「Mosh is rebuilding its UDP connection」,接着是 「Mosh UDP connection restored」。
- 服务器一直没有动静时,状态行会把时间数出来:「No Mosh server contact for N seconds」。
- 服务器结束了会话时(例如
mosh-server被杀掉),终端会报 「The Mosh server ended the session.」。重新连接会开一次新的会话。
故障排查
「mosh-server exited with status 127」(或者其他带「command not found」的类似消息):
mosh-server 没有安装,或者不在非交互 SSH 的 PATH 上。装上 Mosh,
或者在服务器可执行文件里填绝对路径。
「mosh-server did not print MOSH CONNECT within 8 seconds」:引导跑起来了,
但没有产生会话行。通常是某个 shell 启动脚本在打印多余的东西或者卡住了;
可以通过 SSH 手动运行一次 mosh-server,看看它的输出。
连上了,但终端一片空白卡住:SSH 引导成功了,UDP 被挡住了。 请在你和服务器之间的每一道防火墙上放通那段 UDP 端口范围(包括云上的安全组), 或者改成一段你能放通的自定义范围。
「Could not resolve the Mosh UDP host」:这个主机名在你的设备上解析不到 IPv4/IPv6 地址。改用 IP,或者显式设置 UDP 主机。
Mosh 会话的断开对话框里有一节 Mosh 诊断,包含完整的引导与连接日志。 先看它;如果你要写信给支持,也请把它附上。