Sco*_*lby 5 ssh debian bash environment-variables sshd
我正在运行 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_*
Run Code Online (Sandbox Code Playgroud)
因此,ssh声称正在发送LANG,sshd声称正在接受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
Run Code Online (Sandbox Code Playgroud)
编辑2:
事实证明,名称上的这种差异并不是 Mac 与 Linux 的问题。locale -a报告与$LANG. 我没有费心去调查原因。
在我的 Kubuntu 或 Debian 中有一个文件,/etc/default/locale如:
Run Code Online (Sandbox Code Playgroud)# File generated by update-locale LANG="pl_PL.UTF-8"
它在各种/etc/pam.d/*文件中都有提及。这是一个片段/etc/pam.d/sshd:
Run Code Online (Sandbox Code Playgroud)# 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 登录时,sshdfork 自己,这就是/etc/pam.d/sshd完成它的工作的时刻。看man 8 pam_env,它负责设置/取消设置环境变量。我不确定sshd在接受来自客户端的变量之前还是之后分叉,所以我做了一个简单的测试。我在我的 Debian 服务器上注释掉了这一行:
Run Code Online (Sandbox Code Playgroud)session required pam_env.so user_readenv=1 envfile=/etc/default/locale
并且您指出的问题已解决(LANG=C ssh myserver在我的情况下进行了测试)。我取消注释该行,问题再次出现。