当前位置: 首页>>技术问答>>正文


区域设置变量在远程shell中不起作用(perl:warning:设置区域设置失败。)

, ,

问题描述

我有一个新的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上发生了什么变化,以便在远程服务器上获取此错误消息吗?

最佳解决办法

这是因为您的本地计算机中的本地设置已设置为德语,SSH转发并尝试在服务器上使用,但您的服务器没有安装它。

你有几个选择:

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

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

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

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

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

如果您没有对服务器的根访问权限,则客户端选项中的停止转发区域设置可能是最佳(也是唯一)的方式。

次佳解决办法

这种情况有时可能发生在新的最小/备用安装或其他情况下。修复非常简单。按照下面的顺序尝试这些测试,然后在每个测试之后进行测试,以查看情况是否已修复

1.重新配置区域设置

  • sudo dpkg-reconfigure locales

    • 如果这不起作用,

2.重新安装区域设置language-pack

  • sudo apt-get --reinstall install language-pack-de

    • 如果这不起作用,

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

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

第三种解决办法

注释/etc/ssh/ssh_config中的SendEnv LANG LC_*行,因此它应该如下所示:

#SendEnv LANG LC_*

第四种办法

问题

默认情况下,ssh client命令将locale-related环境变量转发到SSH服务器。这在客户端的/etc/ssh/ssh_config中指定:

Host *
    SendEnv LANG LC_*

默认情况下,SSH服务器恰好接受它们(在服务器上的/etc/ssh/sshd_config中):

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

所以,如果shell中有locale-related环境变量,它们将被填充到服务器端的SSH会话中。

不幸的是,SendEnv选项是累积的。根据man 5 ssh_config

 SendEnv
         ... Multiple environment variables may be separated
         by whitespace or spread across multiple SendEnv directives.  The
         default is not to send any environment variables.

这意味着它不能被覆盖。

解决方案

有时候改变system-wide配置是不可能或不明智的,特别是在服务器端。但是,您可以绕过它。这是ssh命令中-F选项的副作用。根据man ssh

 -F configfile
         Specifies an alternative per-user configuration file.  If a con-
         figuration file is given on the command line, the system-wide
         configuration file (/etc/ssh/ssh_config) will be ignored.  The
         default for the per-user configuration file is ~/.ssh/config.

默认情况下使用per-user配置文件~/.ssh/config(如果出现)。但是您可以在命令行中明确指定它以跳过/etc/ssh/ssh_config

$ touch ~/.ssh/config
$ ssh -F ~/.ssh/config your_user@your_host

如果您在~/.bashrc中创建别名,它会更方便:

alias ssh="ssh -F ~/.ssh/config"

这样,system-wide配置中的默认SendEnv指令无效,因此默认情况下不会将环境变量发送到SSH服务器。

第五种办法

我有类似的问题。我的解决方案是评论/etc/ssh/ssh_config中的SendEnv行(因为这些行不能被覆盖),并在~/.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>是我不想发送任何环境变量的主机名。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/791.html,未经允许,请勿转载。