我的问题是关于以特定用户身份访问文件时出现“权限被拒绝”错误时的常规故障排除,这里有一个具体的例子,我可以使用一些额外的帮助:
作为用户“builder”,我的主目录中有一个属于组“builders”的文件夹“repo”。它当前内容如下:
$ pwd
/home/builder/repo
$ ls -la
total 4
drwxr-sr-x 2 builder builders 20 Jun 9 02:28 .
drwxr--r-- 4 builder builder 123 Jun 7 23:36 ..
-rw-rw-r-- 1 builder builders 5 Jun 9 02:18 status
因此,我可以看到“builders”组中的每个人都应该能够访问该“status”文件。需要注意的是,作为“builder”用户,我可以读取它,文件未损坏且可读,即cat /home/builder/repo/status
返回其内容。
但是,由于某种原因,我无法以另一个用户的身份访问它 - “ec2-user”,而该用户恰好属于 builders 组:
$ whoami
ec2-user
$ groups
ec2-user adm wheel systemd-journal docker builders
$ ls -la /home/builder/repo/status
ls: cannot access /home/builder/repo/status: Permission denied
$ cat /home/builder/repo/status
cat: /home/builder/repo/status: Permission denied
我显然遗漏了一些东西,但我仍然无法回答为什么属于同一组的用户无法访问该文件。还有其他东西可以告诉我需要做什么(例如作为超级用户或所有者)才能正确授予目录/文件的组访问权限 - 或者只是找出为什么读取权限对某些用户不起作用?我自己找到的唯一答案就是仔细检查所有权信息和访问控制位,但在上面的例子中一切看起来都很好。
答案1
你得到没有权限错误,因为/home/builder
目录缺少x
组和其他人的 (执行) 位。这会阻止组成员和其他人更改/home/builder
目录或访问其下的任何内容。
这取决于如果只是意外设置了什么,你可以将x
组的(执行)位添加到/home/builder
chmod g+x /home/builder
如果您希望组成员仅访问子文件夹并阻止他们列出内容/home/builder
,您可以添加(执行)位并从文件夹中x
删除(读取)位。r
chmod g+x,g-r /home/builder
o
您可能还想像上面一样更改(其他)的权限或将其完全删除。
对于此类问题namei
非常有用,因为它可以显示路径下文件的所有权限。您应该以有访问权限的用户身份运行它以获得所需的输出。
# namei -olm /tmp/test/testdir/status
f: /tmp/test/testdir/status
dr-xr-xr-x root root /
drwxrwxrwt root root tmp
drwxr-x--x root root test
drwxr-xr-x root root testdir
-rw-r--r-- root root status