mcpField
M
Mosh

Mosh

官方
github.com开发者工具14.6kmosh31 周前更新
代码仓库访问官网

关于 Mosh

Mosh(Mobile Shell)是一个替代 SSH 的远程 shell,针对不稳定和间歇性网络连接优化。支持 IP 地址切换、连接中断恢复和智能键盘回显。

主要功能

  1. 01在网络变化或 IP 地址切换时自动恢复 shell 会话
  2. 02在高延迟或丢包网络上优化键盘响应和显示更新
  3. 03支持自定义 SSH 参数以适配不同的远程服务器配置
  4. 04连接中断后保持 shell 运行状态

适用场景

  1. 01开发者在移动网络或网络不稳定的环境中连接远程服务器
  2. 02系统管理员在 VPN 切换或网络变化时维护远程会话
  3. 03编码 Agent 通过不稳定的网络链接与远程服务器交互

安装

选择你的系统或包管理器,复制命令到终端运行。

$
brew install mosh

安装完成后运行mosh --version确认安装成功。

命令示例

常用命令按使用顺序排列。

01
mosh user@server
02
mosh --ssh="ssh -p 2222" user@server

详细介绍

ci

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 网站上还有更多示例和常见问题。

工作原理

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%(或更高)的增量测试覆盖率。

更多信息

评论

支持 Markdown