Я использую Duplicity для резервного копирования моего сервера на другой.
Поскольку существует несколько серверов, я хочу создать bash-скрипт, который запускается с cron
разделяющего папки (и серверы). Для этого я сделал монтаж команды в строке:
printf -v DulicityCMD 'duplicity --log-file %s --progress --no-encryption --include="/etc" --include="/var/log" --include="/var/db" --include="/var/www" --include="/home" --exclude="**" / scp://duplicity@myhost.com:22//home/duplicity/backups/%s' $LOG_FILE $VPSNAME
echo $DulicityCMD
# THIS
$DulicityCMD
# OR THIS
sudo $DulicityCMD
Если вы отобразите содержимое $DulicityCMD
с помощью echo
оно будет выглядеть примерно так:
duplicity --log-file /var/log/duplicity/backup.log --progress --no-encryption --include="/etc" --include="/var/log" --include="/var/db" --include="/var/www" --include="/home" --exclude="**" / scp://duplicity@myhost.com:22//home/duplicity/backups/myhost
При наборе этой команды, точно так же, как то, что отображается с помощью echo
, все работает отлично. Однако, когда он запускается из переменной в bash
, он не работает.
Даже если я запускаю это с помощью sudo
или как пользователь root, это не работает.
Вывод ошибки таков:
Traceback (most recent call last):
File "/bin/duplicity", line 1546, in <module>
with_tempdir(main)
File "/bin/duplicity", line 1540, in with_tempdir
fn()
File "/bin/duplicity", line 1375, in main
action = commandline.ProcessCommandLine(sys.argv[1:])
File "/usr/lib64/python2.7/site-packages/duplicity/commandline.py", line 1131, in ProcessCommandLine
set_selection()
File "/usr/lib64/python2.7/site-packages/duplicity/commandline.py", line 969, in set_selection
sel.ParseArgs(select_opts, select_files)
File "/usr/lib64/python2.7/site-packages/duplicity/selection.py", line 268, in ParseArgs
self.add_selection_func(self.glob_get_sf(arg, 1))
File "/usr/lib64/python2.7/site-packages/duplicity/selection.py", line 434, in glob_get_sf
sel_func = self.glob_get_filename_sf(glob_str, include)
File "/usr/lib64/python2.7/site-packages/duplicity/selection.py", line 485, in glob_get_filename_sf
raise FilePrefixError(filename)
FilePrefixError: "/etc"
Когда я использую eval
, я не получаю эту ошибку, но она теряет права root и не работает должным образом. Потому что мне нужно использовать вывод этого в сочетании с другой командой (sendmail), используя |
,
В чем проблема и как я могу это исправить?