mobile-shell/mosh

GitHub: mobile-shell/mosh

Mosh 是一款支持网络漫游和间歇性连接的远程终端应用,通过 UDP 协议和预测性本地回显在高延迟、不稳定网络下提供流畅的远程 Shell 体验。

Stars: 14208 | Forks: 843

[![ci](https://static.pigsec.cn/wp-content/uploads/repos/cas/99/993938d8ce5e902ccfb9d6747725c320d855dea3235ed9a304cedf0d94c9321f.svg)](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替代, 内存分配, 安全测试工具, 移动开发, 网络通信, 远程终端