Назад | Перейти на главную страницу

Переменные среды недоступны при запуске скриптов через ssh

Предположим, у меня есть два хоста: A и B с пользователями a и b. B - это Windows-машина с установленным Cygwin, если это важно.

B настроен для доступа из A через SSH без пароля (он содержит открытый ключ RCA A), поэтому я могу запускать команды на нем из A следующим образом:

ssh b@B [command]

Но когда я пытаюсь запустить команду, требующую доступа к переменной среды, команда не работает:

[15:54:08] - a@A - ~
$ ssh b@B 'echo $ANT_HOME'

возвращает пустую строку.

Эта же команда при прямом подключении (не через SSH) выполняется правильно:

b@B ~
$ echo $ANT_HOME
/cygdrive/c/PROGRA~1/apache-ant-1.9.0

Последнее возможно, потому что соответствующие переменные были экспортированы в "bash_profile":

export JAVA_HOME="/cygdrive/c/PROGRA~1/Java/jdk1.7.0_45"
export ANT_HOME="/cygdrive/c/PROGRA~1/apache-ant-1.9.0"

но почему-то это не относится к случаю SSH.


Дополнительная информация, которая может быть полезна.

На хосте B установлена ​​Windows XP + Cygwin. CYGWIN sshd запускается под учетной записью SYSTEM. JAVA_HOME и ANT_HOME определены в разделе "системные" переменные среды Windows.

Когда я запускаю команду «$ ssh b @ B env», она не выводит ANT_HOME или JAVA_HOME, но если я включу их в файл sshd_config, это произойдет. Но даже тогда простая команда ssh b @ B 'echo $ ANT_HOME' не работает, как я ожидал.

Подскажите, пожалуйста, что нужно сделать, чтобы запустить команду через SSH.

Когда вы запускаете команду в качестве аргумента для ssh, команда запускается непосредственно sshd; оболочка не задействована.

Вы можете проверить это, используя что-то вроде следующего:

ssh b @ B pstree

Это оболочка (в данном случае bash), которая втягивает ваш .bash_profile, и это происходит только в том случае, если оболочка вызывается как оболочка входа в систему или если оболочка была вызвана с параметром --login (см. Страницу руководства bash ; ищите ПРИЗЫВ). Среда, которую вы получаете при прямом запуске команды, устанавливается такими вещами, как sshd и PAM, когда вы входите в систему.

Таким образом, если вам нужен ваш .bash_profile, вам нужно запустить его под оболочкой, и вам нужно запустить оболочку как интерактивную оболочку или оболочку входа в систему, например:

ssh b @ B "bash -l -c 'env'"

Это должно дать вам желаемый результат. Единственное, на что следует обратить внимание, это то, что цитирование довольно быстро становится сложным. Обратите внимание, что в Linux, по крайней мере,

ssh b @ B bash -l -c 'env'

не получит оболочку входа в систему (я не уверен, почему).

На страницах руководства моего сервера:

  1. Читает файл ~ / .ssh / environment, если он существует, и пользователям разрешено изменять свое окружение. См. Параметр PermitUserEnvironment в sshd_config (5).

Вам необходимо объявить переменные среды и разрешить их на удаленном сервере. /etc/ssh/sshd_config, включив свойство PermitUserEnvironment как PermitUserEnvironment yes и установите переменные среды в ~ / .ssh / environment.