Ich verbringe viel Zeit ssh
mit 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 ssh
von 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)?
Antworten:
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
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:
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
locale
Befehl mit dem-a
Schalter (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.
quelle
/etc/ssh_config
Auf jedem Computer, den ich mir jemals angesehen habe, wird dies definiertLANG
undLC_*
standardmäßig an alle Hosts gesendet, und es werdenssh -v
mehrere Zeilen wie angezeigtdebug1: 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 Fallssh
Weiterleitungsmaterial 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.).Unterscheidet sich der Name für die UTF-8-Unterstützung auf verschiedenen Systemen auch für den folgenden Befehl geringfügig?
Wenn Sie seltsame locale bezogene Probleme auftreten, kann es helfen , das SSH - Client zu sagen, nicht jene senden
LC_*
Variablen durch AuskommenSendEnv 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:
quelle