82

Когда я ssh на сервер, как я могу передать переменную среды от клиента на сервер? Эта переменная среды изменяется между различными вызовами ssh, поэтому я не хочу перезаписывать $HOME/.ssh2/environment каждый раз, когда я выполняю ssh-вызов. Как я могу это сделать?

6 ответов6

100

Конечно, вы можете установить переменную окружения внутри команды, однако вы должны быть осторожны с цитированием: помните, что ваша оболочка будет анализировать вашу локальную командную строку, а затем удаленная оболочка будет использовать строку получает.

Если вы хотите, чтобы переменная получала то же значение на сервере, что и на клиенте, попробуйте параметр 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 не содержит одинарных кавычек (').

12

Если вы можете администрировать целевой хост, вы можете настроить 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

6

Итак, на вашем клиенте есть переменная окружения, и вы хотите, чтобы она была доступна для удаленной команды? Я не думаю, что есть способ заставить ssh волшебным образом передать это, но вы, вероятно, можете сделать что-то подобное. Вместо того, чтобы использовать, скажем:

ssh remote.host my_command

Вы можете сделать это:

ssh remote.host env ENV_VAR=$ENV_VAR my_command
2

Ответ @ emptyset (который мне не помог) привел меня к такому ответу:

Вы можете добавить эту команду в ваш файл ~/.ssh/authorized_keys :

command="/usr/bin/env VARIABLE=<something> $SHELL" ssh-rsa <key>

export VARIABLE=<something> было немедленно завершено, и SSH-соединение было закрыто (блокируя меня из сервера), тогда как /usr/bin/env ... $SHELL запустит вашу оболочку по умолчанию с измененной средой.

1

Вы могли бы попытаться вызвать пользовательскую команду, предполагая, что у вас есть настройка входа в систему ssh без пароля. На сервере отредактируйте запись ~/.ssh/authorized_keys, соответствующую ключу вашего клиента:

command="export VARIABLE=<something>" ssh-rsa <key>

Посмотрите на эту ссылку в разделе « Принудительное командование» для более подробной информации.

1

Я делал пользовательскую сборку 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .