SSH et les erreurs de locales

- Unix

J’ai changé de Mac cet été et j’en ai profité pour changer la langue de l’OS oour passer du français à l’anglais. Je ne l’avais pas remarqué de suite, mais ce changement à eu un effet de bord fort désagréable : je voyais souvent passer des messages d’erreurs de locales mais je n’y ai pas preté attention, jusqu’à ce que je ne puisse plus me connecter à la SheevaBoite avec mosh.

En effet, la connexion était refusé au prétexte que certaines locales n’étaient pas bonnes où manquantes :

$> mosh sheevaboite.fr 
The locale requested by LC_CTYPE=UTF-8 isn't available here.
Running `locale-gen UTF-8' may be necessary.

The locale requested by LC_CTYPE=UTF-8 isn't available here.
Running `locale-gen UTF-8' may be necessary.

mosh-server needs a UTF-8 native locale to run.

Unfortunately, the local environment (LC_CTYPE=UTF-8) specifies
the character set "US-ASCII",

The client-supplied environment (LC_CTYPE=UTF-8) specifies
the character set "US-ASCII".

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=
LANGUAGE=
LC_CTYPE=UTF-8
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
Connection to sheevaboite.fr closed.
/usr/local/bin/mosh: Did not find mosh server startup message.

Comme je pouvais encore me connecter en SSH “classique” je ne me suis pas penché plus que ça sur la question. Et puis je me suis rendu compte que sur d’autres serveurs, j’avais le même genre de messages d’erreurs en particulier lorsque j’installais un paquet :

$> apt-get install paquetX paquetY
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = "en_GB:en",
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LANG = "en_GB.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

La majorité des solutions sur le net que j’ai trouvé parlait de variables $LC_* mal configurées, ce qui semblait effectivement être le symptôme de mon problème. Mais après avoir tenté de reconfigurer plusieurs fois les variables moi-même avec un dpkg-reconfigure locales, j’ai réalisé que ce n’était pas la solution.

Puis au détour d’un article de blog sur le sujet je suis tombé sur un excellent commentaire qui expliquait que SSH interprétait certaines variables lorsqu’un client se connectait. Il suffit d’aller voir dans la configuration du daemon ssh dans le fichier /etc/ssh/sshd_config et de chercher la ligne contenant AcceptEnv. Dans mon cas, voici ce que j’avais sur toutes mes machines :

AcceptEnv LC_*

En gros, cette ligne autorise SSH à récupérer les variables $LC_* de l’utilisateur qui se connecte afin “d’adpater” le shell à son environnement. Il m’a suffit de commenter cette ligne et de redémarrer le daemon SSH pour que les messages d’erreurs de locales ne soient plus que des lointains souvenirs.

En faisant, cela vous forcerez vos utilisateur à utiliser la locale installée par défaut sur le serveur ce qui peut s’avérer plutôt pratique et surtout vous n’aurez plus les messages d’erreurs de locale manquantes lorsque vous serez sur des serveurs distants.

Maintenant, tous mes serveurs sont dans leur locales natives lorsque je me connecte en SSH, je n’ai plus à me soucier de problèmes de locales et je peux à nouveau me connecter à mon serveur via mosh.

Partager sur Twitter