SSH 未傳遞 LANG 環境變量

SSH 未傳遞 LANG 環境變量

我正在運行 Debian 伺服器(uname -v輸出#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_*

因此,ssh聲稱正在發送LANGsshd聲稱正在接受LANG,並且LANG沒有在任何bash啟動/關閉文件中進行設定。

我知道我可以透過某種設定來「修復」這個問題~/.profile,但我更感興趣的是為什麼環境沒有正確通過。

編輯:

我剛剛注意到LANGmacOS 和 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。我沒有費心去調查原因。

答案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 伺服器上註解掉了這一行:

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

並且您指出的問題已解決(LANG=C ssh myserver在我的案例中進行了測試)。我取消了該行的註釋,問題又出現了。

相關內容