
Como posso passar variáveis de ambiente do sshd
ambiente de para novas sessões SSH?
Estou executando sshd
em pods do Kubernetes. O Kubernetes define diversas variáveis no ambiente de contêineres, incluindo o servidor API:KUBERNETES_PORT=tcp://100.64.0.1:443
Agora, meu problema é que essa variável de ambiente não é passada para novas sessões SSH e elas precisam dela para configurar o kubectl
.
Responder1
Pode haver maneiras melhores de fazer isso, mas uma maneira rápida é usar oSetEnv
diretiva da linha de comando de sshd
:
export FOO=bar
sshd ... -o "SetEnv=FOO=$FOO" ...
export FOO=foo BAR='baz quux'
sshd ... -o "SetEnv=FOO=$FOO BAR=\"$BAR\"" ...
A SetEnv
diretiva é suportada desde o OpenSSH 7.8 (verifique em sshd -V
). Tal como acontece com todas -o key=val
as opções, apenas oprimeiroserá usado.
Com versões mais antigas, você pode obter um arquivo gerado automaticamente dos usuários ~/.ssh/rc
(PermitUserRC
) ou dos arquivos de inicialização do shell de login: Quando iniciado via ssh, fontes bash ~/.bashrc
(e antes dele, em distros do tipo Debian, /etc/bash.bashrc
) mesmo quando executado em modo não interativo[1].
Não use PermitUserEnvironment
porque isso permite que um usuário ignore seu shell de login e qualquer ForceCommand
via LD_PRELOAD
.
Exemplo de teste sshd
executando como um usuário comum:
t=$(mktemp -d)
ssh-keygen -qN '' -f "$t/key"
export FOO=foo BAR='baz quux'
/usr/sbin/sshd -h "$t/key" -p 2222 -o "PidFile=$t/pid" \
-o "SetEnv=FOO=\"$FOO\" BAR=\"$BAR\""
conecte-se a ele
$ ssh -p 2222 localhost 'echo "$FOO" "$BAR"'
foo baz quux
Você pode usar
alias ssh0='ssh -o UserKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no -o LogLevel=ERROR'
ssh0 ...
se você quiser evitar que o ssh solicite e adicione a chave descartável ao arquivo hosts conhecido.
[1]Bash determina se foi iniciado por ssh verificando os envvars SSH_CLIENT
e SHLVL
. Essa é outra maneira PermitUserEnvironment
que pode ser "útil" - ignorar o /etc/bash.bashrc
que é originado antes de qualquer outra coisa em distros do tipo Debian:
$ bash -xc ''
<nothing>
$ SHLVL= SSH_CLIENT=foo bash -xc ''
+ case $- in
+ return
<stuff from /etb/bash.bashrc and ~/.bashrc>