TL;DR:当我将文件从一个文件夹移动到另一个文件夹时,目标文件夹会丢失其可执行属性,使其及其内容无法访问
[最初发布在 Stack Overflow 上,但因不是编程问题而重新发布到 Unix & Linux]
我有一个子文件夹,在处理父文件夹中的文档后,我的应用程序(Laravel,但问题似乎与其无关)需要将文档移动到子文件夹中。将文档从父文件夹移动到子文件夹后,子文件夹会丢失其“x”可执行属性,将其从“drwxrwx---”更改为“drw-rw----”。这使得内容无法访问并阻止将来向任一方向移动。当我尝试列出子文件中的文件时,它会报告每个文件的“ls:无法访问权限被拒绝”,然后列出它们的属性为“-?????????”。
下面您将看到源目录和目标子目录的前后情况
# Source Before
drwxrwx---. 3 openapp nginx unconfined_u:object_r:httpd_sys_rw_content_t:s0 4096 Apr 11 13:42 dmarc_reports
# Source After
drwxrwx---. 3 openapp nginx unconfined_u:object_r:httpd_sys_rw_content_t:s0 4096 Apr 11 13:42 dmarc_reports
# Destination Before
drwxrwx---. 2 openapp nginx unconfined_u:object_r:httpd_sys_rw_content_t:s0 6 Apr 11 07:56 processed
# Destination After
drw-rw----. 2 openapp nginx unconfined_u:object_r:httpd_sys_rw_content_t:s0 6 Apr 11 13:42 processed
如果我使用“chmod ug+xfolder_name”重置访问权限,我可以再次访问这些文件,但当我执行另一个文件移动操作时,问题会再次出现。无论移动执行的方向如何,也无论我是在代码中执行还是仅在 shell 中使用 mv,问题都会出现。即使我禁用了 SELinux(使用 setenforce 0)并停止了 fapolicyd,也会发生这种情况。
所有文件和文件夹均归我的用户和应用程序和用户所属的 nginx 组所有。目标是源的子文件夹,因此它们位于同一文件系统中。
这让我彻底困惑了。我正在运行 CentOS Stream 9。如前所述,我已经消除了 SELinux 的问题,但作为信息,所有文件都具有“system_u:object_r:httpd_sys_rw_content_t:s0”上下文,并且文件夹具有“unconfined_u:object_r:httpd_sys_rw_content_t:” s0' 上下文。
有任何想法吗?
如果相关,第一次后(即权限更改后)失败的代码/指令如下:
// Laravel Instruction
Storage::move($fileLocation, $dest)
// Native PHP Instruction
rename(Storage::path($fileLocation), Storage::path($dest))
## Bash Instruction
mv <<original path>>/<<filename>> <<destination path>>/
在每种情况下,指令都会工作一次,然后在下一个文件中失败,直到我使用 chmod 手动重置目录权限。
答案1
所以我解决了我的问题并且感觉很愚蠢。我还每分钟运行一个 cron 作业,将文件传输到文件夹中进行处理。这项作业设置了目标文件的所有权和权限,但我已将权限应用于所有内容,而不仅仅是文件。因为它每分钟都会发生,它似乎是由我的行为触发的。感谢 @NasirRiley 让我更仔细地查看权限的状态,这让我看到它们在我没有采取任何操作的情况下发生了变化。