背景
- 发现 ssh 远程 ubuntu 的时候,发现报错,并且部分中文显示不正常
manpath: can't set the locale; make sure $LC_* and $LANG are correct
- 用
locale
看了下相关的变量,发现 LC_CTYE 的值和其他不一样,而且还报错locale: Cannot set LC_CTYPE to default locale: No such file or directory
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=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE=UTF-8
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=en_US.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=
原因
- 主要还是本地的 locale 变量和服务器的不匹配导致
- ssh 默认配置是会转发本地的一些环境变量到服务器的,服务器 sshd 也是一样默认是接收的
- mac 终端会默认配置 locale,并且配置的和 linux 上的不一致所以会有问题
解决方案
- 修改本地的
.zshrc
或者其他终端的配置文件,添加下面两句设置export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8 - 原理也很简单,参考,这样就能确保传递环境变量过去之后远端也能正确处理了
LANG 是 LC_*的默认值,LC_*变量可以单独设置而可以与 LANG 不同。而 LC_ALL 比 LC_*的优先级别高,设置完 LC_ALL 之后,会强制重置 LC_*各个值,如果不将 LC_ALL 重新设置为空,则再无法设置 LC_*的单个值。
其他解决方案
- 禁用 ssh 的客户端变量转发,修改
/etc/ssh/ssh_config
注释掉SendEnv LANG LC_*
- 禁用掉 ssh 服务端变量接收,修改服务器
/etc/ssh/sshd_config
注释掉AcceptEnv LANG LC_*
- 修改终端->设置->描述文件->高级->多语言环境中的文本编码为
gb2312
反正不要是 utf-8 - 取消掉终端->设置->描述文件->高级->多语言环境中启动时设置 locale 环境变量,这个设置好对服务器倒是没什么影响了,但本地的中文可能乱码,还是要设置
LANG
,所以不参考