SSH が LANG 環境変数を渡さない

SSH が LANG 環境変数を渡さない

私は Debian サーバー (uname -v出力#1 SMP Debian 4.9.65-3+deb9u1 (2017-12-23)) を実行しています。複数のクライアント (デフォルトの ssh を備えた macOS 10.13 ラップトップ、iOS の「Prompt」アプリなど) のいずれかからログインすると、クライアントからLANG=C渡されたにもかかわらず、 が表示されLANG=en_US.UTF-8ます。関連情報は次のとおりです。

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_*

したがって、sshを送信していると主張しLANGsshdを受け入れていると主張しLANG、 はLANGどのbash起動/シャットダウン ファイルにも設定されていません。

設定~/.profileなどでこれを「修正」できることはわかっていますが、環境が適切に渡されない理由のほうが興味深いです。

編集:

macOS と Debian では名前が異なることに気付きましたLANG。ただし、これはまだ機能しません。

client$ LANG=en_US.utf8 ssh -v server
...
debug1: Sending environment.
debug1: Sending env LANG = en_US.utf8
server$ env | grep LANG
LANG=C

編集2:

結局のところ、この名前の違いは、Mac と Linux の問題ではありません。locale -aは、 が使用するロケールとは異なる名前を報告します$LANG。その理由を調査するつもりはありません。

答え1

私の Kubuntu または Debian には次のようなファイルがあります/etc/default/locale:

#  File generated by update-locale
LANG="pl_PL.UTF-8"

さまざまなファイルに記載されています/etc/pam.d/*。これはその一部です/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

今からman 5 pam.conf:

PAM 対応の権限付与アプリケーションが起動されると、PAM-API へのアタッチメントがアクティブ化されます。このアクティブ化によっていくつかのタスクが実行されますが、最も重要なのは設定ファイルの読み取りです。/etc/pam.confまたは、これはディレクトリの内容である可能性があります/etc/pam.d/。このディレクトリが存在すると、Linux-PAM は を無視します/etc/pam.conf

ユーザーがSSH経由でログインすると、sshd自身をフォークし、その瞬間に/etc/pam.d/sshdその仕事が実行されます。man 8 pam_envは、環境変数の設定/設定解除を担当します。sshdクライアントから変数を受け入れる前か後かはわからなかったので、簡単なテストを行いました。Debian サーバーで次の 1 行をコメント アウトしました。

session    required     pam_env.so user_readenv=1 envfile=/etc/default/locale

ご指摘の問題は修正されました (LANG=C ssh myserver私の場合はテスト済み)。その行のコメントを解除したところ、問題が再発しました。

関連情報