Я провожу много времени ssh
на разных машинах, все они разные (некоторые встроены, некоторые работают под управлением Linux, некоторые работают под управлением BSD и т. Д.). Однако на своих локальных компьютерах я использую OS X, которая, конечно, имеет пользовательский интерфейс, основанный на BSD. Моя локаль на этих машинах установлена в en_GB.UTF-8, что является одним из доступных вариантов:
% echo `sw_vers`
ProductName: Mac OS X ProductVersion: 10.8.2 BuildVersion: 12C60
% locale -a | grep -i 'en_gb.utf'
en_GB.UTF-8
Некоторые из более мощных систем Linux, которые я использую, похоже, имеют эквивалентную опцию, но я отмечаю, что в Linux имя немного отличается:
% lsb_release -d
Description: Debian GNU/Linux 6.0.3 (squeeze)
% locale -a | grep -i 'en_gb.utf'
en_GB.utf8
Это заставляет меня задуматься: когда я ssh
захожу на Linux-машину с моего Mac, и она пересылает все мои LC_*
переменные с этим суффиксом «UTF-8», понимает ли эта Linux-машина, что о ней спрашивают? Или это просто отступление к какой-то другой локали?
редактировать: вот пример того, что я имею в виду:
% ssh -v odin
...
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LC_ALL = en_GB.UTF-8
debug1: Sending env LC_COLLATE = en_GB.UTF-8
debug1: Sending env LC_CTYPE = en_GB.UTF-8
debug1: Sending env LC_MESSAGES = en_GB.UTF-8
debug1: Sending env LC_MONETARY = en_GB.UTF-8
debug1: Sending env LC_NUMERIC = en_GB.UTF-8
debug1: Sending env LC_TIME = en_GB.UTF-8
debug1: Sending env LANG = en_GB.UTF-8
odin:~ % locale | tail -1 # locale is set to .UTF-8 without error...
LC_ALL=en_GB.UTF-8
odin:~ % locale -a | grep 'en_GB.UTF-8' # ... even though .UTF-8 isn't an option
odin:~ %
В любом случае, каков механизм его поведения и зависит ли он от какой-либо конкретной настройки (например, я увижу то же поведение в системе на основе BusyBox, что и на системе на основе GNU)?
Ответы:
Это интересный вопрос, но я думаю, что там может быть неправильное представление о том, как устанавливаются переменные. Когда инициируется сеанс безопасной оболочки (
ssh remotehost
), на другом конце происходит создание новой оболочки с отдельной средой. Это причудливый способ сказать, что сервер запускает новую оболочку. Эта новая оболочка может быть настроена с тем же языковым стандартом, что и исходная локальная оболочка.Например
Чтобы продемонстрировать это, я настроил локаль в удаленной оболочке для норвежского языка, добавив следующие строки в файл ~ / .bash_profile:
Точно так же вам придется настроить окружение на удаленной оболочке, чтобы сделать то же самое. Конечно, другие оболочки читают различные файлы запуска, такие как ~ / .zprofile для оболочки Z.
Я подозревал, что заблуждение заключается в том, что локальные переменные (настройки) никоим образом не пересылаются. Удаленная оболочка имеет свои настройки. Чтобы вывести список доступных языков на удаленном хосте, будь то минималистичная оболочка BusyBox или полноценная ОС GNU, используйте
locale
команду с-a
переключателем (как отмечено в вопросе). Любая из напечатанных строк может использоваться в качестве настройки локали для этой среды.Что касается первого вопроса, локаль по умолчанию, с которой начинается любая оболочка, обычно настраивается в центральном месте, например / etc / profile. Большинство логинов читают этот файл при запуске.
источник
/etc/ssh_config
на каждой машине, на которую я когда-либо смотрел, определяет этоLANG
иLC_*
отправляется на все хосты по умолчанию, иssh -v
показывает несколько строк вродеdebug1: Sending env LC_ALL = en_GB.UTF-8
. Конечно, если профиль оболочки на другом конце впоследствии переопределяет это, это другое дело - но на некоторых моих машинах это не такssh
переадресация носит случайный характер, это просто контекст того, почему мой язык настроен таким, какой он есть. Я просто не знаю, как определить, что на самом деле делает оболочка на другом конце - я обычно не получаю ошибок при попытке установить языковой стандарт (хотя иногда это происходит на встроенных устройствах), и ввод / вывод текста в Unicode выглядит как работать нормально (?), но используемая локаль явно отсутствует в системе. Большинство устройств Linux, к которым я подключаюсь, основаны на Debian или Ubuntu, в то время как другие основаны на uClibc / BusyBox (сетевые устройства и т. Д.).Различается ли имя поддержки UTF-8 в разных системах для следующей команды?
Если вы столкнулись с странные проблемы локали , связанные, это может помочь сказать клиенту SSH , чтобы не отправлять эти
LC_*
переменные закомментировавSendEnv LANG LC_*
в/etc/ssh_config
(см, например, крепления для Mac OS X Львиная SSH UTF-8 Проблемы и Terminal в OS X Lion: может Пиши на удаленной машине ).Другой подход к решению заключается в следующем:
источник