从什么时候开始 POSIX 和 GNU rm 不删除 / 了?

从什么时候开始 POSIX 和 GNU rm 不删除 / 了?

几年来,GNUrm实用程序不会删除,/除非使用该选项调用它--no-preserve-root。然而,该命令rm -rf /长期以来一直被认为是危险的,被置于集体潜意识中,人们仍然经常将其称为“可怕”的命令。

我想知道这个rm不能删除的规则是什么时候/第一次出现的。我检查了 POSIX 规范,我可以看到POSIX:2008包括此安全功能,POSIX:2001才不是。由于 POSIX 规范的在线版本会不时更新,随着每个新的子版本的发布,我还检查了 wayback machine 并发现了2010 年起 POSIX:2008 的相关页面并能够确认当时已经列出了rm无法删除的规则。/

所以,我的问题是:

  • rm无法删除的规则是什么时候/添加到 POSIX 规范中的?它是在单一 UNIX 规范第 4 版的 2008 年原始版本中还是在修订版中添加的?
  • GNU 何时添加此限制rm?我很确定这是在它被添加到 POSIX 之前,但是什么时候发生的呢?

答案1

您可以在线找到 POSIX 2008 所有版本的 HTML 版本:

这是在 2008 年版中添加的。

技术勘误通常不会添加新功能。

您可以看到以前的版本(http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html) (POSIX 2004) 没有该文本。

新案文已被接受2003-05-09 奥斯汀集团会议以便包含在该标准的后续修订中。

它是同年 3 月,Sun Microsystems 的 John Beck 提出要求(链接需要开放组注册,另请参阅此处的 5 号增强请求)。

约翰·贝克 (John Beck) 在 2003 年 3 月 11 日星期二写道:

@ page 820 line 31681-31683 section rm comment {JTB-1}

Problem:

Defect code :  3. Clarification required

An occasional user mistake, with devastating consequences, is to
write a shell script with a line such as:
      rm -rf $VARIABLE1/$VARIABLE2
or
      rm -rf /$VARIABLE1
without verifying that either variable is set, which can lead to
      rm -rf /
being the resulting command.  Since there is no plausible
circumstance under which this is the desired behavior, it seems
reasonable to disallow this.  Such a safeguard would, however,
violate the current specification.

Action:

Either extend the exceptions for . and .. on the noted lines
to list / as well, or specify that the behavior of rm if an
operand resolves to / is undefined.

rm添加了GNU--preserve-root--no-preserve-root选项这个 2003-11-09 提交,但--preserve-root仅成为默认值2006-09-03 提交,所以在 coreutils 6.2 中

FreeBSD 已经保留斜线自从2004-10-04 提交(有一个“了解我的内衣到底有多防火”提交日志),但是最初不是在以下情况下POSIXLY_CORRECT,直到十年后他们记得检查 POSIX 现在是否强制要求这样做此时它也在 POSIX 模式下完成

FreeBSD 的初始提交提到 Solaris 当时已经在这样做了。

@JdePB(在下面的评论中)发现链接至 Sun 内部故事证实并提供了有关 Solaris 起源的更多详细信息,并暗示 Solaris 在向奥斯汀小组提出请求之前已经采取了适当的保护措施。

它解释了添加该排除的理由。虽然人们这样做只能责怪自己,但有一种情况是,如果不检查是否提供了/ rm -rf /,脚本就可以做到这一点,这就是在误用 ​​Solaris 补丁时对某些 Sun 客户造成严重打击的原因(根据该链接)。rm -rf -- "$1/$2"$1$2

禁止删除...是在那之前很久就添加的并再次防范潜在的事故。rm仍然是一个危险的命令。它做了它应该做的事情:删除你告诉它的内容。

rm -rf /*
cd /tmp &&  rm -rf .*/   # on some systems where rm -rf ../ still removes
                         # the content of ../ and shells that still
                         # may include . and .. in glob expansions.
rm -rf -- "$diretcory"/* # note the misspelled variable name
dir='foo '; rm -rf $dir/*

也会删除所有内容。已知 Shell 文件名补全会导致此类问题

rm -rf someth<Tab>/*

扩展到:

rm -rf something /*

因为something这样正好不是一个目录。

当尝试使用通配符调用时, shelltcsh会添加额外的提示(默认情况下不是)。zshrm*tcsh

相关内容