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

1
задан 16 February 2014 в 21:48

4 ответа

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

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

sudo dpkg-reconfigure locales, если это не сработает,

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

sudo dpkg-reconfigure locales, если это не сработает,

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

sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8
26
ответ дан 25 May 2018 в 10:47
  • 1
    У меня проблема с JVM, и я пытаюсь установить локаль системы в 12.04. Единственная проблема заключается в том, что я не могу установить LC_ALL независимо от того, что я пытаюсь сделать, локали все еще показывают его как пустую. – Dark Star1 11 December 2012 в 07:09

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

#SendEnv LANG LC_*
13
ответ дан 25 May 2018 в 10:47

Проблема

По умолчанию команда 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 не отправляются никакие переменные среды.

5
ответ дан 25 May 2018 в 10:47
  • 1
    Имейте в виду, что файл конфигурации системы в файле / etc / ssh / config может содержать дополнительные строки, которые вы хотите сохранить в своей пользовательской конфигурации. Вам нужно будет скопировать их в свой файл конфигурации пользователя в ~ / .ssh / config, чтобы сохранить эти настройки. – Steven Maude 23 January 2017 в 20:35

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

3
ответ дан 25 May 2018 в 10:47

Другие вопросы по тегам:

Похожие вопросы: