Estou executando um servidor Debian ( uname -v
saída #1 SMP Debian 4.9.65-3+deb9u1 (2017-12-23)
). Quando faço login de qualquer um dos vários clientes (macOS 10.13 laptop com ssh padrão, o aplicativo "Prompt" no iOS, entre outros) LANG=C
, apesar de ter passado LANG=en_US.UTF-8
do cliente. Aqui estão algumas informações relevantes:
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_*
Então, ssh
afirma estar enviando LANG
, sshd
alega estar aceitando LANG
e LANG
não está sendo definido em nenhum dos bash
arquivos de inicialização / desligamento.
Eu sei que eu poderia "consertar" isso com uma configuração ~/.profile
ou algo assim, mas estou mais interessado em saber por que o ambiente não está sendo passado corretamente.
Editar:
Acabei de perceber que o LANG
nome é diferente no macOS e no Debian. Isso ainda não funciona, no entanto:
client$ LANG=en_US.utf8 ssh -v server
...
debug1: Sending environment.
debug1: Sending env LANG = en_US.utf8
server$ env | grep LANG
LANG=C
Editar 2:
Essa diferença de nomes não é um problema Mac-vs-Linux. locale -a
reporta um nome diferente para o locale que é usado por $LANG
. Eu não me preocupei em investigar o porquê.
Respostas:
No meu Kubuntu ou Debian existe um arquivo
/etc/default/locale
como:É mencionado em vários
/etc/pam.d/*
arquivos. Este é um fragmento de/etc/pam.d/sshd
:Agora de
man 5 pam.conf
:Quando um usuário efetua login via SSH,
sshd
ele se bifurca e esse é o momento do/etc/pam.d/sshd
seu trabalho. Vejaman 8 pam_env
, ele é responsável por definir / desconfigurar variáveis de ambiente. Eu não tinha certeza sesshd
garfo antes ou depois de aceitar variáveis de um cliente, então fiz um teste simples. Eu comentei esta única linha no meu servidor Debian:e o problema que você apontou foi corrigido (testado
LANG=C ssh myserver
no meu caso). Eu descomentei a linha e a questão reapareceu.fonte
dpkg-reconfigure locales
me permitiu definir o novo padrão. Também interessante - a saída delocale -a
,en_US.utf8
não corresponde ao nome para o qual a variável está definidaen_US.UTF-8
. Que mundo estranho criamos para nós mesmos.