Je passe beaucoup de temps ssh
sur différentes machines, toutes différentes (certaines sont intégrées, certaines exécutent Linux, certaines exécutent BSD, etc.). Sur mes propres machines locales, cependant, j'utilise OS X, qui a bien sûr un espace utilisateur basé sur BSD. Mon environnement local sur ces machines est défini sur en_GB.UTF-8, qui est l'une des options 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
Plusieurs des systèmes Linux les plus performants que j'utilise semblent avoir une option équivalente, mais je note que sous Linux, le nom est légèrement différent:
% lsb_release -d
Description: Debian GNU/Linux 6.0.3 (squeeze)
% locale -a | grep -i 'en_gb.utf'
en_GB.utf8
Cela me fait me demander: lorsque j'entre ssh
dans une machine Linux à partir de mon Mac et qu'il transfère toutes mes LC_*
variables avec ce suffixe «UTF-8», cette machine Linux comprend-elle même ce qui lui est demandé? Ou est-ce que cela revient simplement à un autre endroit?
edit: Voici un exemple de ce à quoi je fais référence:
% 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:~ %
Dans les deux cas, quel est le mécanisme derrière son comportement et dépend-il d'une configuration particulière (par exemple, verrai-je le même comportement sur un système basé sur BusyBox que sur un système basé sur GNU)?
Réponses:
C'est une question intéressante, mais je pense qu'il peut y avoir une idée fausse là-dessus sur la façon dont les variables sont configurées. Lorsqu'une session shell sécurisée est lancée (
ssh remotehost
), ce qui se passe à l'autre extrémité est une instanciation d'un nouveau shell avec un environnement séparé. C'est une façon élégante de dire que le serveur démarre un nouveau shell. Ce nouveau shell peut être configuré ou non avec les mêmes paramètres régionaux que votre shell local d'origine.Par exemple
Afin de le démontrer, j'ai configuré les paramètres régionaux sur le shell distant pour le norvégien en ajoutant les lignes suivantes au fichier ~ / .bash_profile:
De même, vous devrez configurer l'environnement sur le shell distant pour faire de même. Bien sûr, d'autres shells lisent différents fichiers de démarrage tels que ~ / .zprofile pour le shell Z.
L'idée fausse que je soupçonnais résidait dans le fait que les variables locales (paramètres) ne sont en aucun cas transmises. Le shell distant a ses propres paramètres. Afin de répertorier les langues disponibles sur l'hôte distant, que ce soit un shell BusyBox minimaliste ou un OS GNU complet, utilisez la
locale
commande avec le-a
commutateur (comme indiqué dans la question). N'importe laquelle des lignes imprimées peut être utilisée comme paramètre de paramètres régionaux pour cet environnement.Comme pour la première question, les paramètres régionaux par défaut avec lesquels tout shell démarre sont généralement configurés dans un emplacement central tel que / etc / profile. La plupart des shells de connexion lisent ce fichier au démarrage.
la source
/etc/ssh_config
sur chaque machine que j'ai jamais vue définit celaLANG
etLC_*
est envoyé à tous les hôtes par défaut, etssh -v
révèle plusieurs lignes commedebug1: Sending env LC_ALL = en_GB.UTF-8
. Bien sûr, si le profil de shell à l'autre extrémité l'emporte par la suite, c'est une autre chose - mais sur certaines de mes machines, ce n'est pas le casssh
trucs de transfert sont accessoires, c'est juste le contexte pour lequel mes paramètres régionaux sont définis tels quels. Je ne sais tout simplement pas comment déterminer ce que fait réellement le shell à l'autre extrémité - je n'obtiens généralement pas d'erreurs en essayant de définir les paramètres régionaux (bien que je le fasse parfois sur les périphériques intégrés), et la saisie / l'affichage de texte Unicode semble fonctionne normalement (?), mais les paramètres régionaux que j'utilise ne sont évidemment pas présents sur le système. La plupart des périphériques Linux auxquels je me connecte sont basés sur Debian ou Ubuntu, tandis que d'autres sont basés sur uClibc / BusyBox (appliances réseau, etc.).Le nom de la prise en charge UTF-8 est-il légèrement différent sur différents systèmes pour la commande suivante également?
Si vous rencontrez des étranges questions relatives à la locale, il peut aider à dire au client SSH de ne pas envoyer les
LC_*
variables en commentantSendEnv LANG LC_*
dans/etc/ssh_config
(voir, par exemple, fixation Mac OS X UTF-8 SSH Lion Questions et Terminal sous Mac OS X Lion: la boîte n'écrivez pas åäö sur une machine distante ).Une autre approche de solution est la suivante:
la source