Proč v příkazu rm není žádná taková ochrana?
Existují již tři zabezpečení:
-r
přepínač, bez kterého nelze adresář odstranit.-i
přepínač, který ověří, že skutečně chcete smazat to, o co jste požádali. Aliasingrm
ažrm -i
zapne tuto ochranu, pokud nepřidáte-f
přepínačem jej vypněte.- Vlastnictví souboru, které brání všem uživatelům kromě
root
z odstranění kořenového adresáře.
Sada nástrojů Unix je jako motorová pila:byla navržena tak, aby dělala velmi výkonné věci a aby ji ovládali lidé, kteří rozumí tomu, co dělají. Kdo neopatrně našlapuje, pravděpodobně si nakonec ublíží. Tím nechci říct, že zkušení nedělají chyby, a Sun a ostatní očividně cítí, že uživatelé s root
potřebují být chráněni před sebou samými.
Neměl by však tento konkrétní případ představovat výjimku z tohoto pravidla?
Lidé se ptají, proč nemůžeme na rm
umístit chránič čepele motorová pila minimálně od 80. let 20. století. (Pravděpodobně déle, ale moje historie s Unixem nesahá dále.) Musíte si položit další otázky:
-
Když přidáváme výjimky, co jiného by mělo být považováno za posvátné? Měli bychom zabránit rekurzivnímu mazání čehokoli v kořenovém adresáři, abychom se vyhnuli stejně zničujícím chybám, jako je
rm -rf /*
? A co domovský adresář uživatele? A co/lib
nebo/bin
? Museli bychom mít speciální verzirm
zabránit těmto chybám na systémech s netradičním uspořádáním souborového systému? -
Kam zařadit vymáhání těchto zákazů? Pouze v
rm
nebo dáme tu práci jádru? Odrm
ve skutečnosti nic nevymaže (vyvolá spoustu volání naunlink(2)
armdir(2)
na základě argumentů) by jádro nemohlo žádným způsobem zjistit, žerm
byl skutečně nastřelen za/
až do okamžiku, kdy skutečně nastal okamžik jeho smazání. Od jediného volání narmdir(2)
to by někdy uspělo, kdyby byl cílový adresář prázdný a dosáhl tohoto bodu pomocí/
znamenalo by to, že systém je již hotový.
Záleží na distribuci. Starší Linux, na kterém teď jsem, to umožňuje (myslím, že jsem to netestoval :-) ) a uvádí man rm
:
--no-preserve-root do not treat '/' specially (the default)
--preserve-root
fail to operate recursively on '/'
U mnoha nedávných distribucí musíte explicitně přidat --no-preserve-root
k deaktivaci ochrany. Jinak se nezdaří.
Pokud jde o Ubuntu, podívejte se na tento problém, kde je toto chování diskutováno.
Historie této ochrany podle Wikipedie:
Sun Microsystems představil
rm -rf /
ochrana v Solaris 10, poprvé vydaná v roce 2005. Po provedení příkazu systém nyní hlásí, že odstranění/
není povoleno. Krátce poté byla stejná funkce zavedena do FreeBSD verzerm
utility. GNUrm
odmítne provéstrm -rf /
pokud--preserve-root
je dána volba, která je výchozí od verze 6.4 GNU Core Utilities, která byla vydána v roce 2006.