Написал bash скрипт для создания бекапа на локальном сервере с VDS, используя ssh ключи c парольной фразой.
Пример:
Код: Выделить всё
#!/bin/bash
cd /home/user/;
mkdir `date +%Y_%m_%d`;
cd `date +%Y_%m_%d`;
rsync -e "ssh -i /home/user/.ssh/key" -avh --rsync-path="rsync" --progress user@ip_remote_comp:/home/user/test /home/user/`date +%Y_%m_%d`;
rsync -e "ssh -i /home/user/.ssh/key" -avh --rsync-path="rsync" --progress user@ip_remote_comp:/var/www/example.com/test2 /home/user/`date +%Y_%m_%d`;
При выполнении rsync, идет запрос парольной фразы. В рабочем коде 5 строк с rsync и обращение к ключу происходит тоже 5 раз и напрягает каждый раз вводить один и тот же пароль. Можно удалить парольную фразу от ssh ключа, но мы ведь не ищем легких путей ;)
Попытался засунуть все синхронизируемые директории в одну строчку, но применить амперсанд (&), либо AND не получилось; man по rsync выдает, что можно юзать include и exclude, но эти параметры актуальны, когда синхронизируемые данные находяться в одной директории, а у меня они в разных местах..
Витает мысль, чтобы разместить команды в отдельный блок, а выше сделать одноразовое обращение к ssh ключу, но примеры такого подхода я не нашел.
Вобщем посоветуйте, пожалуйста, кто как бы поступил?
Заранее признателен за ответ!
Решение
sasha300 » 24 сен 2023, 21:15
Результат:
сам скрипт:
Код: Выделить всё
#!/bin/bash
cd /home/user/;
mkdir `date +%Y_%m_%d`;
rsync -e "ssh -p port_change -i /home/user/.ssh/openssh_key" -avzh --include-from='include.txt' --exclude '*' --rsync-path="rsync" --progress user@ip_server:/ /home/user/`date +%Y_%m_%d`;
user@ip_server:/ ссылается на корневую директорию сервера, но параметр --exclude '*' все глушит, но самая вишенка в содержимом файле include.txt:
Код: Выделить всё
+ home/
+ home/user/
+ home/user/directory/***
+ var/
+ var/www/
+ var/www/directory/***
и так хоть двести директорий..
т.е. следуя man rsync:
If a pattern excludes a particular parent directory, it can render a deeper include pattern ineffectual because rsync did not descend through that excluded section of the hierarchy. This is particularly important when using a trailing ’*’ rule. For instance, this won’t work:
+ /some/path/this-file-will-not-be-found
+ /file-is-included
- *
This fails because the parent directory "some" is excluded by the ’*’ rule, so rsync never visits any of the files in the "some" or "some/path" directories. One solution is to ask for all directories in the hierarchy to be included by using a single rule: "+ */" (put it somewhere before the "- *" rule), and perhaps use the --prune-empty-dirs option. Another solution is to add specific include rules for all the parent dirs that need to be visited. For instance, this set of rules works fine:
+ /some/
+ /some/path/
+ /some/path/this-file-is-found
+ /file-also-included
- *
получается, что для успешной синхронизации директорий, находящихся в разных местах, надо писать include файл последовательно, сначала одна директория, затем директория/директория, потом директория/директория/директория и так уже до нужной папки.
Вопрос исчерпан, всем добра!
p.s.: Респект
demonlibra, что навел на правильный вектор..
Перейти к ответу ➙