Les variables locales n'ont aucun effet dans le shell distant (perl: warning: la définition des paramètres régionaux a échoué.)

89

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?

Janning
la source

Réponses:

167

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érez les paramètres régionaux . Générez les paramètres régionaux allemands sur le serveur avec sudo locale-gen de.

  • Arrêtez de transférer les paramètres régionaux à partir du client . Ne transmettez pas la variable d’environnement local de votre ordinateur local au serveur. Vous pouvez commenter la SendEnv LANG LC_*ligne 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 AcceptEnv LANG LC_*ligne dans le fichier distant /etc/ssh/sshd_config .

  • Définissez 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 à votre télécommande ~/.bashrcou à vos ~/.profilefichiers:

    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 est peut-être la meilleure (et la seule) solution.

David Planella
la source
2
Hah! J'ai totalement manqué le fait qu'il ait répertorié les paramètres régionaux du client ! Excellent travail ...
ish
10
J'ai décidé de "cesser de transférer les paramètres régionaux du client". Fonctionne bien. Pour référence future: vous ne pouvez pas remplacer les paramètres SendEnv à partir de / etc / ssh / ssh_config dans votre ~ / .ssh / config local. Voir bugzilla.mindrot.org/show_bug.cgi?id=1285
Janning le
3
Combiné à bugs.php.net/bug.php?id=18556 , l'envoi de locales par SSH peut causer de réels problèmes (et en être la cause), voir bugzilla.mindrot.org/show_bug.cgi?id=1285#c9 .. .
Halil Özgür
1
Dans mon cas, la définition des paramètres régionaux a ~/.profilerésolu mon problème. Merci.
Francisco
Si le serveur ne dispose pas de paramètres régionaux allemands, pourquoi est-il acceptable de remplacer la valeur demandée par l'utilisateur LANGpar autre chose? ..
Mikhail T.
26

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:

1. Reconfigurer les paramètres régionaux

  • sudo dpkg-reconfigure locales
    • si ça ne marche pas,

2. Réinstallez le paquet linguistique local

  • sudo apt-get --reinstall install language-pack-de
    • si ça ne marche pas,

3. Forcer manuellement les paramètres régionaux (persistant)

  • sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8
ish
la source
J'ai un problème de machine virtuelle Java et j'essaie également de définir les paramètres régionaux du système dans 12.04. Le seul problème est que je n'arrive pas à définir le LC_ALL, peu importe ce que j'essaie, les locales le montrent toujours comme vide.
Dark Star1
15

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

#SendEnv LANG LC_*
Zhengpeng Hou
la source
10

Le problème

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_configle côté client:

Host *
    SendEnv LANG LC_*

Et par défaut, le serveur SSH les accepte ( /etc/ssh/sshd_configsur 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, si votre shell contient des variables d'environnement liées aux paramètres régionaux, elles seront renseignées dans la session SSH côté serveur.

Malheureusement, l' SendEnvoption 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é .

La solution

Il est parfois impossible ou peu judicieux de modifier une configuration à l’échelle du système, en particulier côté serveur. Cependant, vous pouvez le contourner . Et c'est l'effet secondaire de l' -Foption 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/configest utilisé s’il existe. Mais vous pouvez explicitement le spécifier sur la ligne de commande pour ignorer /etc/ssh/ssh_config:

$ touch ~/.ssh/config
$ ssh -F ~/.ssh/config your_user@your_host

Ce serait plus pratique si vous faites un alias dans ~/.bashrc:

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

De cette façon, les SendEnvdirectives par défaut dans la configuration à l'échelle du système ne sont pas efficaces, aucune variable d'environnement n'étant envoyée au serveur SSH par défaut.

Rockallite
la source
2
N'oubliez pas que le fichier de configuration système dans / etc / ssh / config peut contenir des lignes supplémentaires que vous souhaitez conserver dans votre configuration utilisateur. Vous devrez les copier dans votre fichier de configuration utilisateur dans ~ / .ssh / config pour conserver ces paramètres.
Steven Maude
4

J'ai eu un problème similaire. Ma solution était de commenter les SendEnvlignes /etc/ssh/ssh_config(car elles ne peuvent pas être remplacées) et d'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>être le nom d' hôte auquel je ne veux envoyer une variable d'environnement.

Gwendal
la source