web-dev-qa-db-ja.com

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

Debianサーバーを実行しています(_uname -v_ output #1 SMP Debian 4.9.65-3+deb9u1 (2017-12-23))。いくつかのクライアント(デフォルトのsshを備えたmacOS 10.13ラップトップ、iOSの「プロンプト」アプリなど)のいずれかからログインすると、クライアントから_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_*
_

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

_~/.profile_などの設定でこれを「修正」できることは知っていますが、環境が適切に渡されない理由にもっと興味があります。

編集:

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

_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_で使用されているものとは異なるロケールの名前を報告します。私はその理由をわざわざ調査していません。

5
Scott Colby

私の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でテストされました)。その行のコメントを外すと、問題が再発しました。

5