手機上的 Mosh 與 SSH:追蹤代理該用哪一個
你讓 Claude Code 去跑一個長任務,闔上筆電出門。火車進了隧道,你的手機從 Wi-Fi 掉到行動網路,還斷了一分鐘訊號,等你再看時,SSH 工作階段已經死了。這是意料中的事:SSH 從來不是為每隔幾分鐘就換網路的用戶端設計的,而 Mosh 和 Eternal Terminal 正是為此而生。
這篇說明它們各自做什麼、在手機上會發生什麼,以及怎麼選。如果你想看完整的全貌,了解如何從口袋裡操作代理,請先看如何用手機操作 Claude Code。
SSH 在手機上會怎樣
SSH 跑在 TCP 連線上,而那條連線綁定在一個 IP 位址和一組 socket 上。手機從 Wi-Fi 換到行動網路時,它的 IP 會改變,伺服器卻完全不知情。連線就這樣卡住,直到逾時才被砍掉。iOS 或 Android 為了省電讓 App 的網路休眠,或是因為需要記憶體而殺掉 App,也會發生一樣的事。
你失去的不只是畫面。掛在那個 SSH 工作階段底下的處理程序可能會收到 SIGHUP 而跟著死掉。這就是為什麼直接從 SSH shell 啟動的代理很脆弱,也是本文的姊妹篇 tmux for coding agents 幾乎是必讀的原因。
Mosh:UDP 與無聲重連
Mosh(mobile shell)只用 SSH 來起頭。它透過 SSH 驗證身分,在你的電腦上啟動 mosh-server,之後就改用 UDP 通訊。沒有 TCP 連線可以斷,用戶端就能換 IP、失去訊號或休眠,等網路回來時,工作階段還在。
實際上:
- 你從 Wi-Fi 切到行動網路,工作階段毫無察覺。
- 如果伺服器沒有回應,App 會告訴你,而不是直接關掉工作階段。
- 帶預測的本機回顯:你輸入的內容會立刻畫出來並加上底線,等伺服器回應後再確認。在延遲高的行動網路上,你會感覺到差別。
代價是:
- 你的電腦必須開放 UDP 60000–61000(每個工作階段會佔用這個範圍裡的一個連接埠)。
- 沒有捲動歷史。Mosh 只同步螢幕上的內容。如果你想往上捲動,讀代理印出的內容,請在 tmux 裡工作。
- 如果作業系統殺掉 App,Mosh 工作階段就結束,無法恢復。
Eternal Terminal:TCP,但可以恢復
Eternal Terminal(ET)走的是另一條路。它跑在 TCP 上,預設連接埠是 2022,但自己保存工作階段狀態,所以連線斷掉時,它會重建連線並補送漏掉的內容。你的電腦上要執行 etserver,且 SSH 工作階段的 PATH 中要有 etterminal。
在手機上,它的優勢是:它是 Wendo 中(在 Android 上)唯一能在 App 被關閉後仍然存活的傳輸方式。工作階段會出現在首頁,打開後從原本的地方繼續。Wendo 把 ET 標示為實驗性,所以在倚賴它之前請記得這一點。
快速整理
- 手機從 Wi-Fi 切到行動網路或進入休眠時,SSH 會中斷,Mosh 和 ET 撐得住。
- 系統關掉 App 時,用 SSH 和 Mosh 工作階段都會遺失;用 ET 則可以恢復。
- SSH 和 ET 有捲動歷史,Mosh 沒有。
- SSH 和 ET 走 TCP(ET 用 2022 連接埠),Mosh 走 UDP。
- 搭配跳板主機時,Wendo 中只有 SSH 能用。
安裝 mosh-server
在執行代理的電腦上:
# macOS
brew install mosh
# Debian / Ubuntu
sudo apt install mosh
# Fedora
sudo dnf install mosh
確認它在一般 SSH 連線的 PATH 裡,而不只是在你的互動式終端機裡:
ssh my-server 'which mosh-server'
在 Apple Silicon 的 Mac 上,Homebrew 會把它放在 /opt/homebrew/bin/mosh-server,而這個位置不一定在非互動式工作階段的 PATH 裡。如果發生這種情況,Wendo 讓你在連線設定裡指定 mosh-server 的路徑。
防火牆注意事項
Mosh 需要開放傳入的 UDP 60000–61000。在使用 ufw 的 Linux 上:
sudo ufw allow 60000:61000/udp
使用 firewalld 的話:
sudo firewall-cmd --permanent --add-port=60000-61000/udp
sudo firewall-cmd --reload
如果你的電腦在路由器後面,請像轉發 22 號連接埠那樣轉發這段 UDP 範圍。ET 的話,以同樣方式開放 TCP 2022(sudo ufw allow 2022/tcp)。
如果你的 SSH 經過代理或負載平衡器,Mosh 的 UDP 可能會被送到錯誤的 IP。Wendo 針對這種情況有「UDP 使用伺服器 IP」選項。
在 Wendo 裡選一個
編輯連線時,傳輸方式 欄位提供 自動、SSH、MOSH 和 ET。選 自動 時,Wendo 會先試 Mosh,再試 ET,兩者都不能用就退回 SSH。先從自動開始。
有一點要特別說明:目前 Mosh 和 ET 只在 Android 版上提供。在 iPhone 上,Wendo 一律走 SSH(自動會直接用 SSH 連線;如果手動選 MOSH 或 ET,App 會告訴你它們在 iOS 上無法使用)。如果你用的是 iPhone,幫你撐過斷線的是 tmux:連線斷了,代理還是繼續工作,你重新連上就回到原本的地方。
在 Android 上,一個實用的經驗法則:
- 你會拿著手機走動,工作階段只持續幾分鐘:Mosh。
- 你想關掉 App,一小時後回來,在首頁找到工作階段:ET。
- 你透過跳板主機連線:SSH。在 Wendo 中,Mosh 和 ET 都不能搭配跳板主機。
- 你的電腦無法開放 UDP 連接埠:ET 或 SSH。
Mosh 和 Eternal Terminal 屬於 Wendo Pro 的功能;沒有 Pro 時,連線會走 SSH。各欄位的說明在工作階段文件。
不管你選哪種傳輸方式,都要在 tmux 裡啟動代理。傳輸方式讓畫面保持存活;tmux 讓處理程序保持存活,並提供 Mosh 缺少的捲動歷史。常見的組合是用 Mosh 或 ET 負責線路,用 tmux 負責工作,這裡是你最少需要知道的 tmux。想在代理要求權限時收到通知,請見 Hook。