尽管在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
接下来,我们创建一个目录并将其所有权设置为root和staff组中的用户:
$ 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 /
如果在这一点上,我们在尝试更改目录时仍然遇到错误,我们可能需要探索硬件问题的可能性。