抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Sephiroth1s'blog

The quieter you became,the more you are able to hear.

背景

  • 发现 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_*的单个值。

其他解决方案

  1. 禁用 ssh 的客户端变量转发,修改 /etc/ssh/ssh_config 注释掉 SendEnv LANG LC_*
  2. 禁用掉 ssh 服务端变量接收,修改服务器/etc/ssh/sshd_config注释掉 AcceptEnv LANG LC_*
  3. 修改终端->设置->描述文件->高级->多语言环境中的文本编码gb2312 反正不要是 utf-8
  4. 取消掉终端->设置->描述文件->高级->多语言环境启动时设置 locale 环境变量,这个设置好对服务器倒是没什么影响了,但本地的中文可能乱码,还是要设置 LANG,所以不参考

参考链接

LC_ALL 和 LANG 参数科普

ubuntu 参考

原因参考

其他解决方案参考