mobile-shell/mosh
GitHub: mobile-shell/mosh
Mosh 是一款支持网络漫游和间歇性连接的远程终端应用,通过 UDP 协议和预测性本地回显在高延迟、不稳定网络下提供流畅的远程 Shell 体验。
Stars: 14208 | Forks: 843
[](https://github.com/mobile-shell/mosh/actions/workflows/ci.yml)
# Mosh:移动 shell
Mosh 是一款支持间歇性连接的远程终端应用程序,
允许漫游,并提供推测性的本地回显
以及对用户按键的行编辑。
它旨在支持 SSH 的典型交互式用途,此外:
* 如果客户端进入休眠并在之后唤醒,或者
暂时失去了 Internet 连接,Mosh 能保持会话存活。
* Mosh 允许客户端和服务器“漫游”并更改 IP
地址,同时保持连接不断。与 SSH 不同,在 Wi-Fi 网络之间切换,或者从 Wi-Fi 切换到蜂窝数据,再切换到有线以太网时,都可以使用 Mosh。
* 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 官网](https://mosh.org/#getting) 提供了有关
许多操作系统的软件包的信息,以及从源码构建的说明。
请注意,`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 官网上有[更多示例](https://mosh.org/#usage)和
[FAQ](https://mosh.org/#faq)。
## 工作原理
`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 时,比 `-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
```
Fork 仓库后,运行以下命令以构建并测试 Mosh:
```
$ ./autogen.sh
$ ./configure
$ make
$ make check
```
Mosh 支持通过测试生成代码覆盖率报告,但此功能
默认处于禁用状态。要启用它,请确保你的系统上安装了 `lcov`。
然后,配置并运行测试:
```
$ ./configure --enable-code-coverage
$ make check-code-coverage
```
这将运行所有测试并生成 HTML 格式的覆盖率报告,你可以使用
你最喜欢的浏览器打开它。理想情况下,新添加的代码应努力实现 90%(或更高)的增量测试覆盖率。
## 更多信息
* Mosh 官网:
* `mosh-devel@mit.edu` 邮件列表:
* `mosh-users@mit.edu` 邮件列表:
* [Libera Chat](https://libera.chat/) 上的 `#mosh` 频道
https://web.libera.chat/#mosh
标签:SSH替代, 内存分配, 安全测试工具, 移动开发, 网络通信, 远程终端