普通用户

普通用户

这是关于 GNU 的rm。信息页面说:

否则,如果文件不可写,标准输入是终端,并且不给出-f或选项,或者给出或选项,提示用户是否删除该文件。如果响应不是肯定的,则跳过该文件。--force-i--interactive=alwaysrm

  • 这只是 GNU 吗?

  • 以 root 身份使用时,rm我的系统不会发生这种情况。这是正常现象吗?我找不到任何地方的记录。

  • 这种行为的理由是什么?它只会增加用户的困惑,他们往往认为您需要拥有文件的写权限才能删除它。这让他们认为rmchmods 该文件。但rm如果不是所有者,也可以删除该文件。

答案1

既然你问了三个不同的问题,我就分别回答一下。

你的第一个问题:

这只是 GNU 吗?

我不确定它是 GNU仅有的。这似乎是 GNU Coreutils 的一个功能rm,至少在其他一些rm文档中也可以找到。例如,根据一些opengroup.org 上的旧文档对于 POSIX rm

  1. 如果文件不是目录类型,没有指定-f选项,或者文件的权限不允许写入并且标准输入是终端,或者指定了-i选项,rm将向标准错误写入提示并从标准输入中读取一行。如果响应不是肯定的,则 rm 将不再对当前文件执行任何操作,而是继续处理任何剩余文件。

听起来有点熟?它的措辞与rm您在问题中提到的 GNU 文档非常接近。


你的第二个问题:

当使用 rm 作为 root 时,这不会发生在我的系统上。这是正常行为吗?我在任何地方都找不到它的记录。

如果您的意思是,rm在尝试删除“不可写文件”时,以 root 身份运行没有标志的情况下不会提示您,那么是的,这是 GNU Coreutils 8.23(可能还有几乎所有其他版本的 GNU Coreutils)的正常行为。似乎没有任何文档,但如果你深入研究的来源rm(你必须在几个文件之间来回切换才能将它们拼凑在一起),它表明rm somefile以 root 用户身份从终端运行将somefile在没有提示的情况下删除,即使它被写保护


你的第三个问题:

这种行为的理由是什么?它只会增加用户的困惑,他们往往认为您需要拥有文件的写入权限才能删除它。这让他们认为 rm chmods 该文件。但如果文件不是所有者,则 rm 也可以删除该文件。

如果您的意思是为什么用户可以删除不属于他们的写保护文件,那么该行为rm与文件系统权限关系不大,而更多有关。看linuxdevcenter.com,网络信息网, 和维基百科,它们共同说明(或多或少):

通常,在大多数文件系统上,删除文件需要对父目录的写入权限(以及执行权限,以便首先进入该目录),但您不需要对文件本身具有权限。 请注意,令初学者感到困惑的是,文件本身的权限是无关的。然而,GNU rm 要求确认是否要删除写保护的文件,除非使用 -f 选项。

粗体强调是我的。这就是 Linux 和其他类 Unix 操作系统根据文件权限处理文件删除的方式。

答案2

普通用户

您可能希望保护文件不被您自己删除/修改。一个快速的方法是chmod 000 foo(或chmod -w foo)。然而,如果不情愿地选择删除。

所以rm命令会通知你(作为非root),如果是这种情况,这就是为什么有一个确认请求。

当以 root 身份运行时,特别是在批处理/自动过程中,

  1. 你应该知道你在做什么。
  2. 如果要求确认,许多 shell 可能会挂起。

结果,文件被“一看到”就被删除。

确认

确认可以请求 ( -i) 或关闭 ( -f)

  • -i对于普通用户来说是默认的。
  • -f默认为 root。

答案3

这只是 GNU 吗?

不会。这种rm行为可以追溯到大约 40 年前,并且一直在标准化

这种行为的理由是什么?

来自rm 第一版手册页:

删除文件需要对其目录有写权限,但对文件本身不需要读或写权限。

BUGS
rm 可能应该询问只读文件是否真的要删除。

我认为,这意味着如果用户想要通过将文件模式更改为只读来保护文件免遭意外写入,那么值得尝试保护它免遭意外删除。

TUHS 存档缺少第二版手册页和 rm 源代码,但是rm 第三版手册页显示这个问题已经得到解决:

如果指定要删除的文件没有写权限,rm 将打印文件名、其模式,然后从标准输入读取一行。如果该行以“y”开头,则该文件将被删除,否则不会。可选参数 -f 阻止上述交互。

Unix 及其大部分命令最终得到了标准化,这就是 rm 今天如此表现的原因。

当使用 rm 作为 root 时,这不会发生在我的系统上。这是正常行为吗?

起初不是,但现在这是正常行为。

我能找到的最早的源代码来自V5:

    if(getuid() == buf->uid)
        b = 0200; else
        b = 2;
    if((buf->mode & b) == 0)    {
        printf("%s: %o mode ", arg, buf->mode);
        i = b = getchar();
        i = b;
        while(b != '\n' && b != '\0')
            b = getchar();
        if(i != 'y')
            return;
    }

显示可写性检查查看所有者的写入权限标记运行 rm 的用户是否拥有该文件,否则别人的写权限旗帜。

V7, rm 改为使用新添加的使用权系统调用:

    if (access(arg, 02)<0) {
        printf("rm: %s %o mode ", arg, buf.st_mode&0777);
        if(!yes())
            return;
    }

由于access认为 root 对任何文件都有写访问权限(除非它位于只读文件系统上),因此rm当它由 root 运行时通常不会要求确认。

相关内容