在Windows系统下使用mosh

在Windows系统下使用mosh

最近购买了一个海外的VPS,操作的时候发现ssh卡出了翔,完全无法使用。无奈之下转用mosh试试运气。由于我平时只用Windows系统,而mosh官方并没有原生的客户端,要么是Chrome插件,要么是基于Cygwin的版本且有兼容性问题。还有一个选择是在WSL里面使用mosh…😣

Mosh官方提供的Windows系统下解决方案

Chrome插件无法安装,不知是Edge问题还是Google的问题。

无法安装Chrome扩展

无奈寻找了一番,发现一款开源的Terminal模拟器FluentTerminal提供了在Windows下使用mosh的能力。本人平时用Windows Terminal,于是乎研究了下它的实现原理,发现它居然内置了一款编译好的mosh-client.exe。虽然是4年前的版本,但总归是聊胜于无。

有了mosh-client.exe,但是启动mosh的过程缺异常繁琐😢:要先ssh到远端的机器上将mosh-server启动起来,拿到端口和MOSH_KEY,再回到本机将mosh-client启动起来,启动的时候还不能使用ssh_config里配置的别名,只能用IP或域名🤮。有需要写一段程序将这个过程自动化起来😀。

#!/usr/bin/env bash
eval `python ~/.local/bin/mosh.py $1`
mosh
import sys
import os
import subprocess
import re


def main():
    p = subprocess.run(['C:\\Program Files\\Git\\usr\\bin\\ssh.exe', '-v', sys.argv[1], 'mosh-server', 'new', '-c', '256', '-s', '-l', 'LANG=C.UTF-8'], env=os.environ.copy(), capture_output=True)
    m = re.search(r'debug1: Connecting to .* \[([^]]+)\] port \d+.', p.stderr.decode('utf-8'))
    ip = m.group(1)
    if not p.stdout:
        print(p.stderr.decode('utf-8'), file=sys.stderr)
        return
    port, key = p.stdout.decode('utf-8').split(' ')[-2:]
    print(f'export MOSH_KEY={key} && exec mosh-client {ip} {port}')


if __name__ == '__main__':
    main()
mosh.py

之后只需要敲命令:mosh s002 就可以登录到2号VPS上了。

后来我发现Linux版本的mosh文件居然是一个perl脚本,mosh-client和mosh-server是二进制产物。而Git for Windows下面居然带了个perl……

#!/usr/bin/perl

#   Mosh: the mobile shell
#   Copyright 2012 Keith Winstein

于是乎,就将Linux的这个脚本直接拿过来用了……上面的Python脚本算是白写了。

拿过来发现了一个小问题,就是mosh里面的颜色不如用Python脚本时丰富,只有几种颜色。研发发现其mosh-server端命令指定的颜色数为0……

# 正常情况颜色数为256
mosh-server new -c 256 -s -l LANG=zh_CN.UTF-8 
# 异常情况颜色数为0
mosh-server new -c 0 -s -l LANG=zh_CN.UTF-8 

于是看了眼perl代码,发现是获取颜色数的时候出现了问题。

由于我不懂perl,不知道啥问题,干脆直接把$colors=0改造$colors=256了。改为之后万事大吉~