Змінні локальних файлів не мають ефекту у віддаленій оболонці (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, щоб отримати це повідомлення про помилку на віддалених серверах?


Відповіді:


167

Це тому, що для вашої локальної локальної машини встановлено німецьку мову, яку SSH пересилає та намагається використовувати на сервері, але ваш сервер не встановлений.

У вас є кілька варіантів:

  • Генеруйте локаль . Створіть німецьку локаль на сервері за допомогою sudo locale-gen de.

  • Зупиніть переадресовувати локаль від клієнта . Не пересилайте змінну оточуючої локальної мови з локальної машини на сервер. Ви можете прокоментувати SendEnv LANG LC_*рядок у локальному /etc/ssh/ssh_config файлі.

  • Перестаньте приймати локаль на сервері . Не приймайте змінну локального середовища від локальної машини до сервера. Ви можете прокоментувати AcceptEnv LANG LC_*рядок у віддаленому /etc/ssh/sshd_config файлі.

  • Встановіть мову сервера на англійську мову . Явно встановити локаль на англійській мові на сервері. Як приклад, ви можете додати наступні рядки до пульта ~/.bashrcчи ~/.profileфайлів:

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

Якщо у вас немає кореневого доступу до сервера, найкращим (і єдиним) способом може стати найкращий (і єдиний) спосіб зупинки переадресації з клієнтської опції.


2
Га! Я повністю пропустив той факт , що він перерахував клієнт регіональних налаштувань! Чудова робота ...
Іш

10
Я вирішив "Зупинити переадресацію локалі від клієнта". Добре працює. Для подальшої довідки: ви не можете змінити налаштування SendEnv з / etc / ssh / ssh_config у вашому локальному ~ / .ssh / config. Див 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 .. .
Halil Özgür

1
У моєму випадку встановлення локальної локальної системи ~/.profileвирішило мою проблему. Дякую.
Франциско

Якщо сервер не має німецької мови, чому його прийнятно замінити запитуване користувачем значення LANGчимось іншим? ..
Михайло Т.

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 незалежно від того, що я намагаюся, локалі все ще показують це порожнім.
Темна зірка1


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

Отже, якщо у вашій оболонці є змінні середовища, пов’язані з локальними, вони будуть заповнені до сеансу 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"

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


2
Майте на увазі, що файл конфігурації системи в / etc / ssh / config може містити додаткові рядки, які ви хочете зберегти у налаштуваннях користувача. Вам потрібно буде скопіювати їх у свій конфігураційний файл користувача у ~ / .ssh / config, щоб зберегти ці налаштування.
Стівен Мод

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>іменем хоста, якому я не хотів надсилати жодну змінну середовища.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.