Portabilidade de localidade UTF-8 (e ssh)

8

Eu gasto muito do meu tempo ssh em várias máquinas, todas diferentes (algumas são incorporadas, outras executam o Linux, outras executam o BSD, & c.). Em minhas próprias máquinas locais, no entanto, eu uso o OS X, que obviamente tem um userland baseado no BSD. Minha localidade nessas máquinas está definida como en_GB.UTF-8, que é uma das opções disponíveis:

% echo 'sw_vers'
ProductName: Mac OS X ProductVersion: 10.8.2 BuildVersion: 12C60
% locale -a | grep -i 'en_gb.utf'
en_GB.UTF-8

Vários dos sistemas Linux mais capazes que uso parecem ter uma opção equivalente, mas notei que no Linux o nome é um pouco diferente:

% lsb_release -d
Description: Debian GNU/Linux 6.0.3 (squeeze)
% locale -a | grep -i 'en_gb.utf' 
en_GB.utf8

Isso me faz pensar: quando eu ssh em uma máquina Linux do meu Mac, e ela encaminha todas as minhas LC_* variáveis com o sufixo 'UTF-8', essa máquina Linux ainda entende o que está sendo perguntado? disso? Ou é só voltar para algum outro local?

edit: Aqui está um exemplo do que estou me referindo:

% 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:~ % 

Em ambos os casos, qual é o mecanismo por trás de seu comportamento, e é dependente de qualquer configuração em particular (por exemplo, verei o mesmo comportamento em um sistema baseado em BusyBox como em um sistema baseado em GNU)?

    
por kine 02.12.2012 / 23:46

2 respostas

0

É uma questão interessante, mas acho que pode haver um equívoco sobre como as variáveis são configuradas. Quando uma sessão de shell segura é iniciada ( ssh remotehost ), o que acontece na outra extremidade é uma instanciação de um novo shell com um ambiente separado. Essa é uma maneira elegante de dizer que o servidor inicia um novo shell. Esse novo shell pode ou não ser configurado com a mesma localidade do seu shell local original.

Por exemplo

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

Para demonstrar isso, configurei o código do idioma no shell remoto do norueguês adicionando as seguintes linhas ao arquivo ~ / .bash_profile:

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

Da mesma forma, você terá que configurar o ambiente no shell remoto para fazer o mesmo. É claro que outras shells lêem arquivos de inicialização diferentes, como ~ / .zprofile, para o shell Z.

O equívoco que eu suspeitava estava em que as variáveis locais (configurações) não são de forma alguma encaminhadas. O shell remoto tem suas próprias configurações. Para listar os idiomas disponíveis no host remoto, seja um shell BusyBox minimalista ou um SO GNU completo, use o comando locale com a opção -a (conforme observado na pergunta). Qualquer uma das linhas impressas pode ser usada como uma configuração de localidade para esse ambiente.

Quanto à primeira pergunta, a localidade padrão na qual qualquer shell é iniciado geralmente é configurada em um local central, como / etc / profile. A maioria das caixas de login lê esse arquivo na inicialização.

    
por 03.12.2012 / 07:16
0

O nome do suporte a UTF-8 é um pouco diferente em sistemas diferentes para o seguinte comando também?

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

Se você encontrar problemas estranhos relacionados a localidade, pode ser útil informar ao cliente SSH para não enviar essas LC_* variáveis comentando SendEnv LANG LC_* em /etc/ssh_config (veja, por exemplo, Corrigindo os problemas SSH UTF-8 do Mac OS X Lion e < a href="https://superuser.com/questions/315202/terminal-in-os-x-lion-cant-write-aao-on-remote-machine"> Terminal no OS X Lion: não é possível escrever åäö na máquina remota ).

Outra abordagem de solução é esta:

# 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 #
    
por 15.03.2013 / 18:37