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 要正常工作,需要满足两个条件:
-
本地用的 locale,远端需要有对应的 locale 文件
(Client 所使用的 locale 设置,会被 mosh 发送到 Server 进行比对,让 Server 设置到同一个 locale 上。)
-
目前所使用的 locale 需要是 UTF-8 的编码
0x02 解决问题
-
首先确认本地使用的是 UTF-8 的 locale 设置。
使用
locale
来确认当前使用的 locale 设置,如果所有的参数值都带有.UTF-8
字样,则说明没有问题。 (LC_ALL
是指全局的 locale 设置,其他的参数是不同情景的设置,比如可以让显示时间、货币等特殊字段时,使用不同的 locale。) -
如果不是 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” -
确认服务器上有这个 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