Paso gran parte de mi tiempo ssh
editado en varias máquinas, todas las cuales son diferentes (algunas están integradas, algunas ejecutan Linux, algunas ejecutan BSD, etc.). Sin embargo, en mis propias máquinas locales, uso OS X, que por supuesto tiene un país de usuario basado en BSD. Mi configuración regional en esas máquinas está establecida en en_GB.UTF-8, que es una de las opciones disponibles:
% echo `sw_vers`
ProductName: Mac OS X ProductVersion: 10.8.2 BuildVersion: 12C60
% locale -a | grep -i 'en_gb.utf'
en_GB.UTF-8
Varios de los sistemas Linux más capaces que uso parecen tener una opción equivalente, pero observo que en Linux el nombre es ligeramente diferente:
% lsb_release -d
Description: Debian GNU/Linux 6.0.3 (squeeze)
% locale -a | grep -i 'en_gb.utf'
en_GB.utf8
Esto me hace preguntarme: cuando entro ssh
en una máquina Linux desde mi Mac, y reenvía todas mis LC_*
variables con ese sufijo 'UTF-8', ¿esa máquina Linux comprende lo que se le pide? ¿O simplemente se está volviendo a otro lugar?
editar: Aquí hay un ejemplo de lo que me refiero:
% 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:~ %
En cualquier caso, ¿cuál es el mecanismo detrás de su comportamiento, y depende de una configuración particular (por ejemplo, ¿veré el mismo comportamiento en un sistema basado en BusyBox que en uno basado en GNU)?
Respuestas:
Es una pregunta interesante, pero creo que puede haber una idea errónea sobre cómo se configuran las variables. Cuando se inicia una sesión de shell segura (
ssh remotehost
), lo que sucede en el otro extremo es una instanciación de un nuevo shell con un entorno separado. Esa es una forma elegante de decir que el servidor inicia un nuevo shell. Ese nuevo shell puede o no configurarse con la misma configuración regional que su shell local original.P.ej
Para demostrar esto, configuré la configuración regional en el shell remoto para Norwegian agregando las siguientes líneas al archivo ~ / .bash_profile:
Del mismo modo, tendrá que configurar el entorno en el shell remoto para hacer lo mismo. Por supuesto, otros shells leen diferentes archivos de inicio como ~ / .zprofile para el shell Z.
La idea errónea que sospeché radica en que las variables locales (configuraciones) no se envían de ninguna manera. El shell remoto tiene su propia configuración. Para enumerar los idiomas disponibles en el host remoto, ya sea un shell BusyBox minimalista o un sistema operativo GNU completo, use el
locale
comando con el-a
interruptor (como se indica en la pregunta). Cualquiera de las líneas impresas se puede usar como una configuración regional para ese entorno.En cuanto a la primera pregunta, la configuración regional predeterminada con la que comienza cualquier shell generalmente se configura en un lugar central como / etc / profile. La mayoría de los shells de inicio de sesión leen este archivo al inicio.
fuente
/etc/ssh_config
en cada máquina que he visto define esoLANG
yLC_*
se envía a todos los hosts de forma predeterminada, yssh -v
revela varias líneas comodebug1: Sending env LC_ALL = en_GB.UTF-8
. Por supuesto, si el perfil de la cáscara en el otro extremo anula posteriormente que, eso es otra cosa - pero en algunos de mis máquinas, que no es el casossh
reenvío es incidental, es solo el contexto de por qué mi configuración regional está configurada de la manera en que está. Simplemente no sé cómo determinar qué está haciendo realmente el shell en el otro extremo; por lo general, no recibo errores al intentar configurar la configuración regional (aunque a veces lo hago en dispositivos integrados), y la entrada / visualización de texto Unicode parece funciona normalmente (?), pero la configuración regional que estoy usando obviamente no está presente en el sistema. La mayoría de los dispositivos Linux a los que me conecto están basados en Debian o Ubuntu, mientras que otros están basados en uClibc / BusyBox (dispositivos de red, etc.).¿El nombre del soporte UTF-8 también es ligeramente diferente en diferentes sistemas para el siguiente comando?
Si encuentra problemas extraños relacionados con la configuración regional, puede ser útil decirle al cliente SSH que no envíe esas
LC_*
variables comentandoSendEnv LANG LC_*
en/etc/ssh_config
(consulte, por ejemplo, Solucionar problemas y terminal SSH UTF-8 de Mac OS X Lion en OS X Lion: puede No escriba åäö en la máquina remota ).Otro enfoque de solución es este:
fuente