Perché non esiste tale protezione nel comando rm?
Ci sono già tre salvaguardie:
- Il
-r
switch, senza il quale una directory non può essere rimossa. - Il
-i
switch, che verifica che tu voglia effettivamente eliminare ciò che hai chiesto di eliminare. Alias rm
arm -i
attiva tale protezione a meno che tu non aggiunga il-f
passare per spegnerlo. - Proprietà del file, che impedisce a tutti gli utenti tranne
root
dall'eliminazione della directory principale.
Il set di strumenti Unix è come una motosega:è stato progettato per fare cose molto potenti ed essere maneggiato da persone che capiscono cosa stanno facendo. Coloro che camminano con noncuranza rischiano di ferirsi. Questo non vuol dire che gli esperti non commettano errori, e ovviamente Sun e altri ritengono che gli utenti con root
devono essere protetti da se stessi.
Tuttavia questo caso specifico non dovrebbe essere un'eccezione a questa regola?
La gente si è chiesta perché non possiamo mettere una protezione per la lama sul rm
motosega almeno dagli anni '80. (Probabilmente più a lungo, ma la mia storia con Unix non va oltre.) Devi farti più domande:
-
Dal momento che stiamo aggiungendo eccezioni, cos'altro dovrebbe essere considerato sacro? Dovremmo impedire la cancellazione ricorsiva di qualsiasi cosa nella directory principale per evitare errori altrettanto devastanti come
rm -rf /*
? E la home directory dell'utente? Che dire di/lib
o/bin
? Dovremmo avere una versione speciale dirm
prevenire questi errori su sistemi con un layout di file system non tradizionale? -
Dove mettiamo l'applicazione di questi divieti? Solo in
rm
o diamo quel lavoro al kernel? Darm
in realtà non cancella nulla (fa molte chiamate aunlink(2)
ermdir(2)
in base agli argomenti), non ci sarebbe modo per il kernel di rilevare quelrm
stava davvero cercando/
fino a quando non è arrivato il momento di cancellarlo. Poiché l'unica chiamata armdir(2)
che avrebbe mai successo è quando la directory di destinazione è vuota, raggiungendo quel punto con/
significherebbe che il sistema è già finito.
Dipende dalla distribuzione. Il vecchio Linux su cui mi trovo in questo momento lo consente (penso, non l'ho testato però :-) ) e indica in man rm
:
--no-preserve-root do not treat '/' specially (the default)
--preserve-root
fail to operate recursively on '/'
Su molte distribuzioni recenti, devi aggiungere esplicitamente --no-preserve-root
per disabilitare la protezione. Altrimenti non verrà eseguito.
Per quanto riguarda Ubuntu, vedi questo numero in cui viene discusso questo comportamento.
La storia di questa protezione secondo Wikipedia:
Sun Microsystems ha introdotto
rm -rf /
protection in Solaris 10, rilasciato per la prima volta nel 2005. Dopo aver eseguito il comando, il sistema ora segnala che la rimozione di/
non è permesso. Poco dopo, la stessa funzionalità è stata introdotta nella versione FreeBSD dirm
utilità. GNUrm
rifiuta di eseguirerm -rf /
se--preserve-root
viene data l'opzione, che è stata l'impostazione predefinita da quando la versione 6.4 di GNU Core Utilities è stata rilasciata nel 2006.