Запуск команды tar из php приводит к невозможности разорвать связь: файловая система, доступная только для чтения

#php #laravel #backup #tar #archlinux

#php #ларавель #резервная копия #смола #archlinux

Вопрос:

Я пытаюсь реализовать простую функцию резервного копирования некоторых каталогов (в основном каталогов в /etc), которая обрабатывается laravel. В основном я храню архивы .tar, содержащие определенные файлы каталогов.

Эта команда используется для создания архива резервной копии одного каталога:

 shell_exec("cd {$backupPath} amp;amp; tar -cf {$dirName}.tar -P {$fullPathToDir}")  

Это команда для восстановления каталога из архива резервной копии:

 shell_exec("cd / amp;amp; sudo tar -xf {$backupPath . $dirName} --recursive-unlink --unlink-first")  

По причинам тестирования я разрешил запускать http-пользователя sudo tar , однако моей первоначальной идеей было создать скрипт bash, который будет обрабатывать это, и добавить его в sudoers. Запуск команды или сценария оболочки приводит к тем же ошибкам.

Проблема в том, что если я запускаю его через php, я получаю такие ошибки:

 Cannot unlink: Read-only file system  

Но, если я запущу его из командной строки, он будет работать:

 su http -s /bin/bash -c "cd / amp;amp; sudo tar -xf {$backupPath . $dirName} --recursive-unlink --unlink-first"  

Запуск этого как в полной системе archlinux, так и в контейнере докеров archlinux дает мне одинаковые результаты. Я был бы признателен за любую помощь.

Комментарии:

1. php запускается как www-данные:www-данные(я думаю), которые не являются владельцами файловой системы. Необходимо изменить права доступа к файлу

Ответ №1:

Таким образом, проблема была с блоком systemd для php-fpm 7.4, где ProtectSystem было установлено значение true, после того, как он прокомментировал это, все работало так, как ожидалось.

 sed -i 's:ProtectSystem=full:#ProtectSystem=full:' /usr/lib/systemd/system/php-fpm7.service