Quero enviar algumas variáveis de ambiente por ssh. Eu alterei o sshd_config no servidor, adicionando um arquivo em /etc/ssh/sshd_config.d contendo:
# NB This DOES NOT conflict with PermitUserEnvironment=No
AcceptEnv NOTIF* LANG LC_*
e reiniciei o sshd. Ao executar ssh -o SendEnv=NOTIF* localhost printenv
as variáveis não foram definidas no final remoto.
Já havia uma entrada em /etc/ssh/sshd_config contendo AcceptEnv LANG LC_*
. Comentar isso + reiniciar não teve impacto no comportamento.
$ export NOTIFY_WHAT="SERVICE"
$ export NOTIFY_SHORTDATETIME="CRIT"
$ export NOTIFY_HOSTNAME="web.example.com"
$ export NOTIFY_HOSTOUTPUT="host is up"
$ export NOTIFY_HOSTSTATE="OK"
$ export NOTIFY_NOTIFICATIONTYPE="PROBLEM"
$ export NOTIFY_SERVICEDESC="cmk-test"
$ export NOTIFY_SERVICEOUTPUT="oh no its broken!"
$ export NOTIFY_SERVICESTATE="CRIT"
$ ssh -o SendEnv=NOTIF* localhost printenv
SHELL=/bin/bash
LANGUAGE=en_US.UTF-8
SSH_AUTH_SOCK=/tmp/ssh-XXXXIxNz4o/agent.8579
PWD=/home/symcbean
LOGNAME=symcbean
MOTD_SHOWN=pam
HOME=/home/symcbean
LANG=C.UTF-8
SSH_CONNECTION=127.0.0.1 35340 127.0.0.1 22
USER=symcbean
SHLVL=0
SSH_CLIENT=127.0.0.1 35340 22
LC_ALL=C
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games
_=/usr/bin/printenv
Então não está funcionando, mas estranhamente, um LANG modificado é enviado:
$ export LANG=en_GB.UTF-8
$ ssh -o SendEnv=NOTIF* localhost printenv
SHELL=/bin/bash
LANGUAGE=en_US.UTF-8
SSH_AUTH_SOCK=/tmp/ssh-XXXXIxNz4o/agent.8579
PWD=/home/symcbean
LOGNAME=symcbean
MOTD_SHOWN=pam
HOME=/home/symcbean
LANG=en_GB.UTF-8
SSH_CONNECTION=127.0.0.1 35340 127.0.0.1 22
USER=symcbean
SHLVL=0
SSH_CLIENT=127.0.0.1 35340 22
LC_ALL=C
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games
_=/usr/bin/printenv
(embora eu esteja conectando usando localhost, o cliente e o servidor são executados em contêineres WSL separados. O cliente é 1:8.9p1-3ubuntu0.7, o servidor é openssh-server 1:9.2p1-2+deb12u3).
Só para não haver ambiguidade:
$ ssh -o SendEnv=NOTIF* localhost 'find /etc/ssh -type f -exec grep -H AcceptEnv {} \;'
grep: /etc/ssh/ssh_host_ed25519_key: Permission denied
grep: /etc/ssh/ssh_host_rsa_key: Permission denied
grep: /etc/ssh/ssh_host_ecdsa_key: Permission denied
/et`c/ssh/sshd_config.d/allowcheckmk:AcceptEnv NOTIF* LANG LC_*
/etc/ssh/sshd_config:# AcceptEnv LANG LC_*
ATUALIZAÇÃO
Com isso, -vv
posso ver que o cliente parece estar enviando os dados - eles não estão sendo aceitos/estão sendo descartados no terminal remoto...
debug1: Sending environment.
debug1: channel 2: setting env NOTIFY_SERVICESTATE = "CRIT"
debug2: channel 2: request env confirm 0
debug1: channel 2: setting env NOTIFY_HOSTSTATE = "OK"
debug2: channel 2: request env confirm 0
debug1: channel 2: setting env NOTIFY_WHAT = "SERVICE"
debug2: channel 2: request env confirm 0
...
Para passar variáveis de ambiente do cliente para o servidor, você precisa:
SendEnv
no lado do clienteAcceptEnv
no lado do servidor(Como você observou, há uma
PermitUserEnvironment
diretiva relacionada, mas distinta: isso acrescenta ao ambiente outras fontes.)As armadilhas para ursos incluem:
sshd_config
configuração não sendo (totalmente) lida ou não recarregada após alteraçõesAcceptEnv
(ouInclude
) aparecer acidentalmente após umaMatch
diretivaVocê pode testar se o servidor está configurado corretamente com o modo config-test:
(a configuração é analisada sem distinção entre maiúsculas e minúsculas)
Se você adicionar
-dd
para definir o nível de depuração 2, você também veráInclude
detalhes relacionados:e no seu caso, possivelmente:
O
-T
modo de teste lê os arquivos de configuração atuais ; certifique-se de recarregar o serviço se houver alterações na configuração.(Se você realmente usa
Match
diretivas para isso, pode testar as condições usando-C ...
along with-T
-- verifique a página de manual do sshd para mais detalhes.)Você pode ver todo o processo executando uma depuração única nível 2
sshd
:(este processo do servidor de depuração será encerrado quando o cliente for desconectado)
Na saída do servidor, após uma conexão, você verá "
debug2: Setting env 0: ...
", e na saída do cliente, após um login bem-sucedido, serão mostradas as alterações de ambiente que foram feitas.Há um limite de segurança para o número de variáveis permitidas (a partir do openssh-9.7p1, é 128 codificado).
Até onde eu sei, apenas a
TERM
variável é um caso especial, pois é necessário que seja enviada pelo protocolo. Para explicarLANG
as mudanças, talvezpam_env
scripts rc do sistema o levem a essa toca de coelho...