几年来,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 版本:
- 原来的:http://pubs.opengroup.org/onlinepubs/9699919799.2008edition/utilities/rm.html
- TC1(2013年版)http://pubs.opengroup.org/onlinepubs/9699919799.2013edition/utilities/rm.html
- TC2(2016年版)http://pubs.opengroup.org/onlinepubs/9699919799.2016edition/utilities/rm.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
会添加额外的提示(默认情况下不是)。zsh
rm
*
tcsh