mosh 服务端
可直接替换 mosh-server 1.4.0。配合 Term,编程智能体的样子和表现与在电脑上一样;配合其他 mosh 客户端,它就是 mosh。在任何服务器上,空闲时内存只占 2–3 MB。
直接替换 mosh-server 1.4.0
termosh 可以直接替换 mosh-server 1.4.0。凡是能用 mosh 的地方都能用 termosh,客户端什么都不用改。
启动命令、参数和环境变量(端口范围、超时、语言环境)都一样。任何 mosh 客户端都按启动 mosh-server 的方式启动它。
同样的加密 UDP 协议和握手,逐字节一致,所以漫游、预测回显和重连的表现和以前完全一样。
mosh 1.4.0 自带一套端到端测试。termosh 跑出的结果与 mosh-server 本身完全相同:24 项通过,外加上游标记为预期失败的 2 项。
用 Rust 从头写成,没有用 mosh 的任何代码:mosh 采用 GPL v3 许可证,用了就得公开 Term 的源代码,而 Term 不是开源软件。没有用它的代码,也就不存在版权问题。Term 的 mosh 客户端也是同一套从头写的实现。
谁能得到什么
termosh 原样使用 mosh 协议,所以任何 mosh 客户端都能连上它。额外的能力由 Term 画出来;其他客户端得到的是一个普通的 mosh 会话,和服务端仍是 mosh-server 时一模一样。
| Term + termosh | 其他客户端 + termosh | 任意客户端 + mosh-server | |
|---|---|---|---|
| 切换 Wi-Fi 与移动网络、锁屏、弱信号都不断 | |||
| 内存(一个空闲会话) | 2.2 MB | 2.2 MB | 3.8 MB |
| 编程智能体跟随你的深浅色切换 | 同 mosh | — | |
| 整帧刷新,回复不会画一半 | 同 mosh | — | |
| 可点按的链接 | 同 mosh | — | |
| 波浪线、点线、虚线、双下划线 | 同 mosh | — | |
| 程序要求的光标形状 | 同 mosh | — | |
| 往回翻看输出,不用 tmux | 同 mosh | — | |
| 其余全部:智能体即开即用、Shift+Enter 换行、长行随尺寸重新折行、tmux 复制到手机等 → | 同 mosh | — |
「同 mosh」表示客户端显示的和配合 mosh-server 时一样:什么都不会坏,也没有额外的。
配合 Term
为会话另一端的编程智能体而设计。
会话中途把 Term 切到深色或浅色,Claude Code、Codex 立刻按新配色重画。
智能体启动时问的几个问题当场就有回答,不用干等,也不会关掉功能凑合着启动。
每一帧画完整了才整帧发出,不闪烁,回复不会只画一半。
程序打印的链接到手机上仍是链接,点一下就能打开或复制。
错误下的红色波浪线、提示下的点线,样式和颜色都完整送达。
在 vim 里输入时是细竖线,移动时是方块,按程序的要求来。
普通 mosh 没有回滚历史。用 termosh,每一行滚出屏幕的输出都会进 Term 的历史——构建日志、智能体的长回复,连带进度条的 <code>apt upgrade</code> 输出也在——往上一翻就能看到。
强制退出 Term,或手机放下一阵子:会话恢复时,最近的输出又回到回滚历史里,连你不在时智能体打印的内容也在。
安装
termosh 装在服务器上,替代 mosh-server。每台主机一条命令,不需要 root,主目录以外什么都不改。
Windows 版为测试版。已在 Windows Server 2025 x64 上测试:连接、输入、调整大小、回滚历史、UTF-8 与中日韩文字、干净退出。尚未在 Windows 10/11 桌面版、ARM64 上测试,也未在经过 Windows 防火墙的真实网络上测试。
Linux任何发行版,x86_64 或 ARM64。完全静态编译,Alpine、较老的企业版系统、BusyBox 系统也能用。会按发布的校验和核对,装到 ~/.local/bin。
macOSApple 芯片或 Intel 都行。Mac 需要打开远程登录(系统设置 › 通用 › 共享),因为 Term 通过 SSH 启动服务端。
WindowsWindows 10 1809 及以上,x64,需要运行 OpenSSH Server,并以 cmd.exe 为默认 shell(默认就是)。在 PowerShell 里:下载、核对哈希、解压到用户目录,再让 mosh 的 UDP 端口通过 Windows 防火墙(需管理员 PowerShell;服务器前面如有云防火墙,也要放行同样的端口)。
curl -fsSL https://term.const.net/termosh/install.sh | sh
iwr https://term.const.net/termosh/0.6.1/termosh-0.6.1-windows-x86_64.zip -OutFile termosh.zip (Get-FileHash termosh.zip).Hash # compare with its line in SHA256SUMS Expand-Archive termosh.zip $env:USERPROFILE\termosh -Force New-NetFirewallRule -DisplayName termosh -Direction Inbound -Protocol UDP -LocalPort 60000-61000 -Action Allow
编辑主机,在连接方式里选 Mosh,打开 Mosh 选项,把安装脚本最后打印的路径填进 mosh-server 命令。
编辑主机:在连接里选 Mosh,打开 Mosh 选项,把 termosh.exe 的完整路径填进 mosh-server 命令,如下所示。需要 Term 26.7.0 及以上。
~/.local/bin/termosh%USERPROFILE%\termosh\termosh.exe就这些。这台主机的下一个会话就跑在 termosh 上。
就这些。这台 Mac 的下一个会话就跑在 termosh 上。
就这样。这台主机的下一个会话就跑在 termosh 上,shell 是 cmd.exe。
~/.local/bin/termosh --version # termosh 0.6.1
& $env:USERPROFILE\termosh\termosh.exe --version # termosh 0.6.1
v=0.6.1; a=$(uname -m) # x86_64 or aarch64 curl -fsSLO https://term.const.net/termosh/$v/termosh-$v-linux-$a.gz curl -fsSLO https://term.const.net/termosh/$v/SHA256SUMS sha256sum -c SHA256SUMS --ignore-missing gunzip termosh-$v-linux-$a.gz mkdir -p ~/.local/bin && install -m 755 termosh-$v-linux-$a ~/.local/bin/termosh
v=0.6.1; a=$(uname -m) # arm64 or x86_64 curl -fsSLO https://term.const.net/termosh/$v/termosh-$v-macos-$a.gz curl -fsSLO https://term.const.net/termosh/$v/SHA256SUMS shasum -a 256 -c SHA256SUMS --ignore-missing gunzip termosh-$v-macos-$a.gz mkdir -p ~/.local/bin && install -m 755 termosh-$v-macos-$a ~/.local/bin/termosh
给所有 mosh 客户端用
既然其他客户端得到的就是普通的 mosh,termosh 完全可以做所有 mosh 客户端启动的服务端。Term 拿到额外的能力,其他客户端照常工作。
curl -fsSL https://term.const.net/termosh/install.sh | sudo TERMOSH_INSTALL_DIR=/usr/local/bin sh sudo ln -sf /usr/local/bin/termosh /usr/local/bin/mosh-server
几乎所有发行版的 PATH 里 /usr/local/bin 都排在 /usr/bin 前面,所以 mosh 会先找到 termosh。撤销:sudo rm /usr/local/bin/mosh-server。
mosh --server=~/.local/bin/termosh you@your-mac
在 Mac 上,不要替换 Homebrew 的 mosh-server,改为让客户端指向它。每个 mosh 客户端都有类似的服务端选项。
其他 mosh 客户端:把它们的服务端选项指向 termosh.exe。在 Windows 主机上,在 termosh 的修复发布前,它们可能要等整个会话结束,SSH 命令才返回;Term 不需要等。
内存
在同一台 Linux 服务器上并排测量,各开一个 80×24 的会话。
空闲时,termosh 的内存只要 mosh-server 的一半多一点:它是一个自带一切的程序,不加载 mosh-server 依赖的那些共享库。占内存的是回滚历史:termosh 保留最近约 1000 行,每行按整行宽度存放,所以大量输出后它比 mosh-server 用得多——80 列时约 5 MB,160 列时约 9 MB——会话开多久都不再增长。用 TERMOSH_SCROLLBACK=0 termosh 启动,就一直在 2 MB 左右。在 macOS 上,一个会话空闲约 3 MB,大量输出后约 8–9 MB,与原版 mosh-server 的 8–10 MB 相当;请看活动监视器的“内存”一栏,而不是 ps 的 RSS——macOS 会把部分已释放的内存留在驻留集里,等需要时才回收。
网络
在七种模拟网络下与原版 mosh-server 对比,两者都连接 Term 自己的 mosh 客户端。数值越小越好。
按下一个键到字符出现在屏幕上的时间,单位毫秒。
| 网络 | mosh-server | termosh |
|---|---|---|
| 同一机房 · ≈0 ms | 10.5 | 1.0 |
| 家庭或办公网络 · 10 ms | 23.2 | 13.2 |
| 高速宽带 · 30 ms | 44.9 | 35.0 |
| 移动数据 · 100 ms | 115 | 107 |
| 信号弱 · 100 ms,丢包 5% | 114 | 104 |
| 慢速线路 · 150 ms,1 Mbit/s | 241 | 156 |
| 跨越半个地球 · 300 ms | 317 | 305 |
5000 行输出在屏幕上全部显示完的时间,单位毫秒。
| 网络 | mosh-server | termosh |
|---|---|---|
| 同一机房 · ≈0 ms | 31 | 26 |
| 家庭或办公网络 · 10 ms | 43 | 36 |
| 高速宽带 · 30 ms | 251 | 81 |
| 移动数据 · 100 ms | 383 | 224 |
| 信号弱 · 100 ms,丢包 5% | 136 | 213 |
| 慢速线路 · 150 ms,1 Mbit/s | 518 | 324 |
| 跨越半个地球 · 300 ms | 889 | 462 |
手机安静下来、输出仍在继续时,20 秒内发给手机的数据包数——数据越少,越省流量和电量。
| 网络 | mosh-server | termosh |
|---|---|---|
| 同一机房 · ≈0 ms | 925 | 6 |
| 家庭或办公网络 · 10 ms | 893 | 6 |
| 高速宽带 · 30 ms | 908 | 6 |
| 移动数据 · 100 ms | 376 | 6 |
| 信号弱 · 100 ms,丢包 5% | 376 | 7 |
| 慢速线路 · 150 ms,1 Mbit/s | 248 | 6 |
| 跨越半个地球 · 300 ms | 131 | 6 |
手机回来后屏幕追上最新内容的时间,单位毫秒。
| 网络 | mosh-server | termosh |
|---|---|---|
| 同一机房 · ≈0 ms | 946 | 22 |
| 家庭或办公网络 · 10 ms | 951 | 33 |
| 高速宽带 · 30 ms | 984 | 58 |
| 移动数据 · 100 ms | 1,031 | 126 |
| 信号弱 · 100 ms,丢包 5% | 1,031 | 126 |
| 慢速线路 · 150 ms,1 Mbit/s | 1,063 | 182 |
| 跨越半个地球 · 300 ms | 1,232 | 327 |
这些改进需要 termosh 0.5.6 和 Term 26.7.2 或更高版本——App 自带的 mosh 客户端也是改进的一部分。termosh 0.5.6 对比 mosh-server 1.4.0,每格测 3 次取中位数。网络在同一台机器上模拟(Linux netem),真实线路会有自己的波动。原版更好的一种情况:信号弱时的大量输出。
下载 · v0.6.1
静态编译、去掉符号、gzip 压缩(Windows 为 zip)。在 Linux 和 macOS 上,安装脚本会替你选对的那一个。
| 平台 | 文件 | 大小 |
|---|---|---|
| Linux · x86_64 | termosh-0.6.1-linux-x86_64.gz sha256 864f6ce75c0ed80f… · 0.87 MB | 0.87 MB |
| Linux · aarch64 | termosh-0.6.1-linux-aarch64.gz sha256 2a417feb0795f6e7… · 0.81 MB | 0.81 MB |
| macOS · arm64 | termosh-0.6.1-macos-arm64.gz sha256 e75b57fb7170f50a… · 0.71 MB | 0.71 MB |
| macOS · x86_64 | termosh-0.6.1-macos-x86_64.gz sha256 282011c959d13a18… · 0.75 MB | 0.75 MB |
| Windows(测试版) · x86_64 | termosh-0.6.1-windows-x86_64.zip sha256 fd08203ef73c108a… · 0.77 MB | 0.77 MB |
0.6.1:链接很多的长会话不再让输入卡上好几秒;会话再长,emoji 的宽度也不会出错;大量输出时服务器更省 CPU。
弹出或收起键盘不再让 Term 的历史出现重复行;apt 的输出现在会进入回滚历史;图片输出中途被打断(如在 icat 时按 Ctrl+C)后,屏幕不再一片空白。
在 Term 里打字的回显快了约一倍,不比原版 mosh 慢;快速网络上不再偶尔卡顿一秒;持续输出时发出的数据包少得多。
编程智能体的状态报告按 Ghostty 的方式解读,一个子任务清除状态时不会再把其他的一并清掉。
Windows(测试版):连上之后服务端转入后台,和 Linux、macOS 上一样。
Windows:shell 退出时,会话随之结束。
大量输出之后,macOS 上的内存占用约减半。
瞬间涌出的大量输出(如 seq 1 200)每一行都会进入回滚历史。
mosh 也有回滚历史了:滚过去的输出进入 Term 的历史,重新连上时最近的输出也会回来。
sha256sum -c SHA256SUMS --ignore-missing # macOS: shasum -a 256 -c … · Windows: Get-FileHash
小贴士
termosh 使用和 mosh 相同的 UDP 端口 60000–61000。防火墙放行了 mosh,就放行了 termosh。
从 26.6.3 起 Mosh 属于 Term Pro,termosh 随之附带。额外的能力需要 Term 26.7.0 或更高版本。
为了提供回滚历史,termosh 在内存里保留最近约 1000 行输出——从不写磁盘——程序清空回滚时它也随之清空。80 列时每个会话约 3 MB,连上后的第一屏更新会大一些。用 TERMOSH_SCROLLBACK=0 termosh 启动即可关闭。
删除 ~/.local/bin/termosh,清空主机的 mosh-server 命令。下一个会话就回到 mosh-server。
300 ms 的线路上,按键回显仍要 300 ms 左右,换哪个服务端都一样。termosh 去掉的是 mosh 额外的等待,以及发给休眠手机的数据。
不写 utmp/wtmp,所以 who 和 last 里看不到 termosh 会话;-c 能用(和原版一样会设置 TERM),但不模拟颜色数;-v 能用,但不输出详细日志(要排查请设 TERMOSH_DEBUG)。其余都与 mosh-server 一致。