Como posso passar variáveis ​​de ambiente do ambiente do sshd para novas sessões SSH?

Como posso passar variáveis ​​de ambiente do ambiente do sshd para novas sessões SSH?

Como posso passar variáveis ​​de ambiente do sshdambiente de para novas sessões SSH?

Estou executando sshdem 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 oSetEnvdiretiva 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 SetEnvdiretiva é suportada desde o OpenSSH 7.8 (verifique em sshd -V). Tal como acontece com todas -o key=valas 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 PermitUserEnvironmentporque isso permite que um usuário ignore seu shell de login e qualquer ForceCommandvia LD_PRELOAD.


Exemplo de teste sshdexecutando 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_CLIENTe SHLVL. Essa é outra maneira PermitUserEnvironmentque pode ser "útil" - ignorar o /etc/bash.bashrcque é 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>

informação relacionada