J'ai une nouvelle installation d'ubuntu 12.04. Lorsque je me connecte à mon serveur distant, j'ai des erreurs comme celle-ci:
~$ ssh example.com Sudo aptitude upgrade
...
Traceback (most recent call last):
File "/usr/bin/apt-listchanges", line 33, in <module>
from ALChacks import *
File "/usr/share/apt-listchanges/ALChacks.py", line 32, in <module>
sys.stderr.write(_("Can't set locale; make sure $LC_* and $LANG are correct!\n"))
NameError: name '_' is not defined
Perl: warning: Setting locale failed.
Perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_TIME = "de_DE.UTF-8",
LC_MONETARY = "de_DE.UTF-8",
LC_ADDRESS = "de_DE.UTF-8",
LC_TELEPHONE = "de_DE.UTF-8",
LC_NAME = "de_DE.UTF-8",
LC_MEASUREMENT = "de_DE.UTF-8",
LC_IDENTIFICATION = "de_DE.UTF-8",
LC_NUMERIC = "de_DE.UTF-8",
LC_PAPER = "de_DE.UTF-8",
LANG = "en_US.UTF-8"
are supported and installed on your system.
Perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_ALL to default locale: No such file or directory
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.
...
Je n'ai pas ce problème quand je me connecte à partir d'une ancienne installation d'ubuntu. Ceci est sorti de mon installation d'ubuntu 12.04, LANG et LANGUAGE sont définis
$ locale
LANG=de_DE.UTF-8
LANGUAGE=de_DE:en_GB:en
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME=de_DE.UTF-8
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=
Quelqu'un sait-il ce qui a changé dans Ubuntu pour obtenir ce message d'erreur sur des serveurs distants?
En effet, les paramètres régionaux de votre ordinateur local sont définis sur l'allemand, ce que SSH transmet et tente d'utiliser sur le serveur, mais votre serveur ne l'a pas installé.
Vous avez plusieurs options:
Génère les paramètres régionaux. Générez les paramètres régionaux allemands sur le serveur avec Sudo locale-gen de
.
Arrête le transfert de la langue du client. Ne transmettez pas la variable d’environnement local de votre ordinateur local au serveur. Vous pouvez commenter la ligne SendEnv LANG LC_*
dans le fichier local /etc/ssh/ssh_config
.
Arrêtez d'accepter les paramètres régionaux sur le serveur. N'acceptez pas la variable d'environnement locale de votre ordinateur local sur le serveur. Vous pouvez commenter la ligne AcceptEnv LANG LC_*
dans le fichier distant /etc/ssh/sshd_config
.
Définir les paramètres régionaux du serveur sur Anglais. Définir explicitement les paramètres régionaux sur anglais sur le serveur. Par exemple, vous pouvez ajouter les lignes suivantes à vos fichiers ~/.bashrc
ou ~/.profile
distants:
export LANGUAGE="en"
export LANG="C"
export LC_MESSAGES="C"
Si vous ne disposez pas d'un accès root au serveur, l'option Arrêter le transfert des paramètres régionaux à partir du client peut constituer la meilleure (et la seule) solution.
Cela peut arriver parfois lors de nouvelles installations minimales/alternatives ou dans d'autres situations. La solution est assez simple. Essayez-les, dans l’ordre suivant, en effectuant des tests après chacun pour voir si la situation est corrigée:
Sudo dpkg-reconfigure locales
Sudo apt-get --reinstall install language-pack-de
Sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8
Commentez la ligne SendEnv LANG LC_*
dans /etc/ssh/ssh_config
, elle devrait donc ressembler à ceci:
#SendEnv LANG LC_*
Par défaut, la commande client ssh transmet les variables d'environnement liées aux paramètres régionaux au serveur SSH. C'est spécifié dans /etc/ssh/ssh_config
du côté client:
Host *
SendEnv LANG LC_*
Et par défaut, le serveur SSH les accepte (en /etc/ssh/sshd_config
sur le serveur):
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
Par conséquent, s'il existe des variables d'environnement liées aux paramètres régionaux dans votre shell, elles seront renseignées dans la session SSH côté serveur.
Malheureusement, l'option SendEnv
est cumulative. Selon man 5 ssh_config
:
SendEnv
... Multiple environment variables may be separated
by whitespace or spread across multiple SendEnv directives. The
default is not to send any environment variables.
ce qui signifie qu'il ne peut pas être remplacé .
Il est parfois impossible ou peu judicieux de modifier une configuration à l’échelle du système, en particulier du côté du serveur. Cependant, vous pouvez contourner le. Et c’est l’effet secondaire de l’option -F
dans la commande ssh. Selon man ssh
:
-F configfile
Specifies an alternative per-user configuration file. If a con-
figuration file is given on the command line, the system-wide
configuration file (/etc/ssh/ssh_config) will be ignored. The
default for the per-user configuration file is ~/.ssh/config.
Par défaut, le fichier de configuration par utilisateur ~/.ssh/config
est utilisé s’il existe. Mais vous pouvez le spécifier explicitement sur la ligne de commande pour contourner /etc/ssh/ssh_config
:
$ touch ~/.ssh/config
$ ssh -F ~/.ssh/config your_user@your_Host
Il serait plus pratique de créer un alias dans ~/.bashrc
:
alias ssh="ssh -F ~/.ssh/config"
De cette manière, les directives par défaut SendEnv
dans la configuration à l’échelle du système ne sont pas efficaces, aucune variable d’environnement n’est envoyée au serveur SSH par défaut.
J'ai eu un problème similaire. Ma solution consistait à commenter les lignes SendEnv
dans /etc/ssh/ssh_config
(car elles ne peuvent pas être remplacées) et à ajouter l'entrée suivante dans ~/.ssh/config
:
Host *,!<somehost>
SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE
SendEnv XMODIFIERS
avec <somehost>
étant le nom d’hôte auquel je non veux envoyer une variable d’environnement.