
Ich verwende einen Debian-Server ( uname -v
Ausgabe #1 SMP Debian 4.9.65-3+deb9u1 (2017-12-23)
). Wenn ich mich von einem der verschiedenen Clients aus anmelde (macOS 10.13-Laptop mit Standard-SSH, die „Prompt“-App auf iOS usw.), wird LANG=C
trotz der Eingabe LANG=en_US.UTF-8
vom Client eine Verbindung hergestellt. Hier sind einige relevante Informationen:
client$ env | grep LANG
LANG=en_US.UTF-8
client$ ssh -v server
...
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
server$ env | grep LANG
LANG=C
server$ grep -in lang /etc/profile ~/.bash_profile ~/.bash_login ~/.profile ~/.bash_logout ~/.bashrc
grep: ~/.bash_profile: No such file or directory
grep: ~/.bash_login: No such file or directory
server$ locale -a
C
C.UTF-8
POSIX
en_US.utf8
server$ sudo sshd -T | grep acceptenv
acceptenv LANG
acceptenv LC_*
Gibt also vor, ssh
zu senden LANG
, sshd
gibt vor, zu akzeptieren LANG
und wird in keiner der Start-/Herunterfahrdateien LANG
festgelegt .bash
Ich weiß, dass ich das mit einer Einstellung ~/.profile
oder so etwas „beheben“ könnte, aber mich interessiert mehr, warum die Umgebung nicht richtig übergeben wird.
Bearbeiten:
Mir ist gerade aufgefallen, dass der LANG
Name unter macOS und Debian unterschiedlich ist. Das funktioniert jedoch trotzdem nicht:
client$ LANG=en_US.utf8 ssh -v server
...
debug1: Sending environment.
debug1: Sending env LANG = en_US.utf8
server$ env | grep LANG
LANG=C
Bearbeitung 2:
Wie sich herausstellt, handelt es sich bei diesem Namensunterschied nicht um ein Mac-Linux-Problem. locale -a
meldet einen anderen Namen für das Gebietsschema als den von verwendeten $LANG
. Ich habe mich nicht darum gekümmert, den Grund dafür zu ermitteln.
Antwort1
In meinem Kubuntu oder Debian gibt es eine Datei /etc/default/locale
wie:
# File generated by update-locale LANG="pl_PL.UTF-8"
Es wird in verschiedenen /etc/pam.d/*
Dateien erwähnt. Dies ist ein Fragment von /etc/pam.d/sshd
:
# Read environment variables from /etc/environment and # /etc/security/pam_env.conf. session required pam_env.so # [1] # In Debian 4.0 (etch), locale-related environment variables were moved to # /etc/default/locale, so read that as well. session required pam_env.so user_readenv=1 envfile=/etc/default/locale
Jetzt abman 5 pam.conf
:
Wenn eine PAM-fähige Anwendung zur Erteilung von Berechtigungen gestartet wird, aktiviert sie ihre Verbindung zur PAM-API. Diese Aktivierung führt eine Reihe von Aufgaben aus, von denen die wichtigste das Lesen der Konfigurationsdatei(en) ist:
/etc/pam.conf
. Alternativ kann dies der Inhalt des/etc/pam.d/
Verzeichnisses sein. Die Anwesenheit dieses Verzeichnisses führt dazu, dass Linux-PAM ignoriert/etc/pam.conf
.
Wenn sich ein Benutzer über SSH anmeldet, sshd
forkt sich selbst und dies ist der Moment, in dem /etc/pam.d/sshd
seine Arbeit erledigt wird. Sieheman 8 pam_env
, es ist für das Setzen/Aufheben von Umgebungsvariablen zuständig. Ich war mir nicht sicher, ob sshd
Forks vor oder nach dem Akzeptieren von Variablen von einem Client erfolgen, also habe ich einen einfachen Test gemacht. Ich habe diese einzelne Zeile auf meinem Debian-Server auskommentiert:
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
und das von Ihnen angesprochene Problem wurde behoben ( LANG=C ssh myserver
in meinem Fall getestet). Ich habe die Zeile auskommentiert und das Problem trat erneut auf.