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

Это известное ограничение . Жаль, что у меня не было обходного пути для вас.

1
22.03.2020, 18:33
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. Это еще один способ, PermitUserEnvironmentкоторый может быть «полезным» --для обхода /etc/bash.bashrc, который исходит прежде всего из Debian -, например дистрибутивов :

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

Теги

Похожие вопросы