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-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 是安全敏感的代码。当为二进制包做自动构建时,我们建议将选项--enable-compile-warnings=error
传递给./configure
。在 GNU/Linux 上,如果使用g++
或clang++
,该软件包应该可以干净地编译-Werror
。如果不是这样,请报告一个错误。
在可用的情况下,Mosh在构建时使用了各种二进制加固标志,如:-fstack-protector-all
,-D_FORTIFY_SOURCE=2
, 等等。这些标志提供了积极的安全性,以防止Mosh或其使用的某个库出现内存损坏的可能性。关于标志的完整列表,请在configure.ac
中搜索HARDEN
。configure
脚本会检测你的编译器支持哪些标志,并自动启用它们。要禁用这种检测,请将--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%(或更好)的增量测试覆盖率。
更多信息
-
Mosh网站。
-
mosh-devel@mit.edu
邮件列表。 -
mosh-users@mit.edu
邮件列表。 -
#mosh
在Libera Chat上的频道