Когда я использую rsync для копирования файлов с одного компьютера на другой, процесс rsync запускается на обоих концах. Однако на удаленном конце файлы инициализации оболочки, по-видимому, не читаются, поэтому я не могу установить переменные среды для удаленного процесса rsync. К сожалению, есть один сервер, на котором мне нужно rsync, на котором для работы rsync требуется переменная окружения. Я не являюсь администратором на сервере, поэтому я не могу изменить глобальную конфигурацию. Что я могу сделать, чтобы установить переменные среды для удаленного процесса rsync?
1 ответ
~/.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