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?
Odpowiedzi:
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
~/.bashrc
lub~/.profile
plików:Jeśli nie masz dostępu administratora do serwera, opcja Zatrzymaj przekazywanie ustawień regionalnych z klienta może być najlepszym (i jedynym) sposobem.
źródło
~/.profile
rozwiązało problem. Dzięki.LANG
inną nazwą ?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
2. Ponownie zainstaluj pakiet językowy ustawień regionalnych
sudo apt-get --reinstall install language-pack-de
3. Ręcznie wymuś ustawienia regionalne (trwałe)
sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8
źródło
Komentarz linię
SendEnv LANG LC_*
w/etc/ssh/ssh_config
, tak jak powinien wyglądać tak:źródło
Problem
Domyślnie polecenie klienta ssh przekazuje zmienne środowiskowe związane z ustawieniami regionalnymi do serwera SSH. Jest to określone
/etc/ssh/ssh_config
po stronie klienta:Domyślnie serwer SSH akceptuje je (
/etc/ssh/sshd_config
na serwerze):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
SendEnv
opcja jest kumulatywna . Wedługman 5 ssh_config
: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
-F
opcji w poleceniu ssh. Wedługman ssh
:Domyślnie plik konfiguracyjny dla użytkownika
~/.ssh/config
jest używany, jeśli jest prezentowany. Ale możesz to wyraźnie określić w wierszu poleceń, aby ominąć/etc/ssh/ssh_config
:Bardziej wygodne byłoby utworzenie aliasu w
~/.bashrc
:W ten sposób domyślne
SendEnv
dyrektywy w konfiguracji ogólnosystemowej nie działają, dlatego domyślnie żadne zmienne środowiskowe nie są wysyłane do serwera SSH.źródło
Miałem podobny problem. Moim rozwiązaniem było skomentowanie
SendEnv
wierszy w/etc/ssh/ssh_config
(ponieważ nie można ich zastąpić) i dodanie następującego wpisu~/.ssh/config
:z
<somehost>
nazwą hosta, do którego nie chciałem wysyłać żadnej zmiennej środowiskowej.źródło