Используйте кавычки:
shasum -a "$sha" "$shapath"
Переменные будут раскрыты как отдельные аргументы независимо от пробелов в значениях.
TL, DR: запустите резервную копию от имени пользователя root. Нет ничего плохого в авторизации точной команды rsync
через sudo, если вы внимательно просматриваете параметры; было бы неправильно разрешить вызывающей стороне указывать параметры.
Если вы хотите, чтобы пользователь резервной копии мог читать файл, см. Разрешить пользователю читать домашние каталоги некоторых других пользователей Идея состоит в том, чтобы создать представление bindfs для файловая система, в которой этот пользователь может все читать.
Но уровень файлов - не лучший уровень для решения этой конкретной проблемы. Проблема с резервными копиями, сделанными с помощью rsync
, заключается в том, что они несовместимы: если пользователь изменяет file1
, то file2
во время резервного копирования, но резервное копирование достигает file2
перед file1
, тогда резервная копия будет содержать старую версию file2
и новую версию file1
. Если file2
- это новая версия file1
, а file1
удален, это означает, что этот файл вообще не появится в резервной копии, что явно плохо. .
Решением этой проблемы является создание моментального снимка файловой системы и запуск резервного копирования оттуда.
В зависимости от технологии создания снимков может быть способ гарантировать, что пользователь сможет прочитать снимок. Если нет, смонтируйте снимок и используйте универсальное решение на основе файловой системы. И даже если есть, rsync все равно проблематичен, потому что, если вы запустите его как обычный пользователь, он не сможет выполнить резервное копирование владения.Поэтому, если вы выполняете резервное копирование каталогов нескольких пользователей, вам потребуется для запуска резервного копирования от имени пользователя root.
Существует только один пользователь, а именно root
, который может читать любой файл в системе. Именно по этой причине любое коммерческое программное обеспечение для резервного копирования требует для работы права root. Есть много различных способов сделать это, но если вы собираетесь использовать rsync, я бы предложил вам создать учетную запись, эквивалентную root, с оболочкой, установленной на что-то вроде /sbin/nologin
или эквивалентную, и поручить этому пользователю выполнять команды rsync в сценарии, используя cron
. Использование sudoers
усложнит ситуацию и откроет целый ряд новых проблем.
Другой (немного сложный ;) ) способ заключается в том, чтобы сделать доступ к связанному разделу только для чтения (если разделы raw, то kpartx -r
, если lvm (предпочтительно!), то lvm snapshot, если btrfa/zfs/whatever со встроенной функцией snapshot (тоже предпочтительно)) и дать пользователю резервного копирования права только для чтения. Затем подготовьте крошечный linux в kvm, который автоматически создает резервные копии этого раздела (заданного через виртуальный HDD) в место назначения (заданное, например, p9 aka shared folders, если используется qemu/kvm).