区域设置变量在远程 shell 中无效(perl:警告:设置区域设置失败。)

区域设置变量在远程 shell 中无效(perl:警告:设置区域设置失败。)

我安装了全新的 ubuntu 12.04。当我连接到远程服务器时,出现了如下错误:

~$ ssh example.com sudo aptitude upgrade
...
Traceback (most recent call last):
  File "/usr/bin/apt-listchanges", line 33, in <module>
    from ALChacks import *
  File "/usr/share/apt-listchanges/ALChacks.py", line 32, in <module>
    sys.stderr.write(_("Can't set locale; make sure $LC_* and $LANG are correct!\n"))
NameError: name '_' is not defined
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_TIME = "de_DE.UTF-8",
    LC_MONETARY = "de_DE.UTF-8",
    LC_ADDRESS = "de_DE.UTF-8",
    LC_TELEPHONE = "de_DE.UTF-8",
    LC_NAME = "de_DE.UTF-8",
    LC_MEASUREMENT = "de_DE.UTF-8",
    LC_IDENTIFICATION = "de_DE.UTF-8",
    LC_NUMERIC = "de_DE.UTF-8",
    LC_PAPER = "de_DE.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_ALL to default locale: No such file or directory
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.
...

当我从较旧的 ubuntu 安装连接时,我没有遇到此问题。这是我的 ubuntu 12.04 安装的输出,LANG 和 LANGUAGE 已设置

$ locale
LANG=de_DE.UTF-8
LANGUAGE=de_DE:en_GB:en
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME=de_DE.UTF-8
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=

有人知道 ubuntu 中发生了哪些变化,导致远程服务器上出现此错误消息?

答案1

这是因为您本地机器的语言环境设置为德语,SSH 会转发到该语言环境并尝试在服务器上使用,但您的服务器尚未安装它。

您有多种选择:

  • 生成区域设置. 使用 在服务器上生成德语区域设置sudo locale-gen de

  • 停止从客户端转发语言环境。不要将语言环境变量从本地计算机转发到服务器。您可以SendEnv LANG LC_*注释掉当地的 /etc/ssh/ssh_config文件。

  • 停止接受服务器上的区域设置。不要从本地计算机接受服务器的区域设置环境变量。您可以AcceptEnv LANG LC_*注释掉偏僻的 /etc/ssh/sshd_config文件。

  • 将服务器区域设置为英语. 在服务器上明确将语言环境设置为英语。例如,您可以将以下几行添加到远程~/.bashrc~/.profile文件中:

    export LANGUAGE="en"
    export LANG="C"
    export LC_MESSAGES="C"
    

如果你没有服务器的 root 访问权限,则停止从客户端转发语言环境选项可能是最好的(也是唯一的)方法。

答案2

有时在全新最小/替代安装或其他情况下可能会发生这种情况。修复方法很简单。请按照以下顺序尝试这些操作,每次操作后进行测试,看看情况是否已修复:

1. 重新配置语言环境

  • sudo dpkg-reconfigure locales
    • 如果这不管用,

2. 重新安装语言环境语言包

  • sudo apt-get --reinstall install language-pack-de
    • 如果这不管用,

3. 手动强制区域设置(持久)

  • sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8

答案3

SendEnv LANG LC_*注释掉中的行/etc/ssh/ssh_config,因此它看起来应该像这样:

#SendEnv LANG LC_*

答案4

我遇到了类似的问题。我的解决方案是注释掉SendEnv中的行/etc/ssh/ssh_config(因为这些行无法被覆盖),并在 中添加以下条目~/.ssh/config

Host *,!<somehost>
    SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    SendEnv XMODIFIERS    

<somehost>我的主机名没有想要发送任何环境变量。

相关内容