Как я могу установить переменные окружения для удаленного процесса 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.