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 一致。