区域设置变量在远程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 from ALChacks import * File "/usr/share/apt-listchanges/ALChacks.py", line 32, in 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
在服务器上生成德语区域sudo locale-gen de
。 -
停止从客户端转发语言环境 。 不要将语言环境环境变量从本地计算机转发到服务器。 您可以在本地
/etc/ssh/ssh_config
文件中注释掉SendEnv LANG LC_*
行。 -
停止接受服务器上的区域设置 。 不要接受从本地计算机到服务器的语言环境变量。 您可以注释掉远程
/etc/ssh/sshd_config
文件中的AcceptEnv LANG LC_*
行。 -
将服务器区域设置为英语 。 在服务器上明确将语言环境设置为英语。 例如,您可以
~/.bashrc
添加到远程~/.bashrc
或~/.profile
文件中:export LANGUAGE="en" export LANG="C" export LC_MESSAGES="C"
如果您没有对服务器的root访问权限, 则从客户端选项停止转发区域设置可能是最好的(也是唯一的)方法。
有时在新的最小/备用安装或其他情况下可能会发生这种情况。 修复非常简单。 按照以下顺序尝试这些,在每个之后进行测试以查看情况是否已修复:
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
在/etc/ssh/ssh_config
注释SendEnv LANG LC_*
行,所以它应该如下所示:
#SendEnv LANG LC_*
问题
缺省情况下,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.
这意味着它无法被覆盖 。
解决方案
有时,改变系统范围的配置是不可能或不明智的,尤其是在服务器端。 但是,您可以绕过它。 这就是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.
默认情况下,如果出现,则使用每用户配置文件~/.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
指令SendEnv
,默认情况下不会将任何环境变量发送到SSH服务器。
我有一个类似的问题。 我的解决方案是在/etc/ssh/ssh_config
注释SendEnv
行(因为这些行不能被覆盖),并在~/.ssh/config
添加以下条目:
Host *,! 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
是我不想发送任何环境变量的主机名。