关于 Mosh
Mosh(Mobile Shell)是一个替代 SSH 的远程 shell,针对不稳定和间歇性网络连接优化。支持 IP 地址切换、连接中断恢复和智能键盘回显。
主要功能
- 01在网络变化或 IP 地址切换时自动恢复 shell 会话
- 02在高延迟或丢包网络上优化键盘响应和显示更新
- 03支持自定义 SSH 参数以适配不同的远程服务器配置
- 04连接中断后保持 shell 运行状态
适用场景
- 01开发者在移动网络或网络不稳定的环境中连接远程服务器
- 02系统管理员在 VPN 切换或网络变化时维护远程会话
- 03编码 Agent 通过不稳定的网络链接与远程服务器交互
安装
选择你的系统或包管理器,复制命令到终端运行。
安装完成后运行mosh --version确认安装成功。
命令示例
常用命令按使用顺序排列。
详细介绍
Mosh:移动 Shell
Mosh 是一款远程终端应用,支持间歇性连接、允许漫游,并提供对用户按键输入的预测性本地回显和行编辑功能。
它旨在支持 SSH 的典型交互式用途,此外还具备以下功能:
-
即使客户端进入睡眠状态后再唤醒,或暂时失去 Internet 连接,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 支持会丢失大量数据包的有损链路。
-
与 SSH 和现有终端模拟器单独使用相比,Mosh 能更好地处理某些 Unicode 边缘情况,但运行时需要 UTF-8 环境。
-
Mosh 利用 SSH 建立连接并对用户进行身份验证。Mosh 不包含任何特权(root)代码。
获取 Mosh
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 干净地编译。如果不能,请报告错误。
Mosh 会尽可能使用各种二进制加固标志构建,例如 -fstack-protector-all、-D_FORTIFY_SOURCE=2 等。这些标志可主动防范 Mosh 或其使用的库中可能存在的内存损坏错误。完整标志列表请在 configure.ac 中搜索 HARDEN。configure 脚本会检测编译器支持哪些标志,并自动启用它们。要禁用此检测,请向 ./configure 传递 --disable-hardening。如果默认设置有问题,请报告错误;我们希望尽可能多的用户运行尽可能安全的配置。
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 kilobytes 的磁盘空间)。虽然 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
Fork 仓库后,运行以下命令来构建并测试 Mosh:
$ ./autogen.sh
$ ./configure
$ make
$ make check
Mosh 支持通过测试生成代码覆盖率报告,但默认情况下此功能处于禁用状态。要启用该功能,请确保系统已安装 lcov。然后配置并运行测试:
$ ./configure --enable-code-coverage
$ make check-code-coverage
这将运行所有测试,并生成 HTML 格式的覆盖率报告,可使用你喜欢的浏览器打开。理想情况下,新添加的代码应力争达到 90%(或更高)的增量测试覆盖率。