Contents

尽管在Linux中获得了组许可,但仍无法写入目录

1. 概述

在本教程中,我们将调查一个错误,该错误阻止我们写入目录,尽管我们的用户帐户具有组权限。我们将检查用户帐户权限、设置、目录权限、ACL 和硬件状态。

2. 问题介绍

我们可以通过执行以下步骤来重现该问题:

  • 创建一个目录
  • 将目录的所有权设置为给定组
  • 将我们当前的用户帐户添加到该组
  • 尝试在目录中创建文件——发生错误

让我们逐步解决这个问题。我们正在使用具有以下用户设置的帐户user_a

$ id
uid=1000(user_a) gid=1000(user_a) groups=1000(user_a),27(sudo),998(docker)
$ groups
user_a sudo docker

接下来,我们创建一个目录并将其所有权设置为rootstaff组中的用户:

$ mkdir sampledir
$ sudo chown root:staff sampledir
[sudo] password for user_a:
$ ls -l
total 4
drwxrwxr-x 2 root staff 4096 Apr 1 10:44 sampledir

然后我们将user_a添加到staff组:

$ sudo usermod -a -G staff user_a

最后,我们继续尝试使用touch 命令创建文件,这又会引发错误:

$ touch sampledir/samplefile.txt
touch: cannot touch 'sampledir/samplefile.txt': Permission denied

这个错误不应该发生,因为我们似乎已经做了所有必要的事情。在下一节中,我们将尝试调查可能导致错误的原因。

3. 解决方案

有几种方法可以尝试解决上述问题。让我们尝试其中的一些。

3.1. 检查用户权限和设置

在我们修改任何组(例如将user_a添加到staff组)之后,我们需要确保控制台加载这些更改:

$ id
uid=1000(user_a) gid=1000(user_a) groups=1000(user_a),27(sudo),998(docker)
$ groups
user_a sudo docker

正如我们在上面所看到的,我们正在使用的控制台没有根据我们的修改进行更新;user_a仍然不在staff组**中。

我们可以通过打开一个新控制台或在正在运行的控制台中运行su – user_a来强制执行更改:

$ su - user_a
Password:
$ id
uid=1000(user_a) gid=1000(user_a) groups=1000(user_a),27(sudo),50(staff),998(docker)
$ groups
user_a sudo staff docker
$ touch sampledir/samplefile.txt
$ ls -l sampledir
total 0
-rw-rw-r-- 1 user_a user_a 0 Apr 1 11:36 samplefile.txt

此时,我们应该能够对目录进行更改。万一失败,让我们继续下一节。

3.2. 检查目录 ACL

这种情况可能并不常见,但我们可能需要检查目录的 ACL(访问控制列表)。例如,它可能是使用特定用户和/或组的默认 ACL 创建的。

如果我们在目录权限末尾看到一个加号 ( + ),则表明该目录具有特殊的访问规则:

$ ls -l
total 4
drwxr-xr-x+ 2 root staff 4096 Apr 1 11:55 sampledir

让我们使用getfacl 命令检查目录 ACL :

$ getfacl sampledir
# file: sampledir
# owner: root
# group: staff
user::rwx
user:user_a:r-x
group::r-x
mask::r-x
other::r-x

user:user_a:rx 表明user_a只有rx访问sampledir目录。

让我们用setfacl 命令修改规则,然后验证它们:

$ sudo setfacl -m u:user_a:rwx ./sampledir
$ getfacl sampledir
# file: sampledir
# owner: root
# group: staff
user::rwx
user:user_a:rwx
group::r-x
mask::rwx
other::r-x

此时,我们已经成功更改了 ACL,我们应该能够使用user_a对该目录进行更改:

$ touch sampledir/samplefile.txt
$ ls sampledir/ -l
total 0
-rw-r--r-- 1 user_a user_a 0 Apr 1 12:41 samplefile.txt

如果我们仍然不能对目录进行任何更改,让我们转到下一节。

3.3. 重新登录或重启系统

我们可以重新登录或重启系统,以确保系统加载我们所做的所有更改。

再次登录并重启后,我们可以尝试对目录做一些修改。如果我们遇到同样的错误,我们还有另一种选择。

3.4. 检查分区或硬件

有故障的硬盘可能会在我们尝试使用它时抛出错误,或者挂载选项不正确的分区,例如:

$ mkdir test
mkdir: cannot create directory test: Read-only file system
$ touch test
touch: cannot create file test: Read-only file system

我们可以尝试通过确保/etc/fstab 中分区的挂载选项正确然后重新挂载分区来解决问题。

要重新挂载分区,首先,让我们通过运行mount 命令确保分区已挂载:

$ mount
...
/dev/sda3 on / type ext4 (rw,relatime,errors=remount-ro)
...

然后重新挂载分区:

$ sudo mount -o remount /

如果在这一点上,我们在尝试更改目录时仍然遇到错误,我们可能需要探索硬件问题的可能性。