Les variables locales n'ont aucun effet dans le shell distant (perl: avertissement: les paramètres régionaux ont échoué.)

84

J'ai une nouvelle installation d'ubuntu 12.04. Quand je me connecte à mon serveur distant, j'ai des erreurs comme ceci:

~$ 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 depuis une ancienne installation Ubuntu. Ceci est sorti de mon installation ubuntu 12.04, LANG et LANGUAGE sont réglés

$ 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?

    
posée Janning 30.05.2012 - 20:51
la source

5 réponses

160

Cela est dû au fait que votre environnement local sur votre ordinateur local est défini sur l'allemand, que SSH transmet et tente d'utiliser sur le serveur, mais que votre serveur ne l'a pas installé.

Vous avez plusieurs options:

  • Générer 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 du client . Ne transférez pas la variable d'environnement locale de votre ordinateur local vers le serveur. Vous pouvez commenter la ligne SendEnv LANG LC_* dans le fichier local /etc/ssh/ssh_config .

  • Ne plus accepter les paramètres régionaux sur le serveur . N'acceptez pas la variable d'environnement locale depuis votre ordinateur local vers le serveur. Vous pouvez commenter la ligne AcceptEnv LANG LC_* dans le fichier distant /etc/ssh/sshd_config .

  • Définissez les paramètres régionaux du serveur sur Anglais . Définissez explicitement les paramètres régionaux en 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 n’avez pas d’accès root au serveur, l’option Arrêter les paramètres régionaux de transfert du client peut être la meilleure (et la seule) solution.

    
réponse donnée David Planella 31.05.2012 - 07:47
la source
26

Cela peut arriver parfois sur de nouvelles installations minimales / alternatives ou dans d’autres situations. Le correctif est assez simple. Essayez-les, dans l'ordre suivant, en testant après chaque test pour voir si la situation est corrigée:

1. Reconfigurez les locales

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

2. Réinstallez le module linguistique régional

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

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

  • sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8
réponse donnée ish 30.05.2012 - 21:19
la source
14

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

#SendEnv LANG LC_*
    
réponse donnée Zhengpeng Hou 21.12.2013 - 15:12
la source
6

Le problème

Par défaut, la commande ssh client transmet les variables d’environnement liées aux paramètres régionaux 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 les accepte (dans /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

Donc, s'il y a des variables d'environnement liées aux paramètres régionaux dans votre shell, elles seront ajoutées à la session SSH du 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é .

La solution

Parfois, il est impossible ou imprudent de modifier une configuration à l’échelle du système, en particulier du côté du serveur. Cependant, vous pouvez le contourner . 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 est présent. Mais vous pouvez le spécifier explicitement sur la ligne de commande pour ignorer /etc/ssh/ssh_config :

$ touch ~/.ssh/config
$ ssh -F ~/.ssh/config [email protected]_host

Il serait plus pratique de créer un alias dans ~/.bashrc :

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

De cette manière, les directives SendEnv par défaut dans la configuration système ne sont pas efficaces, ce qui fait qu'aucune variable d'environnement n'est envoyée au serveur SSH par défaut.

    
réponse donnée Rockallite 22.01.2017 - 03:46
la source
4

J'ai eu un problème similaire. Ma solution a été de commenter les lignes SendEnv dans /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> étant le nom d'hôte auquel je n'ai pas voulu envoyer de variable d'environnement.

    
réponse donnée Gwendal 29.02.2016 - 11:30
la source

Lire d'autres questions sur les étiquettes