Иностранные символы не будут отображаться в 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)
  • Нет доступа администратора или физического

Я, вероятно, пропустил некоторые другие важные статистические данные или немного информации, и в этом случае я прошу прощения. Я довольно новичок во всех сторонних вычислениях, поэтому я едва знаю, что я здесь делаю.

ChemicalRascal
источник
2
разместить выход из localeи locale -aкоманд, как локально и удаленно, пожалуйста
enzotib
Спасибо @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_*)
Shammel Lee
И мне нужно было добавить export LC_CTYPE=en_US.UTF-8мой ~/.profileна стороне сервера. Добавление этого, ~/.bashrcказалось, не имело никакого эффекта.
датка