
Как передать переменные среды из 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
и SHLVL
envvars. Это еще один способ, который PermitUserEnvironment
может быть "полезным" — обойти , /etc/bash.bashrc
который запускается раньше всего остального в дистрибутивах, подобных Debian:
$ bash -xc ''
<nothing>
$ SHLVL= SSH_CLIENT=foo bash -xc ''
+ case $- in
+ return
<stuff from /etb/bash.bashrc and ~/.bashrc>