Eu passo muito do meu tempo ssh
em várias máquinas, todas diferentes (algumas são incorporadas, outras rodam Linux, outras rodam BSD etc.). Em minhas próprias máquinas locais, no entanto, eu uso o OS X, que obviamente possui uma área de usuário baseada no BSD. Minha localidade nessas máquinas é 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 eu uso parecem ter uma opção equivalente, mas observo 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 entro ssh
em uma máquina Linux do meu Mac, e encaminha todas as minhas LC_*
variáveis com o sufixo 'UTF-8', essa máquina Linux entende o que está sendo solicitado? Ou está apenas voltando a 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 qualquer um dos casos, qual é o mecanismo por trás de seu comportamento e depende de qualquer configuração específica (por exemplo, vou ver o mesmo comportamento em um sistema baseado no BusyBox e em um baseado no GNU)?
Respostas:
É uma pergunta interessante, mas acho que pode haver um equívoco sobre como as variáveis são configuradas. Quando uma sessão segura do shell é iniciada (
ssh remotehost
), o que acontece na outra extremidade é a instanciação de um novo shell com um ambiente separado. Essa é uma maneira elegante de dizer que o servidor inicia um shell novo. Esse novo shell pode ou não ser configurado com o mesmo código de idioma que o seu shell local original.Por exemplo
Para demonstrar isso, configurei o código do idioma no shell remoto para o norueguês adicionando as seguintes linhas ao arquivo ~ / .bash_profile:
Da mesma forma, você precisará configurar o ambiente no shell remoto para fazer o mesmo. Obviamente, outros shells leem arquivos de inicialização diferentes, como ~ / .zprofile para o shell Z.
O equívoco que eu suspeitava era 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 sistema operacional GNU completo, use o
locale
comando com o-a
comutador (conforme observado na pergunta). Qualquer uma das linhas impressas pode ser usada como uma configuração de localidade para esse ambiente.Quanto à primeira pergunta, o código do idioma padrão com o qual qualquer shell inicia é geralmente configurado em um local central, como / etc / profile. A maioria dos shells de login lê esse arquivo na inicialização.
fonte
/etc/ssh_config
em todas as máquinas que eu já vi define issoLANG
eLC_*
ser enviado a todos os hosts por padrão, essh -v
revela várias linhas comodebug1: Sending env LC_ALL = en_GB.UTF-8
. Claro, se o perfil shell na outra extremidade substitui posteriormente que, isso é outra coisa - mas em algumas das minhas máquinas, que não é o casossh
material de encaminhamento é incidental, é apenas o contexto para o motivo pelo qual minha localidade está definida. Eu apenas não sei como determinar o que o shell do outro lado está realmente fazendo - eu normalmente não recebo erros ao tentar definir o local (embora às vezes eu faço isso em dispositivos incorporados), e a entrada / exibição de texto Unicode parece trabalho normalmente (?), mas o local que estou usando obviamente não está presente no sistema. A maioria dos dispositivos Linux aos quais eu conecto são baseados em Debian ou Ubuntu, enquanto outros são baseados em uClibc / BusyBox (dispositivos de rede, etc.).O nome do suporte UTF-8 é um pouco diferente em sistemas diferentes para o seguinte comando também?
Se você encontrar problemas relacionados à localidade estranhas, ele pode ajudar a informar o cliente SSH para não enviar essas
LC_*
variáveis comentandoSendEnv LANG LC_*
em/etc/ssh_config
(ver, por exemplo, fixação do Mac OS X Lion SSH UTF-8 Questões e Terminal no OS X Lion: lata escreva åäö em uma máquina remota ).Outra abordagem de solução é a seguinte:
fonte