我正在运行 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
声称正在发送LANG
,sshd
声称正在接受LANG
,并且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
。 我没有费心去调查原因。
答案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
我已测试过)。我取消注释了该行,问题又出现了。