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或类似方法“修复”这个问题,但我更感兴趣的是为什么环境没有得到正确传递。

编辑:

我刚刚注意到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我已测试过)。我取消注释了该行,问题又出现了。

相关内容