Mosh 是一个远程终端应用,支持间歇性连接、允许漫游,并提供用户按键的推测性本地回显和行编辑。
它旨在支持 SSH 的典型交互式使用场景,此外:
Mosh 在客户端休眠或稍后唤醒、或暂时失去网络连接时保持会话活跃。
Mosh 允许客户端和服务器“漫游”并更换 IP 地址,同时保持连接存活。与 SSH 不同,Mosh 可在 Wi-Fi 网络之间切换、或从 Wi-Fi 切换到蜂窝数据再到有线以太网时使用。
Mosh 客户端在后台运行服务器行为的预测模型,并尝试智能地猜测每次按键将如何影响屏幕状态。当它对预测有信心时,会在等待服务器确认的同时向用户显示这些预测。大部分打字操作及左右箭头键的使用可以立即回显。
因此,Mosh 可在高延迟链路上使用,例如蜂窝数据连接或不稳定的 Wi-Fi。与其他协议以往的本地回显尝试不同,Mosh 能与 emacs、vi、alpine 和 irssi 等全屏应用正常配合,并能在一个 RTT 内自动从偶尔的预测错误中恢复。在高延迟链路上,Mosh 在预测未得到确认时为其添加下划线,并在服务器确认后移除下划线。
Mosh 不支持 X 转发或 SSH 的非交互式用途,包括端口转发。
Mosh 调整帧率,避免在慢速链路上填满网络队列,因此“Control-C”总是在一个 RTT 内生效,以停止失控进程。
当用户长时间未收到服务器响应时,Mosh 会发出警告。
Mosh 支持丢失大量数据包的有损链路。
Mosh 比 SSH 和现有终端模拟器本身处理一些 Unicode 边界情况更好,但需要 UTF-8 环境才能运行。
Mosh 利用 SSH 建立连接并验证用户。Mosh 不包含任何特权(root)代码。
Mosh 网站 提供了许多操作系统的软件包信息,以及从源代码构建的说明。
注意:mosh-client 通过环境变量接收 AES 会话密钥。如果你要将 Mosh 移植到新操作系统,请确保其他用户无法读取正在运行的进程的环境变量。我们已经确认在 GNU/Linux、OS X 和 FreeBSD 上情况如此。
mosh-client 二进制文件必须存在于用户机器上,mosh-server 二进制文件必须存在于远程主机上。
用户运行:
$ mosh [user@]host
如果 mosh-client 或 mosh-server 二进制文件位于用户的 $PATH 之外,mosh 接受参数 --client=PATH 和 --server=PATH 来指定其他位置。更多选项在 mosh(1) 手册页面中有说明。
mosh 程序将通过 SSH 连接到 user@host 以建立连接。SSH 可能会提示用户输入密码或使用公钥认证登录。
此后,mosh 在服务器机器上以用户身份运行 mosh-server 进程。服务器进程监听一个高位 UDP 端口,并通过 SSH 将端口号和 AES-128 密钥发送回客户端。SSH 连接随后关闭,终端会话通过 UDP 开始。
如果客户端更改了 IP 地址,服务器将在几秒钟内开始向新 IP 地址发送数据。
Mosh 需要在客户端和服务器之间传递 UDP 数据报。默认情况下,mosh 使用 60000 到 61000 之间的端口号,但用户可以使用 -p 选项选择特定端口。请注意,-p 选项不影响 SSH 使用的端口。
关于编译器标志的说明:Mosh 是安全敏感性代码。在构建二进制包的自动化构建中,我们建议向 ./configure 传递 --enable-compile-warnings=error 选项。在 GNU/Linux 上使用 g++ 或 clang++ 时,包应能通过 -Werror 干净地编译。如果不能,请报告 bug。
在可用的情况下,Mosh 会使用各种二进制加固标志进行构建,例如 -fstack-protector-all、-D_FORTIFY_SOURCE=2 等。这些措施为 Mosh 或其使用的库中可能存在的内存损坏漏洞提供了主动安全防御。有关完整标志列表,请搜索 configure.ac 中的 HARDEN。configure 脚本会检测编译器支持哪些标志,并自动启用它们。要禁用此检测,请向 ./configure 传递 --disable-hardening。如果你在默认设置下遇到问题,请报告 bug;我们希望尽可能多的用户运行尽可能安全的配置。
Mosh 默认的优化设置为 -O2。一些分发者曾询问将其改为 -Os(这会使编译器更倾向于空间优化而非时间优化)。我们使用附带的 src/examples/benchmark 程序进行了基准测试。结果显示,在 GNU/Linux 上使用 g++ 4.6 时,-O2 比 -Os 快 40%;在 Mac OS X 上使用 clang++ 3.1 时,-O2 比 -Os 快 16%。在两种情况下,-Os 确实生成了更小的二进制文件(最多小 40%,在磁盘上节省了近 200 KB)。虽然 Mosh 不是特别消耗 CPU,并且大多数时候在用户不输入时处于空闲状态,但我们认为结果建议默认使用 -O2 更可取。
我们的 Debian 和 Fedora 打包将 Mosh 作为单个包提供。Mosh 有一个 Perl 依赖项,仅客户端使用需要该依赖项。对于某些平台,提供单独的 mosh-server 和 mosh-client 包可能更合理,这样可以在不使用 Perl 的情况下使用 mosh-server。
要开始为 Mosh 贡献代码,请安装以下依赖项:
Debian、Windows Subsystem for Linux:
$ sudo apt install -y build-essential protobuf-compiler \
libprotobuf-dev pkg-config libutempter-dev zlib1g-dev libncurses5-dev \
libssl-dev bash-completion tmux less
Fedora、RHEL:
$ sudo dnf group install development-tools
$ sudo dnf install automake protobuf-compiler protobuf-devel libutempter-devel \
zlib-ng-compat-devel ncurses-devel openssl-devel bash-completion tmux less \
perl-diagnostics
MacOS:
$ brew install protobuf automake
分叉仓库后,运行以下命令构建并测试 Mosh:
$ ./autogen.sh
$ ./configure
$ make
$ make check
Mosh 支持通过测试生成代码覆盖率报告,但此功能默认禁用。要启用它,请确保系统上安装了 lcov。然后,配置并运行测试:
$ ./configure --enable-code-coverage
$ make check-code-coverage
这将运行所有测试并生成 HTML 格式的覆盖率报告,可用你喜欢的浏览器打开。理想情况下,新添加的代码应争取实现 90%(或更高)的增量测试覆盖率。