目前,我已将其设置为用户可以从我的网站下载 zip 文件,并且这些文件存储在 中/tmp/zip_file_dir/
。PHP 脚本首先使用 从我的 CDN 下载它们ftp_get()
,然后将它们放在该文件夹中,例如/tmp/zip_file_dir/random_hash_folder/file_here.zip
。然后我只需使用readfile()
为用户启动下载即可。一切正常。
但是,我稍后使用 cronjob 来清除该文件夹(脚本会删除之后的下载readfile()
,但是如果用户取消下载脚本,则文件不会被删除,因此 cronjob 的目的就是清理这些文件)。
该文件具有所有者的file_here.zip
权限。每个文件都具有所有者的权限。cronjob 只需扫描 zip_file_dir 并使用和删除文件。-rw-r--r--
apache
random_hash_folder
zip_file_dir
drwxr-xr-x
apache
rmdir()
unlink()
cronjob 由具有服务器 sudo 访问权限的用户运行(即比用户拥有更多权限和能力apache
)。但是,当我尝试删除文件时,我不断收到 PHP“权限被拒绝”通知。
我尝试将运行 cron 作业的 sudo 用户添加到apache
和nobody
组,正如我在 Google 研究中其他地方提到的那样,但这并没有给我带来任何运气。
有什么想法我可以如何让这个 cronjob 删除这些文件吗?
编辑:我正在使用 RHEL。
答案1
您不需要比 Apache 用户拥有更多的权限和能力。由于 apache 用户创建了这些文件,因此 apache 用户可以销毁它们。在我看来,apache 用户似乎是最合适的用户。
您可以将 cron 作业放入 apache 用户的 crontab ( sudo crontab -u apache -e
) 中,或者以 apache 用户身份从 root 的 crontab 运行该作业:
1 5 * * * su apache -c "/path/to/cleanup_script.php"
选择可以帮助您最轻松地跟踪 cron 作业的选项。
答案2
您可以从 Apache Web 服务器运行 cronjob(因此在 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 的用户。
ps. 忘记 sudo 吧,你不需要以 root 身份来做这件事。