99 votes

Les variables locales n'ont aucun effet dans le Shell distant (perl : warning : Setting locale failed.)

J'ai une nouvelle installation d'ubuntu 12.04. Lorsque je me connecte à mon serveur distant, j'obtiens des erreurs comme celles-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 lorsque je me connecte à partir d'une installation ubuntu plus ancienne. Voici le résultat de mon installation 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 les serveurs distants ?

182voto

Tom Points 635

C'est parce que la locale de votre machine locale est définie sur l'allemand, vers lequel SSH renvoie et essaie d'utiliser sur le serveur, mais votre serveur ne l'a pas installé.

Vous avez plusieurs options :

  • Générer la locale . Générez la locale allemande sur le serveur avec sudo locale-gen de .

  • Arrêter de transférer la locale du client . Ne transmettez pas la variable d'environnement locale de votre machine locale au serveur. Vous pouvez commenter la variable SendEnv LANG LC_* dans le local /etc/ssh/ssh_config fichier.

  • Arrêter d'accepter la locale sur le serveur . N'acceptez pas la variable d'environnement locale de votre machine locale sur le serveur. Vous pouvez commenter la variable AcceptEnv LANG LC_* dans le à distance /etc/ssh/sshd_config fichier.

  • Définir la locale du serveur en anglais . Définissez explicitement la locale en anglais sur le serveur. À titre d'exemple, vous pouvez ajouter les lignes suivantes à votre télécommande ~/.bashrc o ~/.profile des fichiers :

    export LANGUAGE="en"
    export LANG="C"
    export LC_MESSAGES="C"

Si vous ne disposez pas d'un accès root au serveur, la fonction Arrêter de transférer la locale du client est peut-être la meilleure (et la seule) solution.

29voto

ish Points 134738

Cela peut parfois se produire lors de nouvelles installations minimales/alternatives ou dans d'autres situations. La solution est assez simple. Essayez les éléments suivants, dans l'ordre, en effectuant un test après chacun d'eux pour voir si la situation est corrigée :

1. Reconfigurer les locales

  • sudo dpkg-reconfigure locales
    • si cela ne fonctionne pas,

2. Réinstaller le paquet de langue locale

  • sudo apt-get --reinstall install language-pack-de
    • si cela ne fonctionne pas,

3. Forcer manuellement les paramètres locaux (persistants)

  • sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8

17voto

Zhengpeng Hou Points 334

Commentez la ligne SendEnv LANG LC_* en /etc/ssh/ssh_config donc cela devrait ressembler à cela :

#SendEnv LANG LC_*

14voto

Rockallite Points 241

Le problème

Par défaut, la commande ssh client transmet les variables d'environnement locales au serveur SSH. Cela est spécifié dans /etc/ssh/ssh_config du côté client :

Host *
    SendEnv LANG LC_*

Et par défaut, le serveur SSH se trouve à les accepter (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

Ainsi, s'il y a des variables d'environnement liées au contexte local dans votre Shell, elles seront introduites dans la session SSH du côté serveur.

Malheureusement, le SendEnv L'option est cumulatif . 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é par .

La solution

Il est parfois impossible ou peu judicieux de modifier une configuration à l'échelle du système, notamment du côté du serveur. Cependant, vous pouvez contournement il. Et c'est l'effet secondaire de la -F dans la commande ssh. D'après 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 est présent. 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 le fichier ~/.bashrc :

alias ssh="ssh -F ~/.ssh/config"

De cette façon, la valeur par défaut SendEnv dans la configuration du système ne sont pas effectives, ce qui fait qu'aucune variable d'environnement n'est envoyée au serveur SSH par défaut.

5voto

Gwendal Points 151

J'ai eu un problème similaire. Ma solution a été de commenter le fichier SendEnv lignes dans /etc/ssh/ssh_config (puisqu'ils ne peuvent pas être remplacés), et d'ajouter l'entrée suivante dans le fichier ~/.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    

con <somehost> étant le nom d'hôte vers lequel je n'a pas veulent envoyer une variable d'environnement.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X