mobile-shell / mosh使用和构建方法

266 阅读6分钟

ci

Mosh:移动外壳

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处理一些Unicode边缘情况比SSH和现有的终端模拟器本身更好,但需要一个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-clientmosh-server 二进制文件不在用户的$PATH 上,mosh 接受参数--client=PATH--server=PATH 来选择替代位置。更多的选项记录在mosh(1)手册页。

在Mosh网站上有更多的例子和一个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 是安全敏感的代码。当为二进制包做自动构建时,我们建议将选项--enable-compile-warnings=error 传递给./configure 。在 GNU/Linux 上,如果使用g++clang++ ,该软件包应该可以干净地编译-Werror 。如果不是这样,请报告一个错误。

在可用的情况下,Mosh在构建时使用了各种二进制加固标志,如:-fstack-protector-all,-D_FORTIFY_SOURCE=2, 等等。这些标志提供了积极的安全性,以防止Mosh或其使用的某个库出现内存损坏的可能性。关于标志的完整列表,请在configure.ac 中搜索HARDENconfigure 脚本会检测你的编译器支持哪些标志,并自动启用它们。要禁用这种检测,请将--disable-hardening 传给./configure 。如果你在默认设置中遇到问题,请报告一个错误;我们希望尽可能多的用户能够运行一个尽可能安全的配置。

Mosh出厂时的默认优化设置为-O2 。一些分销商询问将其改为-Os (这会导致编译器更倾向于空间优化而不是时间优化)。我们已经用附带的src/examples/benchmark 程序进行了基准测试。结果是,-O2 在 GNU/Linux 上比使用 g++ 4.6 的-Os 快 40%,在 Mac OS X 上比使用 clang++ 3.1 的-Os 快 16%。在这两种情况下,-Os 确实产生了一个更小的二进制文件(多达 40%,节省了近 200 千字节的磁盘)。虽然Mosh并不是特别的CPU密集型,而且在用户不打字的时候大多处于闲置状态,但我们认为结果表明,-O2 (默认)是更好的。

我们的 Debian 和 Fedora 包装将 Mosh 作为一个单一的软件包。Mosh 有一个 Perl 依赖项,只在客户端使用时需要。对于某些平台来说,有单独的 mosh-server 和 mosh-client 包可能是有意义的,因为它允许在没有 Perl 的情况下使用 mosh-server。

开发者须知

Mosh支持通过测试产生代码覆盖率报告,但这个功能默认是禁用的。要启用它,请确保lcov 已经安装在你的系统上。然后,配置并运行测试。

$ ./configure --enable-code-coverage
$ make check-code-coverage

这将运行所有的测试,并产生一个HTML形式的覆盖报告,可以用你喜欢的浏览器打开。理想情况下,新添加的代码应该争取达到90%(或更好)的增量测试覆盖率。

更多信息