¿Cómo puedo pasar variables de entorno del entorno de sshd a nuevas sesiones SSH?

¿Cómo puedo pasar variables de entorno del entorno de sshd a nuevas sesiones SSH?

¿Cómo puedo pasar variables de entorno del sshdentorno de a nuevas sesiones SSH?

Estoy ejecutando sshdpods de Kubernetes. Kubernetes establece varias variables en el entorno de contenedores, incluido el servidor API:KUBERNETES_PORT=tcp://100.64.0.1:443

Ahora, mi problema es que esta variable de entorno no se pasa a las nuevas sesiones SSH y la necesitan para configurar kubectl.

Respuesta1

Puede que haya mejores formas de hacerlo, pero una forma rápida es utilizar elSetEnvdirectiva desde la línea 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\"" ...

La SetEnvdirectiva es compatible desde OpenSSH 7.8 (consulte con sshd -V). Como ocurre con todas -o key=vallas opciones, sólo elprimerose utilizará.

Con versiones anteriores, puede obtener un archivo generado automáticamente a partir de los usuarios ~/.ssh/rc(PermitUserRC) o desde los archivos de inicialización del shell de inicio de sesión: cuando se inicia a través de ssh, fuentes bash ~/.bashrc(y antes, en distribuciones similares a Debian /etc/bash.bashrc), incluso cuando se ejecuta en modo no interactivo[1].

No utilice PermitUserEnvironmentporque eso permite al usuario omitir su shell de inicio de sesión y cualquier ForceCommandvía LD_PRELOAD.


Ejemplo de prueba sshdejecutándolo como un usuario normal:

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\""

conéctate a él

$ ssh -p 2222 localhost 'echo "$FOO" "$BAR"'
foo baz  quux

Puedes utilizar

alias ssh0='ssh -o UserKnownHostsFile=/dev/null \
    -o StrictHostKeyChecking=no -o LogLevel=ERROR'
ssh0 ...

si desea evitar que ssh solicite y agregue la clave desechable al archivo de hosts conocido.


[1]Bash determina si se inicia mediante ssh comprobando las variables SSH_CLIENTy SHLVLenvvars. Esa es otra forma PermitUserEnvironmentque puede ser "útil": omitir el /etc/bash.bashrccódigo fuente antes que cualquier otra cosa en distribuciones similares a Debian:

$ bash -xc ''
<nothing>
$ SHLVL= SSH_CLIENT=foo bash -xc ''
+ case $- in
+ return
<stuff from /etb/bash.bashrc and ~/.bashrc>

información relacionada