Le variabili locali non hanno alcun effetto nella shell remota (perl: warning: impostazione locale fallita).

84

Ho una nuova installazione di Ubuntu 12.04. Quando mi collego al mio server remoto ho errori come questo:

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

Non ho questo problema quando mi connetto da una vecchia installazione di Ubuntu. Questo è l'output dalla mia installazione di Ubuntu 12.04, LANG e LANGUAGE sono impostati

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

Qualcuno sa cosa è cambiato in ubuntu per ottenere questo messaggio di errore sui server remoti?

    
posta Janning 30.05.2012 - 20:51

5 risposte

160

Questo perché le impostazioni locali nel computer locale sono impostate su tedesco, che SSH inoltra e tenta di utilizzare sul server, ma il server non è stato installato.

Hai diverse opzioni:

  • Genera le impostazioni internazionali . Genera la locale tedesca sul server con sudo locale-gen de .

  • Interrompe l'inoltro delle impostazioni internazionali dal client . Non inoltrare la variabile di ambiente locale dal computer locale al server. Puoi commentare la riga SendEnv LANG LC_* nel file locale /etc/ssh/ssh_config .

  • Interrompi l'accettazione delle impostazioni internazionali sul server . Non accettare la variabile di ambiente locale dal computer locale al server. Puoi commentare la riga AcceptEnv LANG LC_* nel file remoto /etc/ssh/sshd_config .

  • Imposta le impostazioni internazionali del server in inglese . Imposta esplicitamente la lingua inglese sul server. Ad esempio, puoi aggiungere le seguenti righe ai tuoi file ~/.bashrc o ~/.profile remoti:

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

Se non hai accesso root al server, l'opzione Interrompi l'inoltro delle impostazioni internazionali dal client potrebbe essere la migliore (e unica) strada da percorrere.

    
risposta data David Planella 31.05.2012 - 07:47
26

Questo può accadere a volte su installazioni minime / alternative fresche o in altre situazioni. La soluzione è piuttosto semplice. Prova questi, nel seguente ordine, testando ciascuno per vedere se la situazione è corretta:

1. Riconfigura locales

  • %codice%
    • se non funziona,

2. Reinstallare language-pack locale

  • %codice%
    • se non funziona,

3. Forzare manualmente le impostazioni locali (persistenti)

  • sudo dpkg-reconfigure locales
risposta data ish 30.05.2012 - 21:19
14

Commenta la riga SendEnv LANG LC_* in /etc/ssh/ssh_config , quindi dovrebbe essere:

#SendEnv LANG LC_*
    
risposta data Zhengpeng Hou 21.12.2013 - 15:12
6

Il problema

Per impostazione predefinita, il comando ssh client inoltra le variabili di ambiente relative alla locale al server SSH. Questo è specificato in /etc/ssh/ssh_config sul lato client:

Host *
    SendEnv LANG LC_*

E per impostazione predefinita, il server SSH capita di accettarli (in /etc/ssh/sshd_config sul server):

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

Quindi, se ci sono variabili d'ambiente relative alla locale nella tua shell, saranno popolate alla sessione SSH sul lato server.

Sfortunatamente, l'opzione SendEnv è cumulativa . Secondo 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.

che significa che non può essere sovrascritto .

La soluzione

A volte è impossibile o non saggio modificare una configurazione a livello di sistema, specialmente sul lato server. Tuttavia, puoi bypassare . E questo è l'effetto collaterale dell'opzione -F nel comando ssh. Secondo 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.

Per impostazione predefinita, il file di configurazione per utente ~/.ssh/config viene utilizzato se viene presentato. Ma puoi specificarlo esplicitamente nella riga di comando per ignorare /etc/ssh/ssh_config :

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

Sarebbe più comodo se si crea un alias in ~/.bashrc :

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

In questo modo, le direttive SendEnv di default nella configurazione a livello di sistema non sono efficaci, in quanto non vengono inviate variabili di ambiente al server SSH per impostazione predefinita.

    
risposta data Rockallite 22.01.2017 - 03:46
4

Ho avuto un problema simile. La mia soluzione era di commentare le SendEnv righe in /etc/ssh/ssh_config (poiché non possono essere superate) e di aggiungere la seguente voce in ~/.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> è il nome host a cui I non desidera inviare alcuna variabile di ambiente.

    
risposta data Gwendal 29.02.2016 - 11:30

Leggi altre domande sui tag