语言环境变量在远程shell中无效(perl:警告:设置语言环境失败。)


89

我有一个全新的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中进行了哪些更改以在远程服务器上获取此错误消息吗?


Answers:


167

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

您有几种选择:

  • 生成语言环境。使用生成服务器上的德语语言环境sudo locale-gen de

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

  • 停止在服务器上接受语言环境。不要接受本地计算机到服务器的语言环境环境变量。您可以注释掉远程文件AcceptEnv LANG LC_*中的这一行。 /etc/ssh/sshd_config

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

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

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


2
哈哈!我完全错过了他列出客户的语言环境设置的事实!
辛苦了

10
我决定“停止从客户端转发语言环境”。工作正常。供将来参考:您无法从本地〜/ .ssh / config中的/ etc / ssh / ssh_config中覆盖SendEnv设置。参见bugzilla.mindrot.org/show_bug.cgi?id=1285
Janning

3
bugs.php.net/bug.php?id=18556结合使用,SSH的语言环境发送会导致实际问题(实际上是对我造成的),请参见bugzilla.mindrot.org/show_bug.cgi?id=1285#c9 .. 。
哈利勒Özgür的

1
就我而言,设置区域设置可以~/.profile解决我的问题。谢谢。
弗朗西斯科

如果服务器没有德语语言环境,为什么可以用其他内容覆盖用户要求的值LANG呢?..
Mikhail T.

26

有时在全新的最小/替代安装上或在其他情况下,可能会发生这种情况。解决方法非常简单。按照以下顺序尝试这些,每次进行测试以查看情况是否已解决:

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

我有一个JVM问题,我也试图在12.04中设置系统语言环境。唯一的问题是,无论我如何尝试,我似乎都无法设置LC_ALL,语言环境仍将其显示为空。
黑暗之星2012年

15

注释行SendEnv LANG LC_*/etc/ssh/ssh_config,所以它应该是这样的:

#SendEnv LANG LC_*

10

问题

缺省情况下,ssh client命令将与语言环境相关的环境变量转发到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中有与语言环境相关的环境变量,它们将被填充到服务器端的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.

这意味着它不能被覆盖

解决方案

有时,更改系统范围的配置是不可能或不明智的,尤其是在服务器端。但是,您可以绕过它。这就是-Fssh命令中该选项的副作用。根据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.

默认情况下,使用按用户配置文件~/.ssh/config(如果存在)。但是您可以在命令行上显式指定它以绕过/etc/ssh/ssh_config

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

如果您在一个别名这样会更方便~/.bashrc

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

这样,SendEnv系统范围配置中的默认指令无效,默认情况下不会将任何环境变量发送到SSH服务器。


2
请记住,/ etc / ssh / config中的系统配置文件可能包含您希望保留在用户配置中的其他行。您必须将它们复制到〜/ .ssh / config中的用户配置文件中,以保留这些设置。
Steven Maude

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>其事,我的主机希望发送任何环境变量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.