Portabilität des UTF-8-Gebietsschemas (und ssh)


9

Ich verbringe viel Zeit sshmit verschiedenen Maschinen, die alle unterschiedlich sind (einige sind eingebettet, einige führen Linux aus, andere führen BSD aus usw.). Auf meinen eigenen lokalen Computern verwende ich jedoch OS X, das natürlich ein auf BSD basierendes Userland hat. Mein Gebietsschema auf diesen Computern ist auf en_GB.UTF-8 festgelegt. Dies ist eine der verfügbaren Optionen:

% echo `sw_vers`
ProductName: Mac OS X ProductVersion: 10.8.2 BuildVersion: 12C60
% locale -a | grep -i 'en_gb.utf'
en_GB.UTF-8

Einige der leistungsfähigeren Linux-Systeme, die ich verwende, scheinen eine äquivalente Option zu haben, aber ich stelle fest, dass der Name unter Linux etwas anders ist:

% lsb_release -d
Description: Debian GNU/Linux 6.0.3 (squeeze)
% locale -a | grep -i 'en_gb.utf' 
en_GB.utf8

Ich frage mich daher: Wenn ich sshvon meinem Mac auf einen Linux-Computer gehe und alle meine LC_*Variablen mit dem Suffix 'UTF-8' weiterleitet , versteht dieser Linux-Computer überhaupt, was von ihm verlangt wird? Oder fällt es einfach auf ein anderes Gebietsschema zurück?

edit: Hier ist ein Beispiel für das, worauf ich mich beziehe:

% ssh -v odin
...
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LC_ALL = en_GB.UTF-8
debug1: Sending env LC_COLLATE = en_GB.UTF-8
debug1: Sending env LC_CTYPE = en_GB.UTF-8
debug1: Sending env LC_MESSAGES = en_GB.UTF-8
debug1: Sending env LC_MONETARY = en_GB.UTF-8
debug1: Sending env LC_NUMERIC = en_GB.UTF-8
debug1: Sending env LC_TIME = en_GB.UTF-8
debug1: Sending env LANG = en_GB.UTF-8
odin:~ % locale | tail -1  # locale is set to .UTF-8 without error...
LC_ALL=en_GB.UTF-8
odin:~ % locale -a | grep 'en_GB.UTF-8'  # ... even though .UTF-8 isn't an option
odin:~ % 

Was ist in beiden Fällen der Mechanismus hinter seinem Verhalten und hängt es von einem bestimmten Setup ab (z. B. sehe ich auf einem BusyBox-basierten System dasselbe Verhalten wie auf einem GNU-basierten System)?


Erklärung dort: superuser.com/questions/999133/… (Antwort von grawity). Von BSD zu Linux gibt es also kein Problem. Von Linux (wenn es utf8 anstelle von UTF-8 definiert) bis BSD gibt es möglicherweise ein Problem.
AB

Antworten:


0

Es ist eine interessante Frage, aber ich denke, dass es dort ein Missverständnis darüber gibt, wie Variablen eingerichtet werden. Wenn eine sichere Shell-Sitzung initiiert wird ( ssh remotehost), geschieht am anderen Ende eine Instanziierung einer neuen Shell mit einer separaten Umgebung. Das ist eine ausgefallene Art zu sagen, dass der Server eine neue Shell startet. Diese neue Shell kann mit demselben Gebietsschema wie Ihre ursprüngliche lokale Shell konfiguriert sein oder nicht.

Z.B

Geee: ~
$ echo `locale | grep LANG` ::` date`
LANG = en_US.UTF-8 :: Mon Dec 3 07:04:00 CET 2012

$ ssh Flode
Flode: ~
$ echo `locale | grep LANG` ::` date`
LANG = nb_NO.UTF-8 LANGUAGE = nb_NO.UTF-8 :: ma. 03. des. 06:59:33 +0100 2012

Um dies zu demonstrieren, habe ich das Gebietsschema auf der Remote-Shell für Norwegian eingerichtet, indem ich der Datei ~ / .bash_profile die folgenden Zeilen hinzugefügt habe:

export     LANG=nb_NO.UTF-8
export LANGUAGE=nb_NO.UTF-8
export   LC_ALL=nb_NO.UTF-8

Ebenso müssen Sie die Umgebung auf der Remote-Shell einrichten , um dasselbe zu tun. Natürlich lesen andere Shells andere Startdateien wie ~ / .zprofile für die Z-Shell.

Das von mir vermutete Missverständnis lag darin, dass die lokalen Variablen (Einstellungen) in keiner Weise weitergeleitet werden. Die Remote-Shell verfügt über eigene Einstellungen. Verwenden Sie den localeBefehl mit dem -aSchalter (wie in der Frage angegeben) , um die verfügbaren Sprachen auf dem Remote-Host aufzulisten, sei es eine minimalistische BusyBox-Shell oder ein vollwertiges GNU-Betriebssystem . Jede der gedruckten Zeilen kann als Gebietsschemaeinstellung für diese Umgebung verwendet werden.

Bei der ersten Frage wird das Standardgebietsschema, mit dem eine Shell beginnt, normalerweise an einer zentralen Stelle wie / etc / profile konfiguriert. Die meisten Login-Shells lesen diese Datei beim Start.


2
Locale Sachen werden definitiv weitergeleitet. /etc/ssh_configAuf jedem Computer, den ich mir jemals angesehen habe, wird dies definiert LANGund LC_*standardmäßig an alle Hosts gesendet, und es werden ssh -vmehrere Zeilen wie angezeigt debug1: Sending env LC_ALL = en_GB.UTF-8. Wenn das Shell-Profil am anderen Ende dies später überschreibt, ist das natürlich eine andere Sache - aber auf einigen meiner Maschinen ist das nicht der Fall
kine

PS: Ich habe meinen ursprünglichen Beitrag mit vielleicht einer besseren Illustration dessen aktualisiert, worauf ich mich beziehe
Kine

Zugegeben, ich habe das noch nie gesehen. Die Maschinen, auf die Sie sich beziehen, Debian? Vielleicht erklärt dies den ssh env-Weiterleitungsmechanismus. Ich denke immer noch, dass die Namen der Gebietsschemas genau übereinstimmen müssen, da das Gebietsschema nicht klug genug sein soll, um dies herauszufinden. Der Grund, warum die Zeichenfolgen unterschiedlich sind, liegt darin, dass die C-Bibliothek für BSD- und GNU / Linux-basierte Maschinen unterschiedlich ist. Sie wissen nichts voneinander. Aber vielleicht bin ich zu skeptisch und das Gebietsschema-Programm hat eine Möglichkeit, dies automatisch anzupassen.
Ярослав Рахматуллин

Das ist der Teil, auf den ich neugierig war - das sshWeiterleitungsmaterial ist nebensächlich, es ist nur der Kontext, warum mein Gebietsschema so eingestellt ist, wie es ist. Ich weiß nur nicht, wie ich feststellen soll, was die Shell am anderen Ende tatsächlich tut - normalerweise werden beim Festlegen des Gebietsschemas keine Fehler angezeigt (obwohl dies manchmal auf eingebetteten Geräten der Fall ist), und die Eingabe / Anzeige von Unicode-Text scheint zu sein funktionieren normal (?), aber das von mir verwendete Gebietsschema ist offensichtlich nicht auf dem System vorhanden. Die meisten Linux-Geräte, mit denen ich eine Verbindung herstelle, basieren auf Debian oder Ubuntu, während andere auf uClibc / BusyBox basieren (Netzwerkgeräte usw.).
Kine

0

Unterscheidet sich der Name für die UTF-8-Unterstützung auf verschiedenen Systemen auch für den folgenden Befehl geringfügig?

LC_ALL='' locale charmap  # UTF-8 (on Mac OS X 10.6.8)

Wenn Sie seltsame locale bezogene Probleme auftreten, kann es helfen , das SSH - Client zu sagen, nicht jene senden LC_*Variablen durch Auskommen SendEnv LANG LC_*in /etc/ssh_config(siehe zum Beispiel Fixing Mac OS X Lion SSH UTF-8 Probleme und Terminals in OS X Lion: Dose åäö nicht auf Remote-Maschine schreiben ).

Ein anderer Lösungsansatz ist folgender:

# from: http://mod16.org/hurfdurf/?p=189
tjac wrote:
Actually the real problem that's causing this is that Mac OS 10.7 sets totally 
non-standard locale values, at least when you tweak some of the formats in
SysPrefs/Language&Text as I did.

If you type "locale" on your Mac terminal you should see pretty much the same as on 
other Unices (e.g. lots of en_US.UTF-8s if you prefer US English), but you don't. 
If these garbled settings get transferred to other Unix hosts by the SendEnv option 
they naturally do not know what's going on.

So if you want to fix it cleanly to allow for sshing to all kinds of remote hosts,
including those with older character sets, put the following lines in your 
~/.bash_profile on your Mac client machine.

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

Monday, September 12, 2011 at 22:54 #
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.