
¿Cómo puedo pasar variables de entorno del sshd
entorno de a nuevas sesiones SSH?
Estoy ejecutando sshd
pods 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 elSetEnv
directiva 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 SetEnv
directiva es compatible desde OpenSSH 7.8 (consulte con sshd -V
). Como ocurre con todas -o key=val
las 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 PermitUserEnvironment
porque eso permite al usuario omitir su shell de inicio de sesión y cualquier ForceCommand
vía LD_PRELOAD
.
Ejemplo de prueba sshd
ejecutá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_CLIENT
y SHLVL
envvars. Esa es otra forma PermitUserEnvironment
que puede ser "útil": omitir el /etc/bash.bashrc
có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>