Как передать переменные среды из среды sshd в новые сеансы SSH?

Как передать переменные среды из среды sshd в новые сеансы SSH?

Как передать переменные среды из sshdсреды в новые сеансы SSH?

Я работаю sshdв pods Kubernetes. Kubernetes устанавливает различные переменные в среде контейнеров, включая API-сервер:KUBERNETES_PORT=tcp://100.64.0.1:443

Теперь моя проблема в том, что эта переменная среды не передается в новые сеансы SSH, а она им нужна для настройки kubectl.

решение1

Возможно, есть лучшие способы сделать это, но самый быстрый способ — использоватьSetEnvдиректива из командной строки sshd:

export FOO=bar
sshd ... -o "SetEnv=FOO=$FOO" ...

export FOO=foo BAR='baz   quux'
sshd ... -o "SetEnv=FOO=$FOO BAR=\"$BAR\"" ...

Директива SetEnvподдерживается с OpenSSH 7.8 (проверьте с помощью sshd -V). Как и для всех -o key=valопций, толькопервыйбудет использован.

В более старых версиях вы можете использовать автоматически сгенерированный файл из папки пользователя ~/.ssh/rc(PermitUserRC) или из файлов инициализации оболочки входа: При запуске через ssh исходники bash ~/.bashrc(и до этого, в дистрибутивах типа Debian, /etc/bash.bashrc) даже при запуске в неинтерактивном режиме[1].

Не использовать PermitUserEnvironmentпоскольку это позволяет пользователю обойти свою оболочку входа в систему и любые ForceCommandсредства LD_PRELOAD.


Тестовый пример с sshdзапуском от имени обычного пользователя:

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

подключись к нему

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

Вы можете использовать

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

если вы хотите запретить ssh запрашивать и добавлять одноразовый ключ в файл известных хостов.


[1]Bash определяет, запущен ли он через ssh, проверяя SSH_CLIENTи SHLVLenvvars. Это еще один способ, который PermitUserEnvironmentможет быть "полезным" — обойти , /etc/bash.bashrcкоторый запускается раньше всего остального в дистрибутивах, подобных Debian:

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

Связанный контент