Mosh 入門 — 把 SSH 帶到不穩網路上的 mobile shell
背景
你有沒有遇過這種情況:在高鐵上 ssh 到公司機器跑東西,過個山洞訊號掉一下,整個 session 就死了。回到位子上得重新連、重新進 tmux、重新 cd 回剛剛的目錄。
或者更日常的:在咖啡店 Wi-Fi 連美西的 server,每按一個鍵都要等個半秒才看到字。寫個 vim 都覺得自己是在打電報。
這兩件事的根源是同一個 — SSH 是建在 TCP 上的:
- TCP 一斷就死 — IP 變了、封包丟太久、筆電 sleep,連線就不可挽回
- 每個按鍵都要等 RTT — 終端機要等 server 回顯,你才看得到自己打了什麼
Mosh 就是為了解決這兩個問題而生的。
什麼是 Mosh
Mosh = Mobile Shell,2012 年從 MIT CSAIL 出來的研究專案。它的設計哲學很乾脆:
SSH 負責登入認證,Mosh 接手互動 shell。
實際流程是:
1. mosh client 用 SSH 連到 server,照常做 key 認證
2. server 啟動 mosh-server,回傳一個 UDP port + 共享金鑰
3. SSH 結束,client 改用 UDP 跟 mosh-server 講話
4. 後續所有按鍵、畫面更新都走加密 UDP
重點:Mosh 不取代 SSH,是互動 shell 場景的延伸。scp、rsync、port forwarding 那些事還是給 SSH 做。
三個殺手級功能
1. Local echo(本地回顯預測)
Mosh client 會「猜」你按的鍵會在螢幕上長什麼樣,有把握的就立刻顯示,沒把握的會加個底線等 server 確認。
USENIX 2012 論文的實測數字夠誇張:3G 環境下,SSH 的按鍵中位延遲 503ms,Mosh < 5ms。寫 vim、用 REPL、改 config 檔的體感差距是天和地。
2. Roaming(IP 切換不斷線)
Mosh server 把「最新一個有效封包的來源 IP」當成你的位址。所以你從咖啡店 Wi-Fi 走出去切到 LTE、回辦公室再換成有線網路 — session 完全不會斷,連 reconnect 動作都不用做。
對筆電帶著到處跑的人來說,這個功能等於再也不用煩惱「我等下要移動,先 disconnect 一下」。
3. 持久連線(sleep / 斷網都撐得住)
筆電闔上、進地下道、Wi-Fi 抖一下、咖啡店把你踢出網路 — Mosh 都不會把 session 砍掉。Client 端會在最上面顯示「多久沒收到 server 訊息」,網路一回來就自動接上。
基本操作
安裝(client 和 server 兩邊都要裝):
# macOS
brew install mosh
# Debian / Ubuntu
sudo apt install mosh
第一次連線,用法跟 SSH 一模一樣:
mosh user@host
# 也支援指定 ssh port、identity
mosh --ssh="ssh -p 2222 -i ~/.ssh/work" user@host
經典組合:搭配遠端 tmux,補上 Mosh 沒有 scrollback 的缺點:
# 連上去自動 attach 到 tmux session
mosh user@host -- tmux a -t main
這套組合是行動辦公的黃金搭檔 — Mosh 撐連線、tmux 撐 session 與歷史。
什麼時候該用 / 不該用
| 情境 | 用 SSH | 用 Mosh |
|---|---|---|
| 跨洲遠端 vim / tmux / REPL | 延遲爆炸 | 本地回顯瞬間反應 |
| 筆電帶著到處跑、頻繁換網路 | 切網路就斷 | session 不死 |
| 不穩 Wi-Fi、LTE hotspot 上開 shell | 一斷就重連 | 自動接回去 |
scp / rsync / port forwarding | ✓ | ✗(這些事還是用 SSH) |
| 跳板機 / 沒裝 mosh-server 的雲端機 | ✓ | ✗(兩邊都要裝) |
跑 tail -f 看完整 log | ✓ | △(會跳過中間畫面) |
已知限制(坑)
實際用之前要知道的事:
- 兩邊都要裝
mosh-server— 雲端機常缺、跳板機也常沒裝 - UDP 60000–61000 — 預設用的 UDP port range,企業 firewall / cloud security group 常常擋掉,要記得開
- 沒有 scrollback — Mosh 同步的是「目前可見的螢幕」,不是完整歷史。往上捲不回去 → 解法:遠端跑 tmux 或 screen
- 沒有 port forwarding / agent forwarding — 這個是 issue #120 的長期未解。要 SSH 隧道、要 agent 轉發,乖乖回去用 SSH
- 不負責檔案傳輸 —
scp、sftp、rsync、Git over SSH 都跟 Mosh 無關
簡單記:互動 shell 用 Mosh,其他通通用 SSH。
替代品與競品(2026 現況)
過去幾年陸續有人想做「Mosh 的後繼者」,但截至 2026 年 5 月,沒有任何一個真正取代它。簡單盤點:
| 工具 | 路線 | 2026 狀態 | 能取代 Mosh 嗎? |
|---|---|---|---|
| trzsz/tssh + tsshd | Go 寫的 OpenSSH 相容工具,UDP over QUIC / KCP | 最新 release 2026-05,最活躍 | ◯ 補上 scrollback / port forwarding / agent forwarding,但刻意不做 local echo |
| Eternal Terminal (et) | TCP-based session 持久化 + scrollback | v6.2.11(2024-07),bugfix commit 還在進 | △ 有 scrollback、有 reconnect,但 TCP-only,沒有 UDP roaming 體感 |
| Blink Shell | iOS / iPadOS 終端機 app | 持續更新 | ✗ 它內建 Mosh 協定,是 Mosh 的最佳行動載體,不是替代品 |
| SSH3 | 學術派 QUIC-based SSH 重寫 | v0.1.7(2024-01),作者明說別上 production | ✗ 還在實驗階段 |
| Tailscale SSH / Cloudflare SSH | 給 SSH 補上 zero-config 連線 | 都在活躍開發 | ✗ 解的是「怎麼連到 server」,不是「連上後體驗」 |
| QUICSSH、zmx 等 2026 新工具 | QUIC native 或 tmux 替代品 | 剛冒出來、community 還沒驗證 | △ 觀察名單 |
結論:2026 年的局面是分工,不是取代。
- 要 local echo + 不穩網路上順手打字 → 還是 Mosh
- 要 scrollback + port forwarding + 現代 OpenSSH config 相容 → 看 tssh + tsshd
- 要解決「server 怎麼連得到」這層 → 看 Tailscale / Cloudflare Access
換句話說,Mosh 沒被取代不是因為它技術多神,是因為沒人願意實作 local echo prediction。這功能技術上不難,但對按鍵體感的影響太大,沒有它的工具就是「另一種 SSH 變種」。
那實際上大家在用什麼?
講完技術競品,回到現實 — 2026 年最主流的做法不是 Mosh,是無聊的 ssh + tmux。
| 層次 | 用法 | 為什麼主流 |
|---|---|---|
| 真・最大宗 | ssh user@host + 遠端 tmux a | server 不用裝東西、所有雲端機都能用、防火牆不擋。會用 tmux 已經能撐 80% 場景。 |
| 進階個人開發者 | Mosh + 遠端 tmux | 願意為「按鍵不延遲」+「IP 切換不斷線」付兩邊都要裝、UDP 要開洞的代價。 |
| 現代團隊(爆發中) | Tailscale SSH / Cloudflare Access | 不解 latency,解的是「怎麼連得到 + ACL 怎麼管」。近兩年新創幾乎全面換掉 VPN。 |
所以實際的選擇大概是:
- 問「個人怎麼連 server」 → 大部分人還是
ssh + tmux,少部分死忠用 Mosh - 問「團隊怎麼管遠端 access」 → Tailscale SSH 或 Cloudflare Access 已經是 2026 主流
- 問「最強的技術方案」 →
tssh + tsshd,但安裝成本和 SSH 一樣高、認知成本更高,主流採用還沒起來
Mosh 在這個光譜上是一個明確的「進階個人選擇」 — 它不會是團隊的標配,但會是某些開發者的隨身工具。
反思
技術面
Mosh 1.4.0 停在 2022 年 10 月,到現在三年多沒出新 stable release。但 GitHub master 還是有人在 commit,最近一筆是 2026 年 3 月。
這不是 dead project,比較精準的描述是 active but slow-moving — 還活著,只是動得很慢。理由也很合理:Mosh 把「不穩網路上的互動 shell」這個窄題已經做完了,不太需要新功能。
心態面
我們常用 release 頻率來判斷一個開源專案的健康度,但 Mosh 提醒我們:有些工具就是「做完了」。把一個窄而清楚的問題解決到極致,就值得一直被用,不用每年硬擠新版本。
但「做完了」也意味著風險 — 上面競品盤點裡可以看到,tssh + tsshd 已經把 Mosh 沒做到的事(scrollback、port forwarding)補齊。哪一天有人補上 local echo prediction,Mosh 就會被換掉。在那之前,它的地位來自一個有點諷刺的事實:沒人想再寫一次按鍵預測。
有趣發現
iOS 上最知名的 mobile terminal — Blink Shell — 整個就是建在 Mosh 上的。一個 2012 年的 MIT 研究專案,撐起了 2026 年 iPad 上的開發者體驗。
下次在高鐵上用 iPad 連回家裡 server 改 code,你用的其實還是這個十多年前的協定。