Как я могу установить переменные окружения для удаленного процесса rsync?


12

Когда я использую rsync для копирования файлов с одного компьютера на другой, процесс rsync запускается на обоих концах. Однако на удаленном конце файлы инициализации оболочки, по-видимому, не читаются, поэтому я не могу установить переменные среды для удаленного процесса rsync. К сожалению, есть один сервер, на котором мне нужно rsync, на котором для работы rsync требуется переменная окружения. Я не являюсь администратором на сервере, поэтому я не могу изменить глобальную конфигурацию. Что я могу сделать, чтобы установить переменные среды для удаленного процесса rsync?


Как запустить процесс rsync на сервере? Не могли бы вы запустить скрипт через ssh?
— Крафтан

Когда вы это делаете rsync localfilename remotehost:remotefilename, процесс rsync запускается на сервере. Я не совсем уверен, как, но он не читает никаких файлов инициализации оболочки.
— Райан К. Томпсон

Ответы:


20

~/.profileобычно не читается при запуске ssh somecommand, в отличие от интерактивного сеанса SSH (или другого метода входа в систему, когда вы запускаете интерактивный сеанс).

Ssh поддерживает отправку переменных окружения. В OpenSSH используйте SendEnvдирективу in ~/.ssh/config. Однако конкретная переменная среды должна быть включена с помощью AcceptEnvдирективы в конфигурации сервера , так что это может не сработать для вас.

OpenSSH также позволяет устанавливать переменные среды на стороне сервера. Опять же, это должно быть включено в конфигурации сервера, здесь с PermitUserEnvironmentдирективой. Переменные могут быть установлены в файле ~/.ssh/environment. Предполагая, что вы используете аутентификацию с открытым ключом, вы также можете установить переменные для каждого ключа в ~/.ssh/authorized_keys: добавить environment="FOO=bar"в начале соответствующей строки.

Одна вещь, которая, я думаю, всегда работает (как ни странно), если вы используете аутентификацию с открытым ключом, - это (ab) использовать command=опцию в authorized_keysфайле. Ключ с commandопцией подходит только для запуска указанной команды; но команда в authorized_keysфайле выполняется с переменной среды, SSH_ORIGINAL_COMMANDустановленной для команды, указанной пользователем (пусто для интерактивных сеансов). Таким образом, вы можете использовать что-то вроде этого ~/.ssh/authorized_keys(конечно, это не будет применяться, если вы не используете этот ключ для аутентификации):

command="export LD_LIBRARY_PATH=\"$HOME\"/lib;
         if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
           eval \"$SSH_ORIGINAL_COMMAND\";
         else exec \"$SHELL\"; fi" ssh-rsa …

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

Другая возможность - написать скрипт-обертку ~/bin/rsync-wrapperна сервере, что-то вроде

#!/bin/sh
. ~/.profile
exec rsync "$@"

Затем перейдите --rsync-path='bin/rsync-wrapper'в rsyncкомандную строку. Аргумент to --rsync-pathрасширяется оболочкой, поэтому, если вы предпочитаете, вы можете сделать командную строку rsync самодостаточной, передав что-то вроде --rsync-path='. ~/.profile; rsync'.

Есть еще один путь, который зависит от того, какая оболочка для входа в систему - bash или zsh. Bash всегда читает, ~/.bashrcкогда он вызывается с помощью rshd или sshd, даже если он не интерактивен (но не если он вызывается как sh). Зш всегда читает ~/.zshenv.

## ~/.bashrc
if [[ $- != *i* ]]; then
  # Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
  . ~/.profile
fi

## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
  # Not a login shell, but this is an rsh/ssh session
  . ~/.profile
fi

Ну, это в значительной степени подводит итог. Я надеялся, что есть лучший способ, чем использовать скрипт-обертку.
— Райан К. Томпсон

Но подожди минутку. Если мои файлы инициализации оболочки не читаются, как он может найти двоичный файл rsync на сервере? Я установил в ~ / usr, нестандартное место, которое я должен добавить $PATHв свои скрипты инициализации оболочки.
— Райан К. Томпсон

@Ryan: Я на самом деле забыл самый прямой метод (см. Мое редактирование), но он также требует, чтобы директива была включена в конфигурации сервера. Если вы нашли способ принять это PATHво внимание, вы сможете установить любую другую переменную там. (Если это не сработает, попробуйте добавить как можно больше трассировок, начиная с set -xлюбого сценария оболочки; замените rsyncдвоичный файл сценарием-оболочкой, который выводит среду в файл, а затем вызывает настоящий двоичный файл.)
— Gilles 'SO - перестань быть злым '

Как насчет ~/.ssh/rc?
— Райан К. Томпсон

@Ryan: ~/.ssh/rcвыполняется отдельным процессом оболочки. Я думаю, что ваш лучший выбор - сценарий-обертка или --rsync-path='. ~/.profile; rsync'. Или перекомпиляцияrsync с подходящим rpath согласно вашему другому вопросу.
— Жиль "ТАК - перестань быть злым"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.