修复SSH区域设置环境变量错误的3种方法

  • 技术文档
  • 2022.03.24
  • 浏览:168

本文将向您展示3种修复SSH语言环境变量错误的方法。什么是语言环境变量?在Linux中,区域设置由四类环境变量组成:

  1. 语言
  2. 立法会全体议员
  3. LC_u*:LC_类型,LC_数字,LC_时间…

这些环境变量定义Linux发行版上的系统语言、货币格式、日期和时间格式等。通过在terminal中运行locale命令,可以签出您的locale环境变量:

locale

样本输出:

LANG=zh_CN.UTF-8 LANGUAGE=zh_CN LC_CTYPE="zh_CN.UTF-8" LC_NUMERIC=en_US.UTF-8 LC_TIME=en_US.UTF-8 LC_COLLATE="zh_CN.UTF-8" LC_MONETARY=en_US.UTF-8 LC_MESSAGES="zh_CN.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=

您可以看到,上面的输出包含所有四类区域设置环境变量。

在Ubuntu上,您可以在系统设置中以图形方式设置语言、语言和LC_*变量>;语言支持。

locale environment variable

基于Systemd的Linux发行版(Debian 8+、Ubuntu 15.04+、Fedora、CentOS7+、Arch Linux)可以使用以下命令设置每个语言环境变量。

sudo localectl set-locale variable_name=value

例如,设置LANG=en_US。UTF-8。

sudo localectl set-locale LANG=en_US.UTF-8

区域设置更改可能需要重新登录或重新启动才能生效。

SSH区域设置环境变量错误

当您使用ssh连接到远程Linux服务器时,可能会看到以下与区域设置相关的错误。

Failed to set locale, defaulting to C

perl: warning: Setting locale failed. perl: warning: Please check that your locale settings:         LANGUAGE = (unset),         LC_ALL = (unset),         LC_TIME = "zh_CN.UTF-8",         LC_MONETARY = "zh_CN.UTF-8",         LC_ADDRESS = "zh_CN.UTF-8",         LC_TELEPHONE = "zh_CN.UTF-8",         LC_NAME = "zh_CN.UTF-8",         LC_MEASUREMENT = "zh_CN.UTF-8",         LC_IDENTIFICATION = "zh_CN.UTF-8",         LC_NUMERIC = "zh_CN.UTF-8",         LC_PAPER = "zh_CN.UTF-8",         LANG = "en_US.UTF-8"         are supported and installed on your system. perl: warning: Falling back to the standard locale ("C"). locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_MESSAGES to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory

为什么会发生这种区域设置错误?这是因为您的SSH客户端将您的语言环境变量从本地计算机转发到远程Linux服务器,而该服务器没有生成所需的语言环境。

如果你不是以英语为母语的人,这种情况经常发生。通常情况下,您会在本地计算机上配置非英语语言,但大多数Linux服务器默认只生成C语言环境(又名POSIX语言环境)和英语语言环境。

现在,让我向您展示3种修复此错误的方法。

方法1:在服务器上生成区域设置

要修复此错误,可以在Linux服务器上生成所需的区域设置。首先打开/etc/locale。服务器上的gen文件。

sudo nano /etc/locale.gen

找到所需的区域设置并删除#符号以取消注释。例如,生成zh_CN。UTF-8语言环境,找到这行:

#zh_CN.UTF-8 UTF-8

移除并#签名。保存并关闭文件。然后运行以下命令生成它。

sudo locale-gen

locale gen读取/etc/locale。gen文件,以了解要生成的区域设置。还可以通过取消对该文件中多行的注释来生成多个区域设置。

方法2:拒绝客户端区域设置环境变量

您可以告诉SSH服务器拒绝客户端区域设置环境变量。在Linux服务器上打开SSH服务器配置文件。

sudo nano /etc/ssh/sshd_config

找到下面这行。

AcceptEnv LANG LC_*

换成

AcceptEnv no

保存并关闭文件。然后重启SSH守护进程。

sudo systemctl restart ssh

在RHEL、CentOS和Fedora上,你需要跑

sudo systemctl restart sshd

在Fedora/CentOS服务器上,则有多个与语言环境相关的SSH设置。

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE

只需将它们全部注释掉,然后重新启动SSH守护进程。

方法3:禁用区域设置环境变量转发

我们还可以禁用SSH locale环境变量转发来修复此错误。在本地计算机上打开SSH客户端配置文件。

sudo nano /etc/ssh/ssh_config

找到这一行:

SendEnv LANG LC_*

在开头加一个#符号,将其注释掉。保存并关闭文件。

下一步

我希望本教程能帮助您解决SSH语言环境问题。您可能还想设置SSH密钥,以保护服务器免受暴力攻击。

  • 在Ubuntu上设置无密码SSH登录的2个简单步骤
  • 在CentOS上设置SSH公钥身份验证的2个简单步骤

欢迎提出问题或建议。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?