Las variables de configuración regional no tienen efecto en el shell remoto (perl: advertencia: no se pudo establecer el entorno local).

84

Tengo una nueva instalación de ubuntu 12.04. Cuando me conecto a mi servidor remoto, recibí errores como este:

~$ 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.
...

No tengo este problema cuando me conecto desde una instalación anterior de Ubuntu. Esto sale de mi instalación de ubuntu 12.04, LANG y LANGUAGE están configurados

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

¿Alguien sabe qué ha cambiado en ubuntu para obtener este mensaje de error en servidores remotos?

    
pregunta Janning 30.05.2012 - 20:51

5 respuestas

160

Eso se debe a que su configuración regional en su máquina local está configurada en alemán, lo que SSH reenvía e intenta usar en el servidor, pero su servidor no lo tiene instalado.

Tienes varias opciones:

  • Generar la configuración regional . Genere la configuración regional alemana en el servidor con sudo locale-gen de .

  • Detener el reenvío de la configuración regional desde el cliente . No reenvíe la variable de entorno local de su máquina local al servidor. Puede comentar la línea SendEnv LANG LC_* en el local /etc/ssh/ssh_config file.

  • Deja de aceptar la configuración regional en el servidor . No acepte la variable de entorno local de su máquina local al servidor. Puede comentar la línea AcceptEnv LANG LC_* en el control remoto /etc/ssh/sshd_config file.

  • Configura la configuración regional del servidor en inglés . Establezca explícitamente la configuración regional en inglés en el servidor. Como ejemplo, puede agregar las siguientes líneas a sus archivos remotos ~/.bashrc o ~/.profile :

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

Si no tiene acceso de raíz al servidor, la opción Detener el enrutamiento de la configuración regional desde el cliente podría ser la mejor (y la única) manera de hacerlo.

    
respondido por el David Planella 31.05.2012 - 07:47
26

Esto puede suceder algunas veces en instalaciones recientes mínimas / alternativas o en otras situaciones. La solución es bastante simple. Pruebe estos, en el siguiente orden, probando después de cada uno para ver si la situación está solucionada:

1. Reconfigurar configuraciones regionales

  • %código%
    • si eso no funciona,

2. Reinstale el paquete de idioma de la configuración regional

  • %código%
    • si eso no funciona,

3. Obligar manualmente a la configuración regional (persistente)

  • sudo dpkg-reconfigure locales
respondido por el ish 30.05.2012 - 21:19
14

Comenta la línea SendEnv LANG LC_* en /etc/ssh/ssh_config , por lo que debe tener el siguiente aspecto:

#SendEnv LANG LC_*
    
respondido por el Zhengpeng Hou 21.12.2013 - 15:12
7

El problema

De forma predeterminada, el comando del cliente ssh reenvía variables de entorno relacionadas con la configuración regional al servidor SSH. Eso está especificado en /etc/ssh/ssh_config en el lado del cliente:

Host *
    SendEnv LANG LC_*

Y de forma predeterminada, el servidor SSH los acepta (en /etc/ssh/sshd_config en el servidor):

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

Por lo tanto, si hay variables de entorno relacionadas con la configuración regional en su shell, se completarán en la sesión SSH en el servidor.

Desafortunadamente, la opción SendEnv es acumulativa . De acuerdo con 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.

lo que significa que no puede anularse .

La solución

A veces es imposible o imprudente cambiar una configuración de todo el sistema, especialmente en el lado del servidor. Sin embargo, puede puentearlo . Y ese es el efecto secundario de la opción -F en el comando ssh. De acuerdo con 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.

De manera predeterminada, el archivo de configuración por usuario ~/.ssh/config se usa si se presenta. Pero puede especificarlo explícitamente en la línea de comando para eludir /etc/ssh/ssh_config :

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

Sería más conveniente si crea un alias en ~/.bashrc :

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

De esta manera, las directivas SendEnv predeterminadas en la configuración de todo el sistema no son efectivas, por lo que no se envían variables de entorno al servidor SSH de forma predeterminada.

    
respondido por el Rockallite 22.01.2017 - 03:46
4

Tuve un problema similar. Mi solución fue comentar el SendEnv de las líneas en /etc/ssh/ssh_config (ya que no pueden sobrescribirse), y agregar la siguiente entrada en ~/.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> siendo el nombre de host al que no deseaba enviar cualquier variable de entorno.

    
respondido por el Gwendal 29.02.2016 - 11:30

Lea otras preguntas en las etiquetas