Las variables locales no tienen efecto en el shell remoto (perl: advertencia: la configuración regional falló).

89

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. Este es el resultado 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?

Janning
fuente

Respuestas:

167

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

Tienes varias opciones:

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

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

  • Deje 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 AcceptEnv LANG LC_*línea en el archivo remoto /etc/ssh/sshd_config .

  • Establezca 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 su control remoto ~/.bashrco ~/.profilearchivos:

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

Si no tiene acceso de root al servidor, la opción de Detener el reenvío desde el cliente podría ser la mejor (y única) forma de hacerlo.

David Planella
fuente
2
Ja! ¡Eché de menos el hecho de que enumeró la configuración regional del cliente ! Gran trabajo ...
ish
10
Decidí "Dejar de reenviar la configuración regional desde el cliente". Funciona bien. Para referencia futura: no puede anular la configuración de SendEnv desde / etc / ssh / ssh_config en su ~ / .ssh / config local. Ver bugzilla.mindrot.org/show_bug.cgi?id=1285
Janning
3
Combinado con bugs.php.net/bug.php?id=18556 , el envío de configuraciones locales de SSH puede causar problemas reales (y en realidad para mí), vea bugzilla.mindrot.org/show_bug.cgi?id=1285#c9 .. .
Halil Özgür
1
En mi caso, la configuración regional ~/.profileresolvió mi problema. Gracias.
Francisco
Si el servidor no tiene configuración regional alemana, ¿por qué es aceptable que sobrescriba el valor solicitado por el usuario LANGcon otra cosa? ..
Mikhail T.
26

Esto puede suceder a veces en instalaciones nuevas 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á arreglada:

1. Reconfigurar locales

  • sudo dpkg-reconfigure locales
    • si eso no funciona

2. Vuelva a instalar el paquete de idioma de locale

  • sudo apt-get --reinstall install language-pack-de
    • si eso no funciona

3. Forzar manualmente la configuración regional (persistente)

  • sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8
ish
fuente
Tengo un problema de JVM y también estoy tratando de configurar la configuración regional del sistema en 12.04. El único problema es que parece que no puedo configurar LC_ALL sin importar lo que intente, las configuraciones regionales todavía lo muestran como vacío.
Dark Star1
15

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

#SendEnv LANG LC_*
Zhengpeng Hou
fuente
10

El problema

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

Host *
    SendEnv LANG LC_*

Y de forma predeterminada, el servidor SSH los acepta (en /etc/ssh/sshd_configel 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 lado del servidor.

Lamentablemente, la SendEnvopción es acumulativa . De acuerdo a 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 se puede anular .

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 evitarlo . Y ese es el efecto secundario de la -Fopción en el comando ssh. De acuerdo a 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.

Por defecto, el archivo de configuración por usuario ~/.ssh/configse usa si se presenta. Pero puede especificarlo explícitamente en la línea de comando para omitir /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 forma, las SendEnvdirectivas 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.

Rockallita
fuente
2
Tenga en cuenta que el archivo de configuración del sistema en / etc / ssh / config puede contener líneas adicionales que desea conservar en su configuración de usuario. Tendrá que copiarlos en su archivo de configuración de usuario en ~ / .ssh / config para mantener esa configuración.
Steven Maude el
4

Tuve un problema similar. Mi solución fue comentar las SendEnvlíneas en /etc/ssh/ssh_config(ya que no se pueden anular) 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>ser el nombre de host al que no quería enviar ninguna variable de entorno.

Gwendal
fuente