非 sudo 用户提示消息“rm:删除写保护的常规空文件”而不是权限被拒绝

har*_*jay 1 linux unix bash command-line permissions

我向 linux 服务器添加了一个额外的磁盘。

我将以下行添加到 fstab:

UUID=e277f402-bbac-4830-bc1d-5a849ffe7f9c /disk1          ext4    defaults 0 0
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个挂载点 /disk1 并挂载了它

 sudo mkdir /disk1
 sudo mount /disk1
Run Code Online (Sandbox Code Playgroud)

然后我以用户“hari”创建了一个空文件touch1.txt,其权限如下

sudo touch test1.txt

-rw-rw-r-- 1 hari hari     0 Sep 12 18:23 test1.txt
Run Code Online (Sandbox Code Playgroud)

现在,当我以另一个用户身份登录并删除 test1.txt 文件时,它实际上会询问我然后拒绝我,而不是说“权限被拒绝”。为什么呢?我怎样才能让它表现得像“正常”

hari2@UBUNTU01:/disk1$ rm test2.txt
rm: remove write-protected regular empty file ‘test2.txt’? y
rm: cannot remove ‘test2.txt’: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 6

当涉及到删除操作时,Unix 权限有点奇怪。

首先,删除文件实际上涉及从目录中删除指向该文件的链接。由于大多数 Unix 文件系统允许硬链接,因此文件可能从多个目录链接,因此存在多个链接。当您删除链接时,除非不存在其他链接,否则不会删除该文件。

因此,用于“删除”文件的实际系统调用称为unlink. 但是,完成取消链接的 shell 命令实用程序称为rm,这是“删除”的助记符。

由于 unlink 操作修改的是目录(通过删除目录条目)而不是文件,因此操作所需的权限是对目录的写权限。文件本身的权限无关紧要。

但是,事实证明,尝试从您具有写入权限的目录中删除实际上不属于您的文件是一个常见的错误。(更准确地说,这种情况并不常见,但在它存在的情况下,错误地尝试删除文件是很常见的。)

为帮助保护系统管理员免于攻击自己的脚趾,该rm实用程序首先验证调用它的人对文件具有写权限,即使该权限对于取消链接文件不是必需的。出于显而易见的原因,它会在尝试删除文件之前执行此检查。

rm实用程序检查是否使用允许断开链接的文件,因为“行动之前勾选”通常被认为是不好的风格。相反,它执行所需的操作,并在操作系统返回错误时报告失败。在这种情况下,操作系统将报告 EACCES,因为用户没有对该目录的写访问权限。

不幸的后果是,如果您尝试从您没有写权限的目录中删除您没有写权限的文件,rm则会徒劳地询问您是否继续,然后报告失败。