Rm

從什麼時候開始 POSIX 和 GNU rm 不刪除 /?

  • December 14, 2017

幾年來,除非使用該選項呼叫 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 版本:

這是在 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 喜歡tcshzsh將添加額外的提示。rm``*``tcsh

引用自:https://unix.stackexchange.com/questions/410759