Obce znaki nie będą wyświetlane w SSH

17

Mam pewne problemy z używaniem sshi zdalnym serwerem (do którego nie mam uprawnień administratora) - W szczególności jest tam kilka folderów z tekstem koreańskim i cyrylicy.

Gdy wyświetlam zawartość folderu nadrzędnego za pomocą ls, znaki są oznaczone jako „?”. Być może warto zauważyć, że koreańskie postacie wydają się uciekać znacznie bardziej niż liczba znaków, które powinny tam być.

Wiem, że program terminalowy, którego używam, może wyświetlać znaki, ponieważ używanie sftpwyświetla je doskonale. Problem występuje na wszystkich terminalach, które próbowałem.

Podsumowanie maszyn

Maszyna lokalna:

  • Linux 2.6.32-5-686, i686
  • Debian GNU / Linux 6.0.2 (squeeze)
  • Masz dostęp administratora

Zdalny serwer:

  • Linux 2.6.32-bpo.5-amd64, x86_64
  • Debian GNU / Linux 5.0.8 (lenny)
  • Nie masz dostępu administracyjnego ani fizycznego

Prawdopodobnie przeoczyłem jakieś inne istotne statystyki lub trochę informacji, w takim przypadku przepraszam. Jestem całkiem nowy po stronie komputerów innych niż Windows, więc ledwo wiem, co tu robię.

ChemicalRascal
źródło
2
wyślij wyjście z poleceń localei locale -a, zarówno lokalnie, jak i zdalnie, proszę
enzotib
Dzięki @enzotib - Twój komentarz skłonił mnie do pomysłu, że oferowane lokalizacje mogą nie być takie same lokalnie i zdalnie.
ChemicalRascal

Odpowiedzi:

20

Twój locale informacja nie jest poprawnie skonfigurowany na serwerze. W szczególności LC_CTYPEzmienna, która wskazuje na kodowanie znaków na terminalu, nie jest ustawiona poprawnie (lub, jak podejrzewam, w ogóle).

W lokalnym terminalu uruchom, localeaby zobaczyć ustawienia regionalne. Prawdopodobnie zobaczysz (między innymi wierszami) coś takiego LC_CTYPE=en_US.UTF-8; liczy się tu .UTF-8część wskazująca kodowanie UTF-8 . Jest to de facto standardowe kodowanie tekstu wielojęzycznego w świecie unixowym (i nie tylko).

Musisz przekazać te informacje do serwera. Najlepszym sposobem, jeśli działa, jest wysyłanie informacji o ustawieniach regionalnych za pośrednictwem połączenia ssh. W tym celu dodaj następujące wiersze na końcu ~/.ssh/config:

Host *
SendEnv LC_* LANG

Wymaga to AcceptEnvobecności odpowiedniej dyrektywy w konfiguracji serwera ( /etc/ssh/sshd_config) (jest to domyślnie w Debianie).

Jeśli to nie zadziała i zawsze logujesz się do serwera z terminala UTF-8, dodaj linię export LC_CTYPE=en_US.UTF-8do swojego ~/.bashrcserwera ( ~/.zshrclub dowolnego innego pliku używanego przez powłokę). Nazwa ustawień regionalnych (np. en_US.UTF-8) Musi być jedną z tych oferowanych przez locale -ai musi mieć .UTF-8(lub .utf8inną trywialną odmianę).

Gilles „SO- przestań być zły”
źródło
1
Ach! To byłby problem: „używam” en_AU.utf8 lokalnie, który zdawał się być już przesłany na serwer (lub przynajmniej localedopasowane wyjścia). Jednak locale -azdalnie podawał tylko en_GB.utf8 i en_US.utf8. Dzięki!
ChemicalRascal
1
Aby uzyskać kodowanie bieżących ustawień locale charmap
Moje /etc/ssh/ssh_configwymagane również wysyłanie LANG( SendEnv LANG LC_*)
Shammel Lee
I musiałem dodać export LC_CTYPE=en_US.UTF-8do mojego ~/.profilepo stronie serwera. Dodanie go do ~/.bashrcwydawało się nie mieć żadnego efektu.
datka