Як я можу встановити змінні середовища для віддаленого процесу rsync?


12

Коли я використовую rsync для копіювання файлів з одного комп'ютера на інший, процес rsync запускається з обох кінців. Однак на віддаленому кінці файли ініціалізації оболонки, мабуть, не читаються, тому я не можу встановити змінні середовища для віддаленого процесу rsync. На жаль, є один сервер, на який мені потрібно rsync, на якому для роботи rsync потрібна змінна середовище. Я не адміністратор на сервері, тому не можу змінити глобальну конфігурацію. Що я можу зробити, щоб встановити змінну середовище для віддаленого процесу rsync?


Як запустити процес rsync на сервері? Чи можете ви запустити сценарій через ssh?
крафтан

Після цього rsync localfilename remotehost:remotefilenameна сервері запускається процес rsync. Я не точно впевнений, як, але він не читає жодних файлів ініціалізації оболонок.
Райан К. Томпсон

Відповіді:


20

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

Ssh підтримує надсилання змінних середовища. У OpenSSH використовуйте SendEnvдирективу в ~/.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

Ну, це в значній мірі підсумовує це. Я сподівався, що існує кращий спосіб, ніж використання сценарію обгортки.
Райан К. Томпсон

Але зачекай хвилинку. Якщо мої файли оболонки init не читаються, як вона може навіть знайти бінарний файл rsync на сервері? Я встановив у ~ / usr, нестандартному розташуванні, яке мені потрібно додати до свого $PATHскрипта з init init.
Райан К. Томпсон

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

Про що ~/.ssh/rc?
Райан К. Томпсон

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