我创建了 user small
,将他添加到组中kek
,并允许该组仅读取用户主目录中的文件。然后我将所有文件更改为root:kek
.不过,small
仍然可以删除其主目录中的文件。
我运行的命令:
useradd -ms /bin/bash small
groupadd kek
usermod -a -G kek small
chown -R root:kek /home/small/*
chmod -R g=r /home/small/*
然后当我尝试删除文件时:
$ ls -l
total 16
-rw-r--r-- 1 root kek 240 Jun 23 06:17 Dockerfile
-rw-r--r-- 1 root kek 39 Jun 21 09:17 flag.txt
-rw-r--r-- 1 root kek 2336 Jun 22 14:19 server.py
-rw-r--r-- 1 root kek 24 Jun 22 08:16 small.py
$ rm flag.txt
$ ls -l
total 12
-rw-r--r-- 1 root kek 240 Jun 23 06:17 Dockerfile
-rw-r--r-- 1 root kek 2336 Jun 22 14:19 server.py
-rw-r--r-- 1 root kek 24 Jun 22 08:16 small.py
$ whoami
small
为什么会出现这种情况?
答案1
文件是否可以删除不是文件的属性,而是文件所在目录的属性。用户不能删除位于他们无法写入的目录中的文件。
文件(和子目录)是目录节点中的条目。要删除文件,需要取消该文件与目录节点的链接,因此必须对该目录具有写权限才能删除其中的文件。
- 文件的写权限决定了是否允许更改文件的内容。
- 目录的写权限决定了是否允许更改目录的内容。
有关的:
答案2
在 Unix 上,您不会删除文件,而是将其从目录列表中删除。当一个文件不再有任何目录列表(可以有很多),并且不再由进程打开时,它将被删除。
如果您对目录具有写权限,则可以删除文件目录列表。
该怎么办
- 选项 1 删除目录的写权限。
- 选项 2 将粘滞位添加到目录 (
chmod +t «directory-name»
)。使其只有所有者和根用户(实际上具有 CAP_FOWNER 能力)才能删除文件。当您需要写入权限时使用此选项,以便用户可以添加文件。