8

Я провожу много своего времени 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)?

2 ответа2

0

Различается ли имя поддержки UTF-8 в разных системах и для следующей команды?

LC_ALL='' locale charmap  # UTF-8 (on Mac OS X 10.6.8)

Если вы столкнулись со странными проблемами, связанными с локалью , это может помочь клиенту SSH не отправлять эти переменные LC_* , SendEnv LANG LC_* в /etc/ssh_config (см., Например, Исправление Mac OS X Lion SSH UTF- 8 Проблемы и Терминал в OS X Lion: невозможно записать текст на удаленной машине).

Другой подход к решению заключается в следующем:

# from: http://mod16.org/hurfdurf/?p=189
tjac wrote:
Actually the real problem that's causing this is that Mac OS 10.7 sets totally 
non-standard locale values, at least when you tweak some of the formats in
SysPrefs/Language&Text as I did.

If you type "locale" on your Mac terminal you should see pretty much the same as on 
other Unices (e.g. lots of en_US.UTF-8s if you prefer US English), but you don't. 
If these garbled settings get transferred to other Unix hosts by the SendEnv option 
they naturally do not know what's going on.

So if you want to fix it cleanly to allow for sshing to all kinds of remote hosts,
including those with older character sets, put the following lines in your 
~/.bash_profile on your Mac client machine.

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

Monday, September 12, 2011 at 22:54 #
0

Это интересный вопрос, но я думаю, что там может быть неправильное представление о том, как устанавливаются переменные. Когда инициируется сеанс защищенной оболочки (ssh remotehost), то, что происходит на другом конце, - это создание новой оболочки с отдельной средой. Это причудливый способ сказать, что сервер запускает новую оболочку. Эта новая оболочка может или не может быть настроена с тем же языковым стандартом, что и ваша исходная локальная оболочка.

Например

geee: ~
$ echo `locale |grep LANG` :: `date`
LANG=en_US.UTF-8 :: Mon Dec 3 07:04:00 CET 2012

$ ssh flode
flode: ~
$ echo `locale |grep LANG` :: `date`
LANG=nb_NO.UTF-8 LANGUAGE=nb_NO.UTF-8 :: ma. 03. des. 06:59:33 +0100 2012

Чтобы продемонстрировать это, я настроил локаль в удаленной оболочке для норвежского языка, добавив следующие строки в файл ~/.bash_profile:

export     LANG=nb_NO.UTF-8
export LANGUAGE=nb_NO.UTF-8
export   LC_ALL=nb_NO.UTF-8

Точно так же вам придется настроить окружение на удаленной оболочке, чтобы сделать то же самое. Конечно, другие оболочки читают разные файлы запуска, такие как ~/.zprofile для оболочки Z.

Я подозревал, что заблуждение заключается в том, что локальные переменные (настройки) никоим образом не пересылаются. Удаленная оболочка имеет свои настройки. Чтобы вывести список доступных языков на удаленном хосте, будь то минималистичная оболочка BusyBox или полноценная ОС GNU, используйте команду locale с ключом -a (как отмечено в вопросе). Любая из напечатанных строк может использоваться в качестве настройки локали для этой среды.

Что касается первого вопроса, локаль по умолчанию, с которой начинается любая оболочка, обычно настраивается в центральном месте, например /etc /profile. Большинство логинов читают этот файл при запуске.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .