目前,我已经设置了这样一个用户可以从我的网站下载zip文件,并将其存储在/tmp/zip_file_dir/ 。 PHP脚本首先使用ftp_get()从我的CDN下载它们,然后将它们放在该文件夹中,如/tmp/zip_file_dir/random_hash_folder/file_here.zip 。 然后,我只需使用readfile()为用户启动下载。 这一切工作正常。
不过,我后来用cronjob清除这个文件夹(脚本删除readfile()后的下载,但是如果用户取消下载脚本,文件不会被删除,因此cronjob的要点清理这些)。
file_here.zip文件拥有所有者apache的权限-rw-r--r-- file_here.zip 。 random_hash_folder中的每个random_hash_folder具有所有者apache的权限drwxr-xr-x 。 cronjob只是扫描zip_file_dir,并使用rmdir()和unlink()删除文件。
cronjob由用户通过sudo访问服务器来运行(即比apache用户更多的权限和能力)。 但是,当我试图删除文件时,我总是得到PHP“Permission denied”通知。
我已经尝试添加运行cron作业的sudo用户到apache以及我的一些Google研究中其他地方提到的nobody组,但这并没有给我带来任何好运。
任何想法如何让这个cronjob删除这些文件?
编辑:我正在使用RHEL。
你不需要比Apache用户更多的权限和能力。 由于apache用户创build这些文件,apache用户可以销毁它们。 Apache用户似乎是我最合适的用户。
你可以把你的cron作业放在apache用户的crontab( sudo crontab -u apache -e )中,或者作为apache用户从root的crontab运行这个作业:
1 5 * * * su apache -c "/path/to/cleanup_script.php"
select可帮助您跟踪您的cron作业最简单的选项。
您可以从Apache Web服务器运行cronjob(所以在Cron中只能进行HTTP调用),并且您可以确保在创build文件和文件夹时所有对文件和文件夹的权限都是777。 制作文件夹时,可以指定模式,当创build文件时,可以使其相同。 你也可以在该文件夹上使用setacl,这样两个用户都有权限,并且在文件夹中传播,如下所示:
# mkdir /tmp/zip_files # chown apache:apache /tmp/zip_files # chmod og-rwx /tmp/zip_files # setfacl -mu:test:rwx zip_files/ # allow test user to enter the folder # setfacl -md:u:test:rwx zip_files/ # assure test permissions to created files and folders # setfacl -mu:test:rwx zip_files/ # getfacl /tmp/zip_files
“test”是你的用户,你运行cron。
PS。 忘记sudo,你不需要访问root来做到这一点。