Le variabili delle impostazioni locali non hanno alcun effetto nella shell remota (perl: avviso: impostazione delle impostazioni locali non riuscita.)


89

Ho una nuova installazione di Ubuntu 12.04. Quando mi collego al mio server remoto ho ricevuto 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 collego da un'installazione precedente di Ubuntu. Questo è prodotto 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?


Risposte:


167

Questo perché le impostazioni locali nel computer locale sono impostate su tedesco, che SSH inoltra e cerca di utilizzare sul server, ma il tuo server non lo ha installato.

Hai diverse opzioni:

  • Genera la locale . Generare la locale tedesca sul server con sudo locale-gen de.

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

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

  • Impostare le impostazioni internazionali del server su inglese . Impostare esplicitamente la lingua inglese sul server. Ad esempio, è possibile aggiungere le seguenti righe al telecomando ~/.bashrco ai ~/.profilefile:

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

Se non si dispone dell'accesso root al server, l' opzione Interrompi inoltro locale dall'opzione client potrebbe essere il modo migliore (e unico) di procedere.


2
Hah! Mi mancava totalmente il fatto che elencasse le impostazioni locali del cliente ! Ottimo lavoro ...
ish,

10
Ho deciso di "Interrompere l'inoltro delle impostazioni internazionali dal client". Funziona bene. Per riferimento futuro: non è possibile sovrascrivere le impostazioni di SendEnv da / etc / ssh / ssh_config nella propria ~ / .ssh / config locale. Vedi bugzilla.mindrot.org/show_bug.cgi?id=1285
Janning

3
In combinazione con bugs.php.net/bug.php?id=18556 , l'invio di locales di SSH può causare problemi reali (e causati per me in realtà), vedi bugzilla.mindrot.org/show_bug.cgi?id=1285#c9 .. .
Halil Özgür

1
Nel mio caso, l'impostazione delle impostazioni internazionali ha ~/.profilerisolto il mio problema. Grazie.
Francisco,

Se il server non ha impostazioni locali tedesche, perché è accettabile sovrascrivere il valore richiesto dall'utente LANGcon qualcos'altro? ..
Mikhail T.

26

Questo può accadere a volte su nuove installazioni minime / alternative o in altre situazioni. La correzione è piuttosto semplice. Prova questi, nel seguente ordine, test dopo ognuno per vedere se la situazione è corretta:

1. Riconfigurare le impostazioni locali

  • sudo dpkg-reconfigure locales
    • se non funziona,

2. Reinstallare il language pack delle impostazioni internazionali

  • sudo apt-get --reinstall install language-pack-de
    • se non funziona,

3. Forza manualmente le impostazioni locali (persistente)

  • sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8

Ho un problema con JVM e sto provando a impostare anche le impostazioni internazionali del sistema in 12.04. L'unico problema è che non riesco a impostare LC_ALL indipendentemente da ciò che provo, locales lo mostra ancora come vuoto.
Dark Star1,

15

Commento la linea SendEnv LANG LC_*in /etc/ssh/ssh_config, e quindi dovrebbe assomiglia:

#SendEnv LANG LC_*

10

Il problema

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

Host *
    SendEnv LANG LC_*

E per impostazione predefinita, il server SSH sembra accettarli ( /etc/ssh/sshd_configsul 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 shell, verranno popolate alla sessione SSH sul lato server.

Sfortunatamente, l' SendEnvopzione è 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.

il che significa che non può essere ignorato .

La soluzione

A volte è impossibile o poco saggio cambiare una configurazione a livello di sistema, specialmente sul lato server. Tuttavia, è possibile ignorarlo . E questo è l'effetto collaterale -Fdell'opzione 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/configviene utilizzato se presente. Ma puoi specificarlo esplicitamente nella riga di comando per bypassare /etc/ssh/ssh_config:

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

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

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

In questo modo, le SendEnvdirettive predefinite nella configurazione a livello di sistema non sono efficaci e non vengono inviate variabili di ambiente al server SSH per impostazione predefinita.


2
Ricorda che il file di configurazione del sistema in / etc / ssh / config può contenere righe aggiuntive che desideri conservare nella configurazione dell'utente. Dovrai copiarli nel tuo file di configurazione utente in ~ / .ssh / config per mantenere tali impostazioni.
Steven Maude,

4

Ho avuto un problema simile. La mia soluzione è stata quella di commentare le SendEnvrighe /etc/ssh/ssh_config(poiché non possono essere sostituite) e 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>essendo il nome host a cui io non ho voglia di inviare alcuna variabile d'ambiente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.