0x00 提出问题

一般遇到这个问题,我们会看到类似于这样的错误信息

The locale requested by LC_CTYPE=UTF-8 isn’t available here. Running `locale-gen UTF-8’ may be necessary.

mosh-server needs a UTF-8 native locale to run.

Unfortunately, the local environment (LC_CTYPE=UTF-8) specifies
the character set "US-ASCII",

The client-supplied environment (LC_CTYPE=UTF-8) specifies
the character set "US-ASCII".

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=
LANGUAGE=
LC_CTYPE=UTF-8
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
Connection to 128.199.. closed.
/usr/local/bin/mosh: Did not find mosh server startup message.

locale 就是指当前系统所使用的语言文件设定

0x01 发现问题

从错误信息和各种 Github Issue 中剖析可知,mosh 要正常工作,需要满足两个条件:

  1. 本地用的 locale,远端需要有对应的 locale 文件

    (Client 所使用的 locale 设置,会被 mosh 发送到 Server 进行比对,让 Server 设置到同一个 locale 上。)

  2. 目前所使用的 locale 需要是 UTF-8 的编码

0x02 解决问题

  1. 首先确认本地使用的是 UTF-8 的 locale 设置。

    使用 locale 来确认当前使用的 locale 设置,如果所有的参数值都带有 .UTF-8 字样,则说明没有问题。 LC_ALL 是指全局的 locale 设置,其他的参数是不同情景的设置,比如可以让显示时间、货币等特殊字段时,使用不同的 locale。)

  2. 如果不是 UTF-8 或者需要改个语言

    使用 locale -a 可以获取到所有已经安装的 locale,找一个自己需要语言的 UTF-8 版本的 locale,然后在环境变量中直接设置 LC_ALL 为对应的 locale 名字。 Bash:export LC_ALL=“en_US.UTF-8” Fish:set -xg LC_ALL “en_US.UTF-8”

  3. 确认服务器上有这个 locale

    同样的,使用locale -a查看当前已安装的 locale 设置。

    如果没有,Ubuntu 可以使用 locale-gen en_US.UTF-8 生成一个。 而 Debian 下这个命令虽然存在,但并不是用于生成新的 locale 文件,需要使用 dpkg-reconfigure locales 来对 locale 进行重新配置,来生成新的 locale 和设置默认的 locale。

0x03 吐槽

mosh 的好几个问题可以说是老生常谈了,比如 scroll 的支持,locale 的问题,都有许多的相关 issue。 感觉 mosh 的错误提示太模糊了,或者应该提供一个 ignore-locale 的选项。 然而,mosh 的 contributor 却丢一句

This looks like it is probably not a Mosh-specific problem.

emmm 总不能把这问题永远留在 issue 里面啊。

0x04 相关

https://unix.stackexchange.com/questions/246846/cant-generate-en-us-utf-8-locale

Debian, interactive: dpkg-reconfigure locales
Debian, automated: sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen && locale-gen
Ubuntu, automated: locale-gen en_US.UTF-8

https://github.com/mobile-shell/mosh/issues/793 https://github.com/mobile-shell/mosh/issues/678 http://www.jianshu.com/p/386c80192f8e