Есть ли способ отправить настраиваемые аргументы на сервер rsync?

Обычно я использую при автоматической установке - noreboot --noautoconsole что в значительной степени покрывает полностью автоматическую установку. При этом, как правило, быстрее и лучше использовать virt-builder вместо virt-install , поскольку команда более стабильна, а обработка изображений выполняется быстрее и согласованнее, чем полная объемная установка ОС. С готовым шаблоном образа виртуальной машины все происходит даже быстрее, чем этот.

5
20.07.2016, 19:08
3 ответа

Возможно, вы могли бы использовать опцию -M (длинная версия --remote-option), которая, похоже, не проверяется клиентом rsync. -M-xxx передается на remote с -M, зачеркнутым как -xxxx. Вы можете легко поиграть с этим, используя -M-M-xxxx, который игнорируется клиентом и удаленным:

rsync -av -M-M-myvar=val /tmp/test/ remote:test/

Если ваш сервер распознает и удалит результирующие флаги перед вызовом rsync, вы получите то, что вам нужно.

Вы можете играть дальше с --rsync-path, который позволяет вам запустить любой скрипт. Он получит конкатенированные удаленные args. Например,

rsync -a -M-myvar=val --rsync-path='echo hello >/tmp/out; ./mysync' /tmp/test/ remote:test/

запустит на удаленном компьютере что-то вроде

echo hello >/tmp/out
./mysync --server -logDtpre.iLsfx -myvar=val . test/
5
27.01.2020, 20:36

Это не совсем красиво, но все это можно спрятать в сценарии:

SSH может отправлять произвольные переменные среды через туннель; и клиент, и сервер должны быть настроены для этого. Клиент легко сделать с опцией -o ; сервер, который необходимо указать в файле sshd_config . Принимать произвольные - плохая идея, но должно сработать что-то вроде этого:

BACKUP_PROVIDER_VAR1=val1 rsync -e 'ssh -o SendEnv=BACKUP_PROVIDER_*' …

Затем вам нужно будет поместить AcceptEnv LANG LC_ * BACKUP_PROVIDER _ * в свой sshd_config (который, насколько я знаю, может быть ограничен только определенным пользователем / группой с блоком Match ). На самом деле, вам, вероятно, не нужны LANG или LC _ * из ваших клиентов резервного копирования, поэтому вам просто нужны ваши собственные пользовательские переменные окружения.

3
27.01.2020, 20:36

Начиная с версии rsync 3.1.0, аргумент - remote-option (или его сокращенная форма -M ) доступен для передачи аргументов серверу. Например, предоставление клиенту команды:

$ rsync -av -M --customarg1=value1 -M --customarg2=value2 file1 file2 user@server:some/path

приведет к тому, что серверная команда получит аргументы с префиксом -M , но без -M , в SSH_ORIGINAL_COMMAND переменная.Примерно так:

rsync --server -vnlogDtpre.iLsfxC --customarg1=value1 --customarg2=value1 . some/path

Пользовательские аргументы должны быть обработаны и удалены из командной строки перед вызовом серверной rsync (в противном случае он завершится с ошибкой, потому что он их не распознает). Один из способов сделать это - сопоставление регулярного выражения:

rsync_cmd="$SSH_ORIGINAL_COMMAND"
[[ "$rsync_cmd" =~ --customarg1=([a-zA-Z0-9]+) ]] && customarg1=${BASH_REMATCH[1]}
[[ "$rsync_cmd" =~ --customarg2=([a-zA-Z0-9]+) ]] && customarg2=${BASH_REMATCH[1]}
rsync_cmd=$(sed -re 's/--(customarg1|customarg2)=[a-zA-Z0-9]+//g' <<< $rsync_cmd)

(пример сопоставления регулярного выражения позволяет параметру быть буквенно-цифровым)

Одно предостережение заключается в том, что он не работает, если клиенту rsync присвоено значение -s (или - protect-args ), потому что это вызывает внутреннюю передачу аргументов между клиентом rsync и сервером - они не отображаются в оболочке, не включены в $ SSH_ORIGINAL_COMMAND , и поэтому не может быть изменен.

Альтернативный метод - использовать - rsync-path для передачи настраиваемых аргументов. Этот метод работает со старыми версиями rsync, в которых отсутствует -M , а также с параметром - protect-args :

$ rsync --rsync-path='rsync --customarg1=value1 --customarg2=value2' -av file1 file2 user@server:some/path
0
27.01.2020, 20:36

Теги

Похожие вопросы