
Я использую сервер Debian ( uname -v
вывод #1 SMP Debian 4.9.65-3+deb9u1 (2017-12-23)
). Когда я вхожу с любого из нескольких клиентов (ноутбук macOS 10.13 с ssh по умолчанию, приложение "Prompt" на 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
утверждает, что отправляет 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-v-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
в моем случае). Я раскомментировал строку, и проблема снова появилась.