‹ 指南

Mosh 进阶设置

固定 UDP 端口、决定断开后的会话还能等多久、让脚本在 shell 之前先跑。

固定 UDP 端口

UDP 端口或范围(可选)」留空时,mosh-server 会在自己默认的 60000–61000 里挑一个端口。平时没问题,但如果所在的网络只放行了少数几个 UDP 端口,就会变成「SSH 登录成功、UDP 数据包却过不来」。

把这一栏填上,Term 会原样交给 mosh-server -p:可以是单个端口(60000),也可以是一段范围(60000:61000)。填防火墙真正放行的那几个,服务端就只在里面挑。这一栏在主机编辑页的「连接方式」里,选了 Mosh 才会出现。

主机编辑页的「连接方式」卡片:SSH / Mosh / Telnet 里选中 Mosh,下面是填了 60000:60010 的「UDP 端口或范围(可选)」。
连接方式 · Mosh —— 「UDP 端口或范围(可选)」里填的是 60000:60010,也就是给这台主机留了 11 个端口。上面那行是应用自带的提示:主机上要装 mosh-server,登录仍然走 SSH。

两端都得是 1–65535 之间的端口号,而且前一个不能大于后一个。写错了当场拦下:输入框下面直接给出提示,改对或清空之前这台主机保存不了。

「UDP 端口或范围(可选)」里填了 60000:60010:9,下面是一行红色的错误提示。
当场拦下 —— 60000:60010:9 不是合法范围,输入框下面直接回答「请输入端口(1–65535)或范围,如 60000:61000」;改成端口、范围或者留空之前,保存都是灰的。
断开之后还等多久

mosh 会话比应用活得久:退出 Term、断网、把手机收起来,主机上的 mosh-server 还在那儿等客户端回来。这正是 mosh 的价值所在 —— 同时也是主机上会攒下一堆再没人连回去的 mosh-server 的原因。

设置 → 终端 → Mosh 会话超时 决定这个「失联窗口」有多长:1 天、3 天、5 天、1 周(默认)、1 个月,或者永不。Term 把它作为 MOSH_SERVER_NETWORK_TMOUT 交给服务端,超过这个时长没收到客户端的消息,mosh-server 自己退出。选「永不」就回到 mosh 原本一直等下去的行为。这项设置对之后新开的会话生效。

设置 → 终端 里相邻的两行:SSH 连接超时 15s,Mosh 会话超时 1 周。
设置 · 终端 —— 「Mosh 会话超时」就在「SSH 连接超时」下面,副标题一句话说清了规则:失联超过此时长后,远端 mosh-server 自动退出。
「Mosh 会话超时」选择页:1 天、3 天、5 天、1 周(已选)、1 个月、永不。
六个选项,默认 1 周。共用的主机上选短一点更干净;选 永不 就是 mosh 自己的行为 —— 一直等下去。
启动脚本比 shell 更早

走 SSH 时,主机的启动脚本是在第一个提示符出现之后「敲」进去的,老办法。走 Mosh 时它根本不用敲:它被写进 mosh-server 的启动参数,作为 mosh 初始化脚本,由服务端在 shell 启动之前执行。

这带来三点实际差别。它不会再跟登录横幅、MOTD 抢时机,因为它压根不跟提示符打交道。一行 cd /srv/appexport EDITOR=vim 会留在你随后进入的那个 shell 里,而不是在一个已经打完提示符的 shell 里跑一遍。而 tmux new -A -s main 这样的脚本,连上就自动接回会话 —— 连接交给 mosh,工作交给 tmux。

主机编辑页的「高级选项 → 启动脚本」,当前是 None,下面是关于 mosh 初始化脚本的说明。
高级选项 · 启动脚本 —— 选中 Mosh 时应用就地说明:Mosh 连接时,此脚本将作为 mosh 初始化脚本,在 shell 启动前于服务器端执行。
mosh 下的深浅色识别

这一项没有开关,但值得知道。终端里的 TUI 程序靠问终端「你的背景色是什么」(OSC 11)来判断深色还是浅色,而 mosh 会把这个查询丢掉 —— 它传的是一屏画面,不是字节流,问出去没有回音。所以在原本的 mosh 会话里,vim 之类只能靠猜,还常常猜反。

于是 Term 干脆主动告诉它:连接时把 COLORFGBGCOLORTERM=truecolor 写进会话的环境变量,认这两个变量的程序自己就能选对背景。这个值是连接那一刻取的 —— 之后再切换应用的深浅色,要重新连接才会带上新值。

在主机上验一眼

这两项设置在会话里都看得见:pgrep 能看到 mosh-server 实际是用什么命令行起来的,-p 就在里面;超时在环境变量里,单位是秒 —— 604800 就是一周。

mosh 会话内
# mosh-server 实际的启动命令行
pgrep -af mosh-server | tail -1

# Term 交给服务端的超时(秒)
echo TM=[$MOSH_SERVER_NETWORK_TMOUT]
mosh 会话里的两条命令:pgrep 打印出 mosh-server new -s -c 256 -p 60000:60010 -l LANG=en_US.UTF-8,echo 打印出 TM=[604800]。
两项设置,在主机上验证 —— mosh-server new -s -c 256 -p 60000:60010 … 里的正是主机编辑页填的范围,TM=[604800] 就是 1 周换算成秒。

参考: 常见问题 —— 怎么连 mosh · mosh.org