test -r 与 ls -l 矛盾

test -r 与 ls -l 矛盾

我正在努力解决文件和目录权限问题。 ls -l告诉我一些test -w自相矛盾的事情。

$ ls -l
total 1792
-rw-r--r--  1 root www-data     168 Jan 29 23:53 CODE_OF_CONDUCT.md
-rw-r--r--  1 root www-data   19421 Jan 29 23:53 COPYING
-rw-r--r--  1 root www-data   14547 Jan 29 23:53 CREDITS
-rw-r--r--  1 root www-data      95 Jan 29 23:53 FAQ
-rw-r--r--  1 root www-data 1414049 Jan 29 23:53 HISTORY
-rw-r--r--  1 root www-data    3638 Jan 29 23:53 INSTALL
-rw-r--r--  1 root www-data    5273 Jan 29 23:54 LocalSettings.php
-rw-r--r--  1 root www-data    1530 Jan 29 23:53 README.md
-rw-r--r--  1 root www-data   36717 Jan 29 23:53 RELEASE-NOTES-1.39
-rw-r--r--  1 root www-data     199 Jan 29 23:53 SECURITY
-rw-r--r--  1 root www-data    4371 Jan 29 23:53 UPGRADE
-rw-r--r--  1 root www-data    4496 Jan 29 23:53 api.php
-rw-r--r--  1 root www-data  156078 Jan 29 23:53 autoload.php
drwxr-xr-x  3 root www-data    4096 Jan 29 23:53 images
$ sudo -u www-data test -r INSTALL; echo "$?"
0
$ sudo -u www-data test -w INSTALL; echo "$?"
1
$ sudo -u www-data test -x INSTALL; echo "$?"
1

www-data 是 www-data 的成员

$ groups www-data
www-data : www-data

apache 似乎同意,ls因为它无法上传到image/ 我缺少什么?

操作系统:Ubuntu 22.04.1 LTS 内核:Linux 5.15.0-58-generic

答案1

确实test -w工作得很好(你的标题说test -r但问题是关于test -w,所以我认为这是一个错字)。

如果你看man test或者man [你可以看到:

-w 文件

   FILE exists and the user has write access.

请注意,test评估用户有读取权限

在您的情况下具有这些权限:

-rw-r--r--  1 root www-data    3638 Jan 29 23:53 INSTALL

用户(第一个r),组成员www-数据(第二r)和其他人(第三r),所以任何人只要他们也有权访问该目录,就可以读取权限

尽管如此, www-数据组没有也不执行权限,因此当您评估权限时www-数据你得到的用户1(或错误):

sudo -u www-data test -w INSTALL; echo "$?"
1
sudo -u www-data test -x INSTALL; echo "$?"
1

关于

apache 似乎同意 ls 因为它无法上传到图像/

这也是正确的,因为目录的权限images对该组的成员具有非写访问权限www-数据(用于sudo chmod g+w授予该组的访问权限)。

运行 apache 进程的用户还需要搜索access ( x) 访问该目录之前的所有目录。

相关内容