web-dev-qa-db-fra.com

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

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?

88
Janning

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.

167
David Planella

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
26
ish

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

#SendEnv LANG LC_*
15
Zhengpeng Hou

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_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é .

La solution

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.

10
Rockallite

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.

4
Gwendal