基本上,我遇到了 php 脚本无法移动或删除文件的问题,我知道这与权限有关,因为 php 错误unlink()
告诉我的就是这个,但我不确定如何修复它。所以我希望如果我解释一下这种情况,有人可能会给我指明正确的方向,因为我对 linux CLI 的东西还很陌生...
好的,我有一个 ftp dropbox 位置,假设它位于
/var/ftp/client/dropbox/
我已经用 创建了一个 ftp 帐户pure-ftpd
。因此,当文件上传到此目录时,其所有者为ftp-user
,其组为ftp-group
,即pure-ftpd
以 的身份运行。此目录的用户/组分别设置为ftp-user
和ftp-group
。
因此,第三方脚本负责将报告(文件)发送到此 Dropbox 位置。ftp 帐户应该能够在此目录中创建子目录,以对文件进行分类。
例如,文件结构可能如下所示:
/var/ftp/client/dropbox/invoices/
/var/ftp/client/dropbox/invoices/bal_2013-06-01_2013-06-30.pdf
/var/ftp/client/dropbox/reports/
/var/ftp/client/dropbox/reports/visits/
/var/ftp/client/dropbox/reports/visits/bal_2013-06-01_2013-06-30.xlsx
“home”目录/var/ftp/client/dropbox/
chmod 是drwxrwxr-x
当子目录(例如invoices/
)由创建时ftp-user
,它正在chmod
获取drwxr-xr-x
当文件被上传(例如invoices/bal_2013-06-01_2013-06-30.pdf
)时ftp-user
,它正在chmod
获取-rw-r--r--
同时...
我有一个 php 脚本位于
/var/www/client/
该脚本应该打开文件并执行诸如使用类别名称(子目录名称)和文件名等更新数据库之类的操作。到目前为止,一切都很好。但是……
问题就在这里……
然后,脚本应该根据原因移动或删除文件(但不删除子目录)。但是使用File::delete()
(Laravel 4)或直接unlink()
使用/path/to/file
会返回“权限被拒绝”错误。
因此,从使用来看top
,当我的脚本运行时,它(apache)在www-user
和下运行www-group
。它以不同的用户/组运行是有道理的。但我该怎么做才能授予 apache/php 移动/删除文件的权限?
我尝试过加入www-user
该ftp-group
组,但仍然出现“权限被拒绝”错误。根据研究,我怀疑也许这与粘滞位或其他东西有关,但我不确定,坦率地说,所有这些目录/文件权限的东西目前有点超出我的理解范围。
那么...对于这里该做什么有什么建议吗?
编辑
我有一个想法是,这脚本删除/移动文件,我可以将 /path/to/files 插入数据库,以及需要执行的操作。然后有一个单独的脚本执行该操作,然后将该脚本放在 cronjob 上(root
或者作为ftp-user
.. 我可以这样做吗?我不确定..)。我认为这应该可行,但我不确定这样做是否是个好主意,似乎更好的解决方案是整理权限。
答案1
通过将 www 用户添加到 ftp 组,您走在正确的轨道上。不幸的是,您创建的文件没有设置组写入权限。因此只有所有者(ftp 用户)能够写入/删除它们。您还需要为组(ftp 组)创建具有写入权限的文件。(这将rw-rw-r--
代替rw-r--r--
)
新文件的默认权限通过 来控制umask
。Pure-FTP 在其配置文件中支持 umask 指令。实际上,您需要进入umask 113:003
配置文件或-U 113:003
命令行来获取正确的权限。