Gebietsschemavariablen haben in der Remote-Shell keine Auswirkung (perl: warning: Das Festlegen des Gebietsschemas ist fehlgeschlagen.)

89

Ich habe eine neue Ubuntu 12.04-Installation. Wenn ich eine Verbindung zu meinem Remote-Server herstelle, erhalte ich folgende Fehler:

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

Ich habe dieses Problem nicht, wenn ich eine Verbindung von einer älteren Ubuntu-Installation herstelle. Dies wird von meiner Ubuntu 12.04 Installation ausgegeben, LANG und LANGUAGE sind eingestellt

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

Weiß jemand, was sich in Ubuntu geändert hat, um diese Fehlermeldung auf Remote-Servern zu erhalten?

Janning
quelle
1
Mögliches Duplikat von Wie behebe ich mein Gebietsschema-Problem?
Fabby

Antworten:

167

Dies liegt daran, dass Ihr Gebietsschema auf Ihrem lokalen Computer auf Deutsch festgelegt ist, was SSH weiterleitet und versucht, auf dem Server zu verwenden, auf Ihrem Server ist es jedoch nicht installiert.

Sie haben mehrere Möglichkeiten:

  • Generieren Sie das Gebietsschema . Generieren Sie das deutsche Gebietsschema auf dem Server mit sudo locale-gen de.

  • Stoppen Sie die Weiterleitung des Gebietsschemas vom Client . Leiten Sie die Umgebungsvariable für das Gebietsschema nicht von Ihrem lokalen Computer an den Server weiter. Sie können die SendEnv LANG LC_*Zeile in der lokalen /etc/ssh/ssh_config Datei auskommentieren.

  • Akzeptieren Sie das Gebietsschema auf dem Server nicht mehr . Akzeptieren Sie die Umgebungsvariable für das Gebietsschema von Ihrem lokalen Computer zum Server nicht. Sie können die AcceptEnv LANG LC_*Zeile in der Remote- /etc/ssh/sshd_config Datei auskommentieren.

  • Setzen Sie das Gebietsschema des Servers auf Englisch . Setzen Sie das Gebietsschema auf dem Server explizit auf Englisch. Als Beispiel können Sie Ihrer Fernbedienung ~/.bashrcoder Ihren ~/.profileDateien die folgenden Zeilen hinzufügen :

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

Wenn Sie keinen Root-Zugriff auf den Server haben, ist die Option " Weiterleiten des Gebietsschemas vom Client aus beenden" möglicherweise der beste (und einzige) Weg.

David Planella
quelle
2
Hah! Ich habe die Tatsache, dass er die Gebietsschemaeinstellungen des Clients auflistete, total vermisst ! Großartige Arbeit ...
ish
10
Ich habe mich für "Keine Weiterleitung des Gebietsschemas vom Client" entschieden. Funktioniert gut. Zur zukünftigen Bezugnahme: Sie können die SendEnv-Einstellungen von / etc / ssh / ssh_config in Ihrer lokalen ~ / .ssh / config nicht überschreiben. Siehe bugzilla.mindrot.org/show_bug.cgi?id=1285
Janning,
3
In Kombination mit bugs.php.net/bug.php?id=18556 kann das Senden von Gebietsschemas durch SSH echte Probleme verursachen (und für mich tatsächlich verursacht werden). Siehe bugzilla.mindrot.org/show_bug.cgi?id=1285#c9 . .
Halil Özgür
1
In meinem Fall hat das Setzen des Gebietsschemas ~/.profilemein Problem gelöst. Vielen Dank.
Francisco
Wenn der Server kein deutsches Gebietsschema hat, warum kann er dann den vom Benutzer angeforderten Wert von LANGmit etwas anderem überschreiben ?
Mikhail T.
26

Dies kann manchmal bei neuen Minimal- / Alternativinstallationen oder in anderen Situationen vorkommen. Das Update ist ziemlich einfach. Probieren Sie diese in der folgenden Reihenfolge nacheinander aus, um festzustellen, ob die Situation behoben ist:

1. Konfigurieren Sie die Ländereinstellungen neu

  • sudo dpkg-reconfigure locales
    • wenn das nicht geht,

2. Installieren Sie das Sprachpaket für das Gebietsschema neu

  • sudo apt-get --reinstall install language-pack-de
    • wenn das nicht geht,

3. Manuelles Erzwingen von Gebietsschemaeinstellungen (dauerhaft)

  • sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8
ish
quelle
Ich habe ein JVM-Problem und versuche, das Systemgebietsschema auch in 12.04 festzulegen. Das einzige Problem ist, dass ich den LC_ALL scheinbar nicht einstellen kann, egal was ich versuche. Das Gebietsschema zeigt ihn weiterhin als leer an.
Dark Star1
15

Kommentieren Sie die Zeile SendEnv LANG LC_*in /etc/ssh/ssh_config, so sollte es so aussehen:

#SendEnv LANG LC_*
Zhengpeng Hou
quelle
10

Das Problem

Standardmäßig leitet der Befehl ssh client länderspezifische Umgebungsvariablen an den SSH-Server weiter. Das ist in /etc/ssh/ssh_configauf der Client-Seite angegeben:

Host *
    SendEnv LANG LC_*

Und standardmäßig akzeptiert der SSH-Server sie ( /etc/ssh/sshd_configauf dem 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

Wenn sich in Ihrer Shell auf das Gebietsschema bezogene Umgebungsvariablen befinden, werden diese in die SSH-Sitzung auf der Serverseite übernommen.

Leider ist die SendEnvOption kumulativ . Nach 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.

was bedeutet, dass es nicht überschrieben werden kann .

Die Lösung

Manchmal ist es unmöglich oder unklug, eine systemweite Konfiguration zu ändern, insbesondere auf der Serverseite. Sie können es jedoch umgehen . Und das ist der Nebeneffekt der -FOption im Befehl ssh. Nach 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.

Standardmäßig wird die benutzerspezifische Konfigurationsdatei ~/.ssh/configverwendet, falls vorhanden. Sie können es jedoch explizit in der Befehlszeile angeben, um es zu umgehen /etc/ssh/ssh_config:

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

Es wäre praktischer, wenn Sie einen Alias ​​erstellen in ~/.bashrc:

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

Auf diese Weise sind die Standardanweisungen SendEnvin der systemweiten Konfiguration nicht wirksam, sodass standardmäßig keine Umgebungsvariablen an den SSH-Server gesendet werden.

Rockallit
quelle
2
Beachten Sie, dass die Systemkonfigurationsdatei in / etc / ssh / config möglicherweise zusätzliche Zeilen enthält, die Sie in Ihrer Benutzerkonfiguration beibehalten möchten. Sie müssen sie in Ihre Benutzerkonfigurationsdatei in ~ / .ssh / config kopieren, um diese Einstellungen beizubehalten.
Steven Maude
4

Ich hatte ein ähnliches Problem. Meine Lösung bestand darin, die SendEnvZeilen in /etc/ssh/ssh_config(da diese nicht überschrieben werden können) zu kommentieren und den folgenden Eintrag in hinzuzufügen ~/.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    

mit <somehost>der Host - Name sein, der ich nicht jede Umgebungsvariable senden möchten.

Gwendal
quelle