Іноземні символи не відображатимуться в SSH


17

У мене є проблеми з використанням sshі віддаленим сервером (до якого я не маю доступу адміністратора) - Зокрема, там є кілька папок з текстом корейської та кирилиці.

Коли я показую вміст батьківської папки із lsсимволами, символи залишаються як "?". Можливо, слід зазначити, що корейські символи, схоже, врятуються набагато більше, ніж кількість символів, які там повинні бути.

Я знаю, що термінальна програма, яку я використовую, може відображати символи, оскільки використання sftpвідображає їх ідеально. Проблема виникає на всіх терміналах, які я пробував.

Підсумок машин

Місцева машина:

  • Linux 2.6.32-5-686, i686
  • Debian GNU / Linux 6.0.2 (стискати)
  • Мати доступ адміністратора

Віддалений сервер:

  • Linux 2.6.32-bpo.5-amd64, x86_64
  • Debian GNU / Linux 5.0.8 (lenny)
  • Не мати адміністраторського доступу, ані фізичного

Я, мабуть, пропустив якусь іншу життєво важливу статистику або трохи інформації, і в цьому випадку прошу вибачення. Я досить новачок у цілій стороні обчислень, які не є Windows, тому я ледве знаю, що я тут роблю.


2
розміщуйте localelocale -a
висновки

Дякую @enzotib - Ваш коментар спонукав мене до думки про те, що запропоновані локалі можуть бути не однаковими локально та віддалено.
ChemicalRascal

Відповіді:


20

Ваша інформація про місцевість неправильно налаштована на сервері. Зокрема, LC_CTYPEзмінна, яка вказує на кодування символів на терміналі, встановлена ​​неправильно (або, підозрюю, взагалі).

У локальному терміналі запустіть, localeщоб побачити налаштування вашої мови. Ви, мабуть, побачите (серед інших рядків) щось подібне LC_CTYPE=en_US.UTF-8; Тут важлива .UTF-8частина, що вказує кодування UTF-8 . Це фактичне стандартне кодування для багатомовного тексту у світі Unix (і за його межами).

Вам потрібно передати цю інформацію на сервер. Найкращий спосіб, якщо він працює, - це надсилання інформації про локаль через ssh-з'єднання. Для цього додайте наступні рядки наприкінці ~/.ssh/config:

Host *
SendEnv LC_* LANG

Це вимагає, щоб AcceptEnvу конфігурації сервера була присутня відповідна директива ( /etc/ssh/sshd_config) (це за замовчуванням у Debian).

Якщо це не працює, і ви завжди входите на сервер через термінал UTF-8, додайте рядок export LC_CTYPE=en_US.UTF-8до свого ~/.bashrcсервера ( ~/.zshrcабо будь-якого файлу, який використовує ваша оболонка). Ім'я локалі (наприклад en_US.UTF-8) повинно бути одним із запропонованих locale -aі має мати .UTF-8( .utf8або деяку тривіальну варіацію).


1
Ах! У цьому і буде проблема: я "використовую" en_AU.utf8 локально, який, здавалося, вже перенаправлений на сервер (або, принаймні, localeрезультати відповідають). Однак locale -aвіддалено давав лише en_GB.utf8 та en_US.utf8. Спасибі!
ChemicalRascal

1
Щоб отримати кодування поточного локалу, ви також можете скористатися:locale charmap

Моє /etc/ssh/ssh_configтакож потрібно відправити LANG( SendEnv LANG LC_*)
Шаммель Лі

І мені потрібно було додати export LC_CTYPE=en_US.UTF-8до свого ~/.profileна сервері. Додавання цього, ~/.bashrcздавалося, не має ефекту.
датка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.