Когда я ssh
на сервер, как я могу передать переменную среды от клиента на сервер? Эта переменная среды изменяется между различными вызовами ssh, поэтому я не хочу перезаписывать $HOME/.ssh2/environment
каждый раз, когда я выполняю ssh-вызов. Как я могу это сделать?
6 ответов
Конечно, вы можете установить переменную окружения внутри команды, однако вы должны быть осторожны с цитированием: помните, что ваша оболочка будет анализировать вашу локальную командную строку, а затем удаленная оболочка будет использовать строку получает.
Если вы хотите, чтобы переменная получала то же значение на сервере, что и на клиенте, попробуйте параметр SendEnv
:
ssh -o SendEnv=MYVAR server.example.com mycommand
Это требует поддержки со стороны сервера. В OpenSSH имя переменной должно быть авторизовано в /etc/sshd_config
.
Если сервер допускает только определенные имена переменных, вы можете обойти это; например, общая настройка позволяет LC_*
через, и вы можете сделать следующее:
ssh -o SendEnv=LC_MYVAR server.example.com 'MYVAR=$LC_MYVAR; unset LC_MYVAR; export MYVAR; mycommand'
Если даже LC_*
не является опцией, вы можете передать информацию в переменную окружения TERM
, которая всегда копируется (однако может быть ограничение длины). Вам все равно придется убедиться, что удаленная оболочка не ограничивает переменную TERM
для обозначения известного типа терминала. Передайте параметр -t
в ssh, если вы не запускаете удаленную интерактивную оболочку.
env TERM="extra information:$TERM" ssh -t server.example.com 'MYVAR=${TERM%:*}; TERM=${TERM##*:}; export MYVAR; mycommand'
Другая возможность - определить переменную непосредственно в команде:
ssh -t server.example.com 'export MYVAR="extra information"; mycommand'
Таким образом, если передать локальную переменную:
ssh -t server.example.com 'export MYVAR='"'$LOCALVAR'"'; mycommand'
Однако остерегайтесь проблем с цитированием: значение переменной будет интерполировано непосредственно во фрагмент оболочки, выполненный на удаленной стороне. Последний пример выше предполагает, что $LOCALVAR
не содержит одинарных кавычек ('
).
Если вы можете администрировать целевой хост, вы можете настроить sshd, чтобы разрешить передачу локальных переменных среды на целевой хост.
Со страницы руководства sshd_config:
PermitUserEnvironment
Specifies whether ~/.ssh/environment and environment= options in
~/.ssh/authorized_keys are processed by sshd. The default is
"no". Enabling environment processing may enable users to bypass
access restrictions in some configurations using mechanisms such
as LD_PRELOAD.
Конфигурация sshd обычно находится в /etc/ssh/sshd_config
Итак, на вашем клиенте есть переменная окружения, и вы хотите, чтобы она была доступна для удаленной команды? Я не думаю, что есть способ заставить ssh волшебным образом передать это, но вы, вероятно, можете сделать что-то подобное. Вместо того, чтобы использовать, скажем:
ssh remote.host my_command
Вы можете сделать это:
ssh remote.host env ENV_VAR=$ENV_VAR my_command
Ответ @ emptyset (который мне не помог) привел меня к такому ответу:
Вы можете добавить эту команду в ваш файл ~/.ssh/authorized_keys
:
command="/usr/bin/env VARIABLE=<something> $SHELL" ssh-rsa <key>
export VARIABLE=<something>
было немедленно завершено, и SSH-соединение было закрыто (блокируя меня из сервера), тогда как /usr/bin/env ... $SHELL
запустит вашу оболочку по умолчанию с измененной средой.
Вы могли бы попытаться вызвать пользовательскую команду, предполагая, что у вас есть настройка входа в систему ssh без пароля. На сервере отредактируйте запись ~/.ssh/authorized_keys, соответствующую ключу вашего клиента:
command="export VARIABLE=<something>" ssh-rsa <key>
Посмотрите на эту ссылку в разделе « Принудительное командование» для более подробной информации.
Я делал пользовательскую сборку OpenSSH для устройства с cramfs в домашнем каталоге и /etc (Cram FS только для чтения), поэтому ~ /.ssh /environment не будет работать без перестройки всей FS, и они были развернуты на местах устройства (встроенные системы, следовательно, использование CRAMFS). Вы можете указать в sshd_config местоположение файла authroized_keys, но по какой-то причине среда работает только для переменных среды в ~ /.ssh /authroized_keys. Редактирование /etc /profile не было вариантом, и мне пришлось загружать ssh в нестандартный каталог. В session.c после child_set_env (... "MAIL" ...) просто добавьте переменные окружения, которые вам нужны (это хак, я знаю ...), но просто добавьте, что кому-то нужны некоторые жестко закодированные envs для сеанса, если вы компиляция из источника вы можете сделать это. TGI-FLOSS