从什么时候起POSIX和GNU rm不删除/?


23

几年来,除非使用选项调用GNU rm实用程序,/否则它不会删除--no-preserve-root。但是,该命令rm -rf /在很长一段时间内一直被隐瞒在集体潜意识中,人们仍然经常将其称为“可怕”命令。

我想知道何时rm无法删除此规则/。我检查了POSIX规范,可以看到虽然POSIX:2008包含此安全功能,但POSIX:2001没有。由于POSIX规范的在线版本会不时更新,因此每个新的子发行版中,我还检查了回溯机器,找到了2010年以来POSIX:2008相关页面,并能够确认rm无法删除的规则/当时已经列出。

因此,我的问题是:

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


1
相关内容:Austin Group Interpretation#019(2003),描述了(但未实现)更改。
Michael Homer

Answers:


28

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

这是在2008年版中添加的。

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

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

新文本在2003年5月9日的奥斯丁小组会议上被接受,因为它包含在该标准的更高版本中。

要求由Sun Microsystems公司的约翰·贝克在三月份同一年(链路需要OpenGroup的注册,也见增强请求号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.

GNU 在此2003-11-09 commit中rm添加了--preserve-root--no-preserve-rootoptions ,但在2006-09-03 commit中仅成为默认选项,因此在coreutils 6.2中--preserve-root

从2004年10月4日提交以来 FreeBSD一直保留斜线(带有“查找我的内衣实际上是如何防火的”提交日志),但是最初不是在下时,直到他们记得十年后才检查POSIX现在在POSIX模式下强制完成该操作POSIXLY_CORRECT

FreeBSD最初提交提到Solaris当时已经在这样做。

@JdePB(在下面的评论中)发现,该链接与Sun内部人员的故事相关,从而证实了Solaris的起源,并提供了更多详细信息,并暗示Solaris在向Austin组提出请求之前已经采取了安全措施。

它解释了添加该排除的理由。尽管这样做只能怪罪自己rm -rf /,但在某些情况下,脚本可以在rm -rf -- "$1/$2"不检查是否提供了$1/ 的情况下做到这$2一点,这在错误地使用Solaris补丁程序时(根据该链接)使某些Sun客户感到不满。

禁止删除...早在很久以前就添加了,以防止潜在的不幸事故。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碰巧不是目录。

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



1
作为一个年轻的合作社SA,我尝试rm -rf .*从其主目录中擦除SunOS w /上用户目录中的隐藏文件。不久之后,所有电话线都亮起了
Aaron D. Marasco

我押注$ rm -rf。* = rm -rf /以复杂的方式到达那里。
Escoce

@GuruAdrian当然,*表示匹配所有内容,因此。* = .filename还要匹配../,并因此匹配../ ..和../../ .. ad infinatum,直到用完命令的位空间为止。
Escoce

也许在现代的外壳中。并非总是这样。我在15年前就离开了系统管理和开发的深度
Escoce
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.