Когда я использую rsync для копирования файлов с одного компьютера на другой, процесс rsync запускается на обоих концах. Однако на удаленном конце файлы инициализации оболочки, по-видимому, не читаются, поэтому я не могу установить переменные среды для удаленного процесса rsync. К сожалению, есть один сервер, на котором мне нужно rsync, на котором для работы rsync требуется переменная окружения. Я не являюсь администратором на сервере, поэтому я не могу изменить глобальную конфигурацию. Что я могу сделать, чтобы установить переменные среды для удаленного процесса rsync?
ssh
rsync
environment-variables
remote-connection
Райан К. Томпсон
источник
источник
rsync localfilename remotehost:remotefilename
, процесс rsync запускается на сервере. Я не совсем уверен, как, но он не читает никаких файлов инициализации оболочки.Ответы:
~/.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
(конечно, это не будет применяться, если вы не используете этот ключ для аутентификации):Обратите внимание, что я поместил разрывы строк выше для удобочитаемости, но на самом деле это все должно быть на одной строке.
Другая возможность - написать скрипт-обертку
~/bin/rsync-wrapper
на сервере, что-то вродеЗатем перейдите
--rsync-path='bin/rsync-wrapper'
вrsync
командную строку. Аргумент to--rsync-path
расширяется оболочкой, поэтому, если вы предпочитаете, вы можете сделать командную строку rsync самодостаточной, передав что-то вроде--rsync-path='. ~/.profile; rsync'
.Есть еще один путь, который зависит от того, какая оболочка для входа в систему - bash или zsh. Bash всегда читает,
~/.bashrc
когда он вызывается с помощью rshd или sshd, даже если он не интерактивен (но не если он вызывается какsh
). Зш всегда читает~/.zshenv
.источник
$PATH
в свои скрипты инициализации оболочки.PATH
во внимание, вы сможете установить любую другую переменную там. (Если это не сработает, попробуйте добавить как можно больше трассировок, начиная сset -x
любого сценария оболочки; заменитеrsync
двоичный файл сценарием-оболочкой, который выводит среду в файл, а затем вызывает настоящий двоичный файл.)~/.ssh/rc
?~/.ssh/rc
выполняется отдельным процессом оболочки. Я думаю, что ваш лучший выбор - сценарий-обертка или--rsync-path='. ~/.profile; rsync'
. Или перекомпиляцияrsync
с подходящим rpath согласно вашему другому вопросу.