Frage Gebietsschema-Variablen haben in der Remote-Shell keine Auswirkungen (Perl: Warnung: Gebietsschemaeinstellung fehlgeschlagen.)


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

~$ 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 von einer älteren ubuntu-Installation verbinde. Dies wird von meiner ubuntu 12.04 Installation, LANG und LANGUAGE ausgegeben

$ 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 entfernten Servern zu erhalten?


84
2018-05-30 18:51


Ursprung


mögliches Duplikat von Wie behebe ich mein Gebietsschema Problem? - Fabby


Antworten:


Der Grund dafür ist, dass Ihr Gebietsschema auf Ihrem lokalen Computer auf Deutsch eingestellt ist, an das SSH weiterleitet und versucht, es auf dem Server zu verwenden, aber auf Ihrem Server ist es 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 der Ländereinstellung vom Client. Leiten Sie die Umgebungsvariable locale nicht von Ihrem lokalen Computer an den Server weiter. Sie können das auskommentieren SendEnv LANG LC_* Linie in der lokal  /etc/ssh/ssh_config Datei.

  • Akzeptieren Sie das Gebietsschema auf dem Server nicht mehr. Akzeptieren Sie nicht die Gebietsschema-Umgebungsvariable von Ihrem lokalen Rechner zum Server. Sie können das auskommentieren AcceptEnv LANG LC_* Linie in der Fernbedienung  /etc/ssh/sshd_config Datei.

  • Legen Sie das Servergebietsschema auf Englisch fest. Legen Sie das Gebietsschema explizit auf dem Server auf Englisch fest. Als Beispiel können Sie Ihrer Fernbedienung die folgenden Zeilen hinzufügen ~/.bashrc oder ~/.profile Dateien:

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

Wenn Sie keinen Root-Zugriff auf den Server haben, wird der Stoppen Sie die Weiterleitung der Ländereinstellung vom Client Option könnte der beste (und einzige) Weg sein.


160
2018-05-30 19:19



Hah! Ich habe die Tatsache total vermisst, dass er den Kunden Gebietsschemaeinstellungen! Gut gemacht... - ish
Ich entschied mich dafür, "Gebietsschema vom Client zu beenden". Funktioniert gut. Zukünftiger Hinweis: Sie können SendEnv-Einstellungen nicht in / etc / ssh / ssh_config in Ihrer lokalen ~ / .ssh / config überschreiben. Sehen bugzilla.mindrot.org/show_bug.cgi?id=1285 - Janning
Kombiniert mit bugs.php.net/bug.php?id=18556, SSHs Senden von Gebietsschemata kann echte Probleme verursachen (und für mich tatsächlich verursacht), siehe bugzilla.mindrot.org/show_bug.cgi?id=1285#c9 ... - Halil Özgür
In meinem Fall, Gebietsschema einstellen in ~/.profile löste mein Problem. Vielen Dank. - Francisco
Wenn der Server kein deutsches Gebietsschema hat, ist es akzeptabel, dass er den vom Benutzer angeforderten Wert von überschreibt LANG mit etwas anderem? .. - Mikhail T.


Dies kann manchmal bei frischen minimalen / alternativen Installationen oder in anderen Situationen passieren. Die Lösung ist ziemlich einfach. Probieren Sie diese in der folgenden Reihenfolge aus, um zu testen, ob die Situation behoben ist:

1. Konfigurieren Sie die Gebietsschemas neu

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

2. Installieren Sie das Gebietsschema-Sprachpaket neu

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

3. Erzwingen Sie Gebietsschema Einstellungen (persistent)

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

26
2017-12-21 14:12



Ich habe ein JVM-Problem und ich versuche, das Systemgebietsschema auch in 12.04 einzustellen. Das einzige Problem ist, dass ich das LC_ALL nicht einstellen kann, egal was ich versuche, das Gebietsschema zeigt es immer noch als leer an. - Dark Star1


Kommentiere die Zeile SendEnv LANG LC_* im /etc/ssh/ssh_config, so sollte es aussehen:

#SendEnv LANG LC_*

14
2018-01-22 02:46





Das Problem

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

Host *
    SendEnv LANG LC_*

Und standardmäßig akzeptiert der SSH - Server sie (in /etc/ssh/sshd_config auf 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 in Ihrer Shell also Gebietsschema-bezogene Umgebungsvariablen vorhanden sind, werden sie für die SSH-Sitzung auf der Serverseite aufgefüllt.

Leider SendEnv Option ist kumulativ. Gemäß 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 sein kann außer Kraft gesetzt.

Die Lösung

Manchmal ist es unmöglich oder unklug, eine systemweite Konfiguration zu ändern, besonders auf der Serverseite. Wie auch immer, du darfst Bypass es. Und das ist der Nebeneffekt der -F Option im SSH-Befehl. Gemäß 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 die benutzerspezifische Konfigurationsdatei ~/.ssh/config Wird verwendet, wenn es präsentiert wird. Doch kannst du explizit in der Befehlszeile angeben umgehen /etc/ssh/ssh_config:

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

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

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

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


7
2018-02-29 10:30



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 ~ / .ssh / config in Ihre Benutzerkonfigurationsdatei kopieren, um diese Einstellungen beizubehalten. - Steven Maude


Ich hatte ein ähnliches Problem. Meine Lösung war, das zu kommentieren SendEnv Linien in /etc/ssh/ssh_config (da diese nicht überschrieben werden können) und um den folgenden Eintrag 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 Hostname ist, zu dem ich nicht möchte irgendeine Umgebungsvariable senden.


4