Это известное ограничение . Жаль, что у меня не было обходного пути для вас.
Это можно сделать и получше, но самый быстрый способ — использовать директиву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>