Debian 解决 warning:Setting locale failed

在本地机器通过 SSH 连接到远程服务器时,一个常见的问题是出现“warning: Setting locale failed.”。这往往是因为本地机器的 locale 配置和远程服务器的 locale 配置不一致而引起的。在一般情况下,本地机器与服务器建立 SSH 连接时,会将自身的 locale 配置发送到远程服务器,而服务器也会默认接收这一从客户机发送而来的 locale 配置。当本地客户机的 locale 配置与远程服务器原有的 locale 配置不一致的时候,就会产生冲突,从而引发“warning: Setting locale failed.”警告:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

解决步骤

首先,重新构建服务器的 locale 配置:

sudo locale-gen en_US.UTF-8

以上命令将服务器的 locale 配置为 en_US.UTF-8。同样地,也可以使用命令:

sudo dpkg-reconfigure locales

然后根据终端的提示进行配置。需要说明的是,以上的 en_US.UTF-8 只是一个可选项,你可以将其替换为例如 zh_CN.UTF-8 的任何一个国家或地区的配置。

取消发送本地 locale 到远程服务器:

修改客户机的 SSH 配置文件 /etc/ssh/ssh_config,注释或者删除掉 SendEnv LANG LC_*。

拒绝接收从客户机发送的 locale 配置:

修改服务器端的 SSH 配置文件 /etc/ssh/sshd_config,注释或者删除掉 AcceptEnv LANG LC_*。

重新建立 SSH 连接:

重新建立从客户机到服务器的 SSH 连接,此时应该不会发生任何异常。在终端中键入 locale 命令,应当输出当前 locale 配置如下:

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.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=