12

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

1 ответ1

19

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

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

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

Одна вещь , которую я думаю , что всегда работает ( как ни странно) до тех пор , как вы используете открытый ключ аутентификации является (аб) используйте 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 . Аргумент --rsync-path раскрывается оболочкой, поэтому, если вы предпочитаете, вы можете сделать командную строку rsync самодостаточной, передав что-то вроде --rsync-path='. ~/.profile; rsync' .

Есть еще один путь, который зависит от того, какая оболочка для входа в систему - bash или zsh. Bash всегда читает ~/.bashrc когда он вызывается с помощью rshd или sshd, даже если он не интерактивен (но не если он называется sh). Zsh всегда читает ~/.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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .