2010-07-13 16:59:57 +0000 2010-07-13 16:59:57 +0000
95
95

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

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

Ответы (8)

116
116
116
2010-07-13 19:25:13 +0000

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

Если вы хотите, чтобы переменная получала на сервере то же значение, что и на клиенте, попробуйте опцию 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
12
12
2012-02-03 17:09:54 +0000

Если вы можете администрировать целевой хост, вы можете настроить sshd, чтобы он позволял передавать переменные локального окружения на целевой хост.

Из man-страницы 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
6
6
2010-07-13 17:52:27 +0000

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

ssh remote.host my_command

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

ssh remote.host env ENV_VAR=$ENV_VAR my_command
4
4
4
2019-06-12 10:45:04 +0000

На вашем локальном клиенте, в вашем ~/.ssh/config вы можете добавить SetEnv, например,

Host myhost
  SetEnv FOO=bar

Примечание: Проверьте man ssh_config.

Затем на сервере убедитесь, что клиент передает определенные переменные окружения в вашем файле конфигурации /etc/ssh/sshd_config:

AcceptEnv LANG LC_* FOO BAR*

Замечание: Проверьте man sshd_config.

3
3
3
2018-05-14 14:36:55 +0000

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

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

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

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

1
1
1
2010-07-13 17:15:31 +0000

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

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

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

1
1
1
2015-08-28 16:55:01 +0000

Я создавал пользовательскую сборку OpenSSH для устройства с cramfs в домашнем каталоге и /etc (Cram FS доступен только для чтения), поэтому ~/.ssh/окружение не будет работать без перестройки всего FS, и это были полевые развернутые устройства (Встраиваемые системы Отсюда и использование CRAMFS). Вы можете указать в файле sshd_config расположение файла authroized_keys, но по какой-то причине environment= работает только для переменных окружения в ~/.ssh/authroized_keys. Редактирование /etc/профиля не было опцией, и мне пришлось загрузить ssh в нестандартный каталог. В session.c после child_set_env(… “MAIL”…) просто добавьте нужные вам переменные окружения(Это хак, который я знаю…), но если вы компилируетесь из исходников, то это можно сделать, если кому-то нужна жестко закодированная зависть для сессии. TGI-FLOSS

0
0
0
2019-04-11 17:12:11 +0000

только одна простая команда:

ssh -t your_host_or_ip 'export some_var_name=whatever_you_want; bash'

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

19
12
7
16
20