Ubuntu 20.04,磁盘分区格式为 EXT4。具有 sudo 权限的普通用户,在 tmp 目录中,例如:~/tmp/
$ sudo touch c.txt
// this will create a root-root(user-group) file with mode 644, as expected.
$ rm c.txt
$ rm: remove write-protected regular empty file `c.txt'? // sys prompt
if I selected 'y', then c.txt will be removed ! // NOT as expected.
我甚至尝试 rm 非空文件,仍然可以删除!
我尝试了两台安装了 Ubutnu 20.04 的计算机,结果一样。
为什么普通用户无需 sudo 即可删除 root 文件?
谢谢!
附言:检查文档后 https://help.ubuntu.com/community/FilePermissions 是的,普通用户可以删除完全控制目录(rwx=7)中的任何文件,无论文件所有者、模式如何。然而,它似乎不适用于修改操作。例如:
// TC2
sudo vim d.txt // this will create a root-root(user-group) with 644 mode
vim d.txt
// edit by normal user, use w! to save in vim,
// after exit vim, the file content changed and the user-group
// chagned to current user group, not root-root anymore.
这符合预期吗?
答案1
到删除目录中的文件允许在目录本身上,该文件的权限无关紧要。 在您的例子中,普通用户对包含文件的目录拥有完全权限。 您可以将其更改为不可变以防止删除它:sudo chattr +i 文件
或者:
sudo chmod ow /路径到目录
答案2
目录是文件和子目录的列表(更准确地说,对于每个条目:文件名或子目录名称、所属用户、所属组、权限位、扩展权限、指向文件/子目录在磁盘上的位置的指针以及其他深奥的元数据)。目录有所有者和组。目录的权限控制哪些用户可以读取、写入和cd
进入该目录。如果您希望在目录中创建文件,则必须具有写入目录的权限。如果您希望从目录中删除文件,则必须具有写入目录的权限。如果您希望重命名文件,则必须具有写入目录的权限。如果您希望更改文件的权限,则必须具有写入目录的权限。所有这些都是对目录的修改,因此请使用目录的权限。(存在与扩展权限相关的例外情况,我在这里将其放在一边。)
在下文中,我将继续写“您用来访问它的目录条目”,因为文件系统中的文件可能有多个目录条目,因此可能有不同的名称。事实上,单个目录中的多个条目(必然具有不同的名称)可能指向磁盘上的同一个文件,并且各个条目可以具有不同的拥有用户、拥有组和权限。
目录中的文件条目具有所属用户、所属组和权限。如果您希望读取文件的内容,则用于访问该文件的目录条目必须允许您具有读取权限。如果您希望写入文件的内容,则用于访问该文件的目录条目必须允许您具有写入权限。如果您希望执行文件的内容,则用于访问该文件的目录条目必须允许您具有执行权限。
那么让我们通过你的例子来研究一下。
- 当前工作目录是
~/tmp/
,因此当前用户是拥有用户、拥有组,并且对该目录具有读+写+执行权限。 sudo touch c.txt
这将创建一个文件,其所有者root
具有读写权限,组root
具有写入权限,并且其他用户具有写入权限。(4 = 读取,2 = 写入,1 = 执行;6 = 4+2 = 读取+写入)rm c.txt
出现警告/提示“rm: remove write-protected regular empty file 'c.txt'?
”此警告的意思是:当前用户对当前目录具有写入权限,因此可以删除此文件,但当前用户对此文件的内容只有读取权限,这表明当前用户希望保留此文件以防止更改。这两个意图是不相容的,因此需要进一步指导。- 选择
y
并c.txt
删除。是的。您有权限从目录中删除该条目,因此当您响应 时y
,该条目将从目录中删除。文件的内容绝不会被写入或执行(这是文件条目权限所不允许的)。
您的第二种情况也有效,但原因与您预期的不同。 vim
许多其他编辑器(包括 Microsoft Word 等随机示例)不编辑原始文件。他们复制文件,然后编辑副本。如果未保存编辑,则可以删除副本。如果保存了编辑,则原始文件将从目录中删除,副本将重命名为原始文件的名称。让我们看看会发生什么。
mkdir test
cd test
ls -laF
total 8
drwxrwxr-x 2 fuzzy fuzzy 4096 Oct 31 11:40 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:40 ../
我们看到我的用户fuzzy
和我的组fuzzy
拥有当前目录,.
并且设置了 775 权限(用户fuzzy
:rwx,组fuzzy
:rwx,其他:rx)。
sudo vim d.txt
[supply password]
[vim session starts]
[insert mode]Hi.
现在让我们转到另一个 shell 并查看目录中发生的情况。
[another shell, not sudo...]
cd test
ls -laF
total 20
drwxrwxr-x 2 fuzzy fuzzy 4096 Oct 31 11:44 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:44 ../
-rw------- 1 root root 12288 Oct 31 11:44 .d.txt.swp
我们看到sudo vim
已创建了一个名为 的临时文件,.d.txt.swp
其所有者root.root
和模式为600
。现在返回并将文件保存在sudo vim
会话中并再次检查。
ls -laF
total 12
drwxrwxr-x 2 fuzzy fuzzy 4096 Oct 31 11:48 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:48 ../
-rw-r--r-- 1 root root 4 Oct 31 11:48 d.txt
我们看到临时文件的目录条目已被修改为具有新名称和新权限。此处的当前用户是fuzzy
,他只具有读取权限d.txt
,但这就是fuzzy
在编辑器中打开文件所需的全部内容。
[first session, notice not sudo...]
vim d.txt
[go to end of first line]
[append. warned: "W10: Warning: Changing a readonly file"]
[type a single space after "Hi."]
当我们附加之后,
Hi.
vim 临时文件就会出现在目录中。
[second session]
ls -laF
total 16
drwxrwxr-x 2 fuzzy fuzzy 4096 Oct 31 11:53 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:52 ../
-rw-r--r-- 1 root root 4 Oct 31 11:48 d.txt
-rw------- 1 fuzzy fuzzy 4096 Oct 31 11:53 .d.txt.swp
此目录对用户具有 rwx 权限fuzzy
,因此允许创建此条目。与往常一样,vim
对临时文件的权限保持非常严格。
[first session]
[exit insert mode]
[Esc]:w
[obtain error: "E45: 'readonly' option is set (add ! to override)"]
这意味着原始目录条目对当前用户没有写入权限,fuzzy
。这通常具有文件不可修改的语义,因此vim
可以尊重这些语义或覆盖它们(因为目录权限允许fuzzy
删除d.txt
条目并将重命名.d.txt.swp
为d.txt
)。你想要哪一个?
[first session]
[Esc]:w!
您选择覆盖。
让我们看看现在目录中发生了什么。
[second session]
ls -laF
total 28
drwxrwxr-x 2 fuzzy fuzzy 4096 Oct 31 12:01 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 12:00 ../
-rw-r--r-- 1 fuzzy fuzzy 5 Oct 31 12:01 d.txt
-rw-r--r-- 1 fuzzy fuzzy 4 Oct 31 11:48 d.txt~
-rw------- 1 fuzzy fuzzy 12288 Oct 31 12:01 .d.txt.swp
您可能看不到该d.txt~
文件。我可能打开了vim
始终保存原始文件备份的选项。我不记得vim
此选项的默认行为是什么。
现在有三个文件:
d.txt
——我们刚刚保存的修改版本。它包含“Hi。”。后续保存将替换此文件。d.txt~
-- 原始文件的备份副本。它包含“Hi”。此目录条目由以 身份运行的进程创建fuzzy
,因此具有fuzzy
的默认所有权和权限。.d.txt.swp
——当前工作文件。后续编辑将定期自动保存到此文件。
现在让我们结束本次vim
会议。
[first session]
[Esc]:q
并再次查看文件系统中发生的情况。
[second session]
ls -laF
total 16
drwxrwxr-x 2 fuzzy fuzzy 4096 Oct 31 12:05 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 12:05 ../
-rw-r--r-- 1 fuzzy fuzzy 5 Oct 31 12:01 d.txt
-rw-r--r-- 1 fuzzy fuzzy 4 Oct 31 11:48 d.txt~
这两个文件都是由无特权的用户创建的fuzzy
,因此具有fuzzy
的默认所有权和权限。 fuzzy
能够创建和删除这些目录条目,因为fuzzy
具有对当前目录的写权限.
。