Назад | Перейти на главную страницу

Использование crontab для удаления файлов папки tmp, созданных пользователем apache

В настоящее время я настроил его так, что пользователи могут загружать zip-файлы с моего сайта, и они хранятся в /tmp/zip_file_dir/. Скрипт PHP сначала загружает их с моего CDN, используя ftp_get() а затем помещает их в эту папку, например /tmp/zip_file_dir/random_hash_folder/file_here.zip. Тогда я просто использую readfile() чтобы начать загрузку для пользователя. Все работает нормально.

Однако позже я использую cronjob, чтобы очистить эту папку (скрипт удаляет загрузки после readfile(), но если пользователь отменяет сценарий загрузки, файлы не удаляются им, следовательно, задача cron - очистить их).

В file_here.zip файл имеет разрешения -rw-r--r-- с владельцем apache. Каждый random_hash_folder в zip_file_dir имеет разрешения drwxr-xr-x с владельцем apache. Cronjob просто сканирует zip_file_dir и использует rmdir() и unlink() для удаления файлов.

Cronjob запускает пользователь с доступом sudo к серверу (т.е.больше разрешений и возможностей, чем у apache пользователь). Тем не менее, я продолжаю получать уведомления PHP «Permission denied» при попытке удалить файлы.

Я попытался добавить пользователя sudo, выполняющего задание cron, в apache и nobody группы, упомянутые в другом месте моего исследования Google, но это не принесло мне удачи.

Есть идеи, как мне получить эту cronjob для удаления этих файлов?

Изменить: я использую RHEL.

Вам не нужно больше разрешений и возможностей, чем пользователю Apache. Поскольку эти файлы создал пользователь apache, пользователь apache может их уничтожить. Пользователь apache кажется мне наиболее подходящим пользователем.

Вы можете либо поместить задание cron в crontab пользователя apache ( sudo crontab -u apache -e) или запустите задание из crontab root от имени пользователя apache:

1 5 * * * su apache -c "/path/to/cleanup_script.php"

Выберите вариант, который поможет вам легче всего отслеживать ваши задания cron.

Вы можете запустить cronjob с веб-сервера Apache (так что в Cron вы помещаете только HTTP-вызов), а также вы можете убедиться, что все ваши права доступа к файлам и папкам равны 777 при их создании. При создании папки вы можете указать режим, и при создании файла вы можете сделать то же самое. Вы также можете использовать setacl в этой папке, чтобы у обоих пользователей было разрешение, и он распространяется вниз по папке, например:

# mkdir /tmp/zip_files
# chown apache:apache /tmp/zip_files
# chmod og-rwx /tmp/zip_files
# setfacl -m u:test:rwx zip_files/    # allow test user to enter the folder
# setfacl -m d:u:test:rwx zip_files/  # assure test permissions to created files and folders
# setfacl -m u:test:rwx zip_files/
# getfacl /tmp/zip_files

Где "test" - это ваш пользователь, от которого вы запускаете cron.

пс. Забудьте о sudo, для этого вам не нужен root-доступ.