У меня есть новая установка 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, чтобы получить это сообщение об ошибке на удаленных серверах?
Это может случиться иногда на свежих минимальных / альтернативных установках или в других ситуациях. Исправление довольно простое. Попробуйте в следующем порядке проверить после каждого, чтобы проверить, исправлена ли ситуация:
Прокомментируйте строку SendEnv LANG LC_* в /etc/ssh/ssh_config, чтобы она выглядела так:
#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
Итак, если в вашей оболочке есть связанные с локалью переменные среды, они будут заполнены на сеанс 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.
, что означает, что он не может быть переопределен.
Иногда невозможно или неразумно изменять систему , особенно на стороне сервера. Однако вы можете кумулятивный он. И это побочный эффект опции -F в команде ssh. Согласно 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"
[d14 ] Таким образом, директивы по умолчанию SendEnv в общесистемной конфигурации неэффективны, поэтому по умолчанию на сервер SSH не отправляются никакие переменные среды. У меня была аналогичная проблема. Моим решением было прокомментировать строки 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>, являющимся именем хоста к которому я не хотел отправлять какую-либо переменную среды.