從什麼時候開始 POSIX 和 GNU rm 不刪除 /?
幾年來,除非使用該選項呼叫 GNU 實用程序,否則它
rm
不會刪除。然而,該命令長期以來一直被集體潛意識視為危險,人們仍然經常將其稱為“可怕”的命令。/``--no-preserve-root``rm -rf /
我想知道這個
rm
不能刪除的規則是什麼時候/
出現的。我檢查了 POSIX 規範,我可以看到雖然POSIX:2008包含此安全功能,但POSIX:2001沒有。由於POSIX規範的線上版本不時更新,隨著每個新的子版本,我也檢查了回程機器,找到了2010年的POSIX:2008的相關頁面,並且能夠確認rm
無法刪除的規則/
那時已經上市了。所以,我的問題是:
rm
無法刪除的規則何時/
添加到 POSIX 規範中?它是在最初的 2008 年版 Single UNIX Specification 第 4 版中還是在修訂版中添加的?- 這個限制是什麼時候添加到 GNU 的
rm
?我很確定它是在它被添加到 POSIX 之前,但它是什麼時候發生的?
您可以線上找到所有 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 提出了請求(連結需要 opengroup 註冊,另請參閱此處的增強請求編號 5)。
約翰貝克在 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 送出
rm
中添加了--preserve-root
和--no-preserve-root
選項,但僅在此 2006-09-03 送出中成為預設值,因此在 coreutils 6.2 中--preserve-root
自 2004 年 10 月 4 日送出以來, FreeBSD 一直保留斜線(帶有*“找出我的內衣到底有多防火”*送出日誌),但最初不是在 下,直到十年後他們記得檢查 POSIX 現在強制它在這一點上也是在 POSIX 模式下完成的。
POSIXLY_CORRECT
FreeBSD 最初的送出提到當時 Solaris 已經在這樣做了。
@JdePB(在下面的評論中)發現指向 Sun 內部故事的連結證實並提供了有關 Solaris 起源的更多詳細資訊,並表明 Solaris 在他們向 Austin 小組提出請求之前已經採取了保護措施。
它解釋了添加該排除項的理由。雖然如果他們這樣做了只能責怪自己,但有一種情況是,如果在沒有檢查/是否提供
rm -rf /
的情況下,腳本可以做到這一點,這在誤用 Solaris 更新檔時對一些 Sun 客戶造成了不好的影響(根據該連結)。rm -rf -- "$1/$2"``$1``$2
在此之前很久就添加了禁止刪除
.
and..
以防止潛在的事故。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 喜歡
tcsh
或zsh
將添加額外的提示。rm``*``tcsh