it-swarm-ru.tech

Когда я ssh'ing, как я могу установить переменную среды на сервере, которая меняется от сеанса к сеансу?

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

85
Ross Rogers

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

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

Если даже LC_* не является опцией, вы можете передать информацию в переменную окружения TERM, которая всегда копируется (однако может быть ограничение длины). Вам все равно придется убедиться, что удаленная оболочка не ограничивает переменную TERM для обозначения известного типа терминала. Передайте параметр -t в ssh, если вы не запускаете удаленную интерактивную оболочку.

 env TERM = "дополнительная информация: $ TERM" ssh -t server.example.com 'MYVAR = $ {TERM%: *}; TERM = $ {TERM ## *:}; экспорт MYVAR; МояКоманда '

Другая возможность - определить переменную непосредственно в команде:

 ssh -t server.example.com 'export MYVAR = "дополнительная информация"; МояКоманда '

Таким образом, если передать локальную переменную:

 ssh -t server.example.com 'export MYVAR =' "'$ LOCALVAR'" '; МояКоманда '

Однако остерегайтесь проблем с кавычками: значение переменной будет интерполировано непосредственно во фрагмент оболочки, выполненный на удаленной стороне. В последнем примере выше предполагается, что $LOCALVAR не содержит одинарных кавычек (').

103
Gilles

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

12
Duncan Beevers

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

ssh remote.Host my_command

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

ssh remote.Host env ENV_VAR=$ENV_VAR my_command
6
pioto

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

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

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

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

3
madprog

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

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

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

1
emptyset

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

1
Will