Локальные переменные не действуют в удаленной оболочке (perl: warning: Ошибка установки локали).

80

У меня есть новая установка 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, чтобы получить это сообщение об ошибке на удаленных серверах?

    
задан Janning 30.05.2012 в 20:51
источник

5 ответов

151

Это связано с тем, что ваш локаль на вашем локальном компьютере установлен на немецкий язык, который SSH перенаправляет и пытается использовать на сервере, но ваш сервер его не установил.

У вас есть несколько вариантов:

  • Создать локаль . Создайте немецкий язык на сервере с sudo locale-gen de .

  • Прекратить локализацию пересылки с клиента . Не пересылайте переменную среды локали с локальной машины на сервер. Вы можете прокомментировать строку SendEnv LANG LC_* в файле local /etc/ssh/ssh_config .

  • Прекратить прием локали на сервере . Не принимайте переменную среды локали с локальной машины на сервер. Вы можете прокомментировать строку AcceptEnv LANG LC_* в файле remote /etc/ssh/sshd_config .

  • Установите языковой стандарт сервера на английский . Явно задайте локаль на английском языке на сервере. В качестве примера вы можете добавить следующие строки к вашим удаленным файлам ~/.bashrc или ~/.profile :

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

Если у вас нет корневого доступа к серверу, лучшим вариантом (и только) может быть Stop forwarding locale из клиентского .     

ответ дан David Planella 31.05.2012 в 07:47
источник
26

Это может случиться иногда на свежих минимальных / альтернативных установках или в других ситуациях. Исправление довольно простое. Попробуйте в следующем порядке проверить после каждого, чтобы проверить, исправлена ​​ли ситуация:

1. Переконфигурируйте локали

  • %код%
    • если это не работает,

2. Переустановите языковой пакет языка

  • %код%
    • если это не работает,

3. Вручную настроить языковые настройки (постоянный)

  • sudo dpkg-reconfigure locales
ответ дан izx 30.05.2012 в 21:19
13

Прокомментируйте строку SendEnv LANG LC_* в /etc/ssh/ssh_config , поэтому она должна выглядеть так:

#SendEnv LANG LC_*
    
ответ дан Zhengpeng Hou 21.12.2013 в 15:12
5

Проблема

По умолчанию команда 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 [email protected]_host

Было бы удобнее, если вы сделаете псевдоним в ~/.bashrc :

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

Таким образом, директивы SendEnv по умолчанию в общесистемной конфигурации неэффективны, поэтому по умолчанию на сервер SSH не отправляются никакие переменные среды.

    
ответ дан Rockallite 22.01.2017 в 03:46
3

У меня была аналогичная проблема. Моим решением было прокомментировать 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> - имя хоста, которому I не не хочет отправлять какую-либо переменную среды.

    
ответ дан Gwendal 29.02.2016 в 11:30