SSH не передает переменную окружения LANG

SSH не передает переменную окружения LANG

Я использую сервер 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в моем случае). Я раскомментировал строку, и проблема снова появилась.

Связанный контент