3

Я использую сервер Debian (uname -v output #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-vs-Linux. locale -a сообщает другое имя для локали, чем используется $LANG . Я не удосужился выяснить, почему.

1 ответ1

3

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .