Zmienne regionalne nie mają wpływu na zdalną powłokę (perl: ostrzeżenie: Ustawienie regionalne nie powiodło się).

89

Mam świeżą instalację Ubuntu 12.04. Kiedy łączę się ze swoim zdalnym serwerem, mam takie błędy:

~$ 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.
...

Nie mam tego problemu, gdy łączę się ze starszą instalacją Ubuntu. To jest wyjście z mojej instalacji Ubuntu 12.04, LANG i LANGUAGE są ustawione

$ 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=

Czy ktoś wie, co zmieniło się w Ubuntu, aby otrzymać ten komunikat o błędzie na zdalnych serwerach?

Janning
źródło
1
możliwy duplikat Jak naprawić problem z lokalizacją?
Fabby

Odpowiedzi:

167

Wynika to z faktu, że twoje ustawienia regionalne na twoim komputerze lokalnym są ustawione na niemiecki, który SSH przesyła dalej i próbuje użyć na serwerze, ale twój serwer nie ma go zainstalowanego.

Masz kilka opcji:

  • Wygeneruj ustawienia regionalne . Wygeneruj niemieckie ustawienia regionalne na serwerze za pomocą sudo locale-gen de.

  • Zatrzymaj przekazywanie ustawień regionalnych od klienta . Nie przesyłaj lokalnej zmiennej środowiskowej z komputera lokalnego na serwer. Możesz skomentować SendEnv LANG LC_*wiersz w pliku lokalnym /etc/ssh/ssh_config .

  • Przestań akceptować ustawienia regionalne na serwerze . Nie akceptuj zmiennej środowiskowej locale z komputera lokalnego na serwer. Możesz skomentować AcceptEnv LANG LC_*linię w zdalnym /etc/ssh/sshd_config pliku.

  • Ustaw ustawienia regionalne serwera na angielski . Jawnie ustaw język lokalny na angielski na serwerze. Na przykład możesz dodać następujące wiersze do pilota ~/.bashrclub ~/.profileplików:

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

Jeśli nie masz dostępu administratora do serwera, opcja Zatrzymaj przekazywanie ustawień regionalnych z klienta może być najlepszym (i jedynym) sposobem.

David Planella
źródło
2
Hah! Tęskniłem za faktem, że wymienił ustawienia regionalne klienta ! Świetna robota ...
ish
10
Postanowiłem „Przestać przekazywać ustawienia regionalne od klienta”. Działa w porządku. Do wykorzystania w przyszłości: nie możesz przesłonić ustawień SendEnv z / etc / ssh / ssh_config w twoim lokalnym ~ / .ssh / config. Zobacz bugzilla.mindrot.org/show_bug.cgi?id=1285
Janning
3
W połączeniu z bugs.php.net/bug.php?id=18556 wysyłanie ustawień narodowych przez SSH może powodować prawdziwe problemy (i faktycznie dla mnie spowodowane), zobacz bugzilla.mindrot.org/show_bug.cgi?id=1285#c9 .. .
Halil Özgür
1
W moim przypadku ustawienie regionalne ~/.profilerozwiązało problem. Dzięki.
Francisco,
Jeśli serwer nie ma niemieckiego ustawienia narodowego, dlaczego dopuszczalne jest zastąpienie żądanej przez użytkownika wartości LANGinną nazwą ?
Mikhail T.,
26

Może się to zdarzyć czasami przy świeżych minimalnych / alternatywnych instalacjach lub w innych sytuacjach. Poprawka jest dość prosta. Wypróbuj je w następującej kolejności, testując po każdym, aby sprawdzić, czy sytuacja została naprawiona:

1. Ponownie skonfiguruj ustawienia regionalne

  • sudo dpkg-reconfigure locales
    • jeśli to nie działa,

2. Ponownie zainstaluj pakiet językowy ustawień regionalnych

  • sudo apt-get --reinstall install language-pack-de
    • jeśli to nie działa,

3. Ręcznie wymuś ustawienia regionalne (trwałe)

  • sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8
ish
źródło
Mam problem z JVM i próbuję ustawić ustawienia regionalne systemu również w 12.04. Jedynym problemem jest to, że nie mogę ustawić LC_ALL bez względu na to, co spróbuję, ustawienia regionalne nadal pokazują go jako pustego.
Dark Star1
15

Komentarz linię SendEnv LANG LC_*w /etc/ssh/ssh_config, tak jak powinien wyglądać tak:

#SendEnv LANG LC_*
Zhengpeng Hou
źródło
10

Problem

Domyślnie polecenie klienta ssh przekazuje zmienne środowiskowe związane z ustawieniami regionalnymi do serwera SSH. Jest to określone /etc/ssh/ssh_configpo stronie klienta:

Host *
    SendEnv LANG LC_*

Domyślnie serwer SSH akceptuje je ( /etc/ssh/sshd_configna serwerze):

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

Jeśli więc w powłoce znajdują się zmienne środowiskowe związane z ustawieniami regionalnymi, zostaną one zapełnione do sesji SSH po stronie serwera.

Niestety SendEnvopcja jest kumulatywna . Według 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.

co oznacza, że ​​nie można go zastąpić .

Rozwiązanie

Czasami zmiana konfiguracji całego systemu jest niemożliwa lub nierozsądna, szczególnie po stronie serwera. Możesz jednak to ominąć . I to jest efekt uboczny -Fopcji w poleceniu ssh. Według 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.

Domyślnie plik konfiguracyjny dla użytkownika ~/.ssh/configjest używany, jeśli jest prezentowany. Ale możesz to wyraźnie określić w wierszu poleceń, aby ominąć /etc/ssh/ssh_config:

$ touch ~/.ssh/config
$ ssh -F ~/.ssh/config your_user@your_host

Bardziej wygodne byłoby utworzenie aliasu w ~/.bashrc:

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

W ten sposób domyślne SendEnvdyrektywy w konfiguracji ogólnosystemowej nie działają, dlatego domyślnie żadne zmienne środowiskowe nie są wysyłane do serwera SSH.

Rockallite
źródło
2
Pamiętaj, że plik konfiguracji systemu w / etc / ssh / config może zawierać dodatkowe wiersze, które chcesz zachować w konfiguracji użytkownika. Będziesz musiał skopiować je do pliku konfiguracyjnego użytkownika w ~ / .ssh / config, aby zachować te ustawienia.
Steven Maude
4

Miałem podobny problem. Moim rozwiązaniem było skomentowanie SendEnvwierszy w /etc/ssh/ssh_config(ponieważ nie można ich zastąpić) i dodanie następującego wpisu ~/.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    

z <somehost>nazwą hosta, do którego nie chciałem wysyłać żadnej zmiennej środowiskowej.

Gwendal
źródło