Soluzione 1:
Uno dei trucchi che seguo è mettere #
all'inizio usando il rm
comando.
[email protected]:~# #rm -rf /
Ciò impedisce l'esecuzione accidentale di rm
nel file/directory sbagliato. Una volta verificato, rimuovi #
dall'inizio. Questo trucco funziona, perché in Bash una parola che inizia con #
fa sì che quella parola e tutti i caratteri rimanenti su quella riga vengano ignorati. Quindi il comando viene semplicemente ignorato.
OPPURE
Se vuoi impedire qualsiasi directory importante, c'è un altro trucco.
Crea un file chiamato -i
in quella directory. Come si può creare un file così strano? Usando touch -- -i
o touch ./-i
Ora prova rm -rf *
:
[email protected]:~$ touch {1..4}
[email protected]:~$ touch -- -i
[email protected]:~$ ls
1 2 3 4 -i
[email protected]:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'?
Qui il *
espanderà -i
alla riga di comando, quindi il tuo comando alla fine diventa rm -rf -i
. Quindi il comando richiederà prima della rimozione. Puoi inserire questo file nel tuo /
, /home/
, /etc/
, ecc.
OPPURE
Usa --preserve-root
come opzione per rm
. Nel rm
incluso nel più recente coreutils
packages, questa opzione è quella predefinita.
--preserve-root
do not remove `/' (default)
OPPURE
Usa safe-rm
Estratto dal sito web:
Safe-rm è uno strumento di sicurezza inteso a prevenire la cancellazione accidentale di file importanti sostituendo /bin/rm con un wrapper, che confronta gli argomenti dati con una lista nera configurabile di file e directory che non dovrebbero mai essere rimosse.
Gli utenti che tentano di eliminare uno di questi file o directory protetti non saranno in grado di farlo e visualizzeranno invece un messaggio di avviso:
$ rm -rf /usr Skipping /usr
Soluzione 2:
Il tuo problema:
Ho appena eseguito rm -rf /* accidentalmente, ma intendevo rm -rf ./* (nota la stella dopo la barra).
La soluzione:Non farlo! Per fare pratica, non usare ./
all'inizio di un percorso. Le barre non aggiungono alcun valore al comando e causeranno solo confusione.
./*
significa la stessa cosa di *
, quindi il comando precedente è meglio scritto come:
rm -rf *
Ecco un problema correlato. Vedo spesso la seguente espressione, dove qualcuno presume che FOO
è impostato su qualcosa come /home/puppies
. In realtà l'ho visto proprio oggi, nella documentazione di un importante fornitore di software.
rm -rf $FOO/
Ma se FOO
non è impostato, questo restituirà rm -rf /
, che tenterà di rimuovere tutti i file dal sistema. La barra finale non è necessaria, quindi per fare pratica non usarla.
Quanto segue farà la stessa cosa ed è meno probabile che danneggi il tuo sistema:
rm -rf $FOO
Ho imparato questi suggerimenti nel modo più duro. Quando ho avuto il mio primo account di superutente 14 anni fa, ho accidentalmente eseguito rm -rf $FOO/
dall'interno di uno script di shell e ha distrutto un sistema. Gli altri 4 amministratori di sistema hanno guardato questo e hanno detto:'Sì. Tutti lo fanno una volta. Ora ecco il tuo supporto di installazione (36 floppy disk). Vai a sistemarlo.'
Altre persone qui raccomandano soluzioni come --preserve-root
e safe-rm
. Tuttavia, queste soluzioni non sono presenti per tutte le varianti Un*xe e potrebbero non funzionare su Solaris, FreeBSD e MacOSX. Inoltre, safe-rm
richiede l'installazione di pacchetti aggiuntivi su ogni singolo sistema Linux che utilizzi. Se ti affidi a safe-rm
, cosa succede quando inizi un nuovo lavoro e loro non hanno safe-rm
installato? Questi strumenti sono una stampella ed è molto meglio affidarsi a valori predefiniti noti e migliorare le proprie abitudini lavorative.
Soluzione 3:
Dato che questo è su "Serverfault", vorrei dire questo:
Se hai dozzine o più server, con un team numeroso di amministratori/utenti, qualcuno va a rm -rf
o chown
la directory sbagliata.
Dovresti avere un piano per ripristinare il servizio interessato con il minor MTTR possibile.
Soluzione 4:
Le migliori soluzioni implicano cambiare le tue abitudini per non usare rm
direttamente.
Un approccio consiste nell'eseguire echo rm -rf /stuff/with/wildcards*
primo. Verifica che l'output dei caratteri jolly sia ragionevole, quindi utilizza la cronologia della shell per eseguire il comando precedente senza echo
.
Un altro approccio consiste nel limitare il echo
comando ai casi in cui è assolutamente ovvio cosa eliminerai. Invece di rimuovere tutti i file in una directory, rimuovere la directory e crearne una nuova. Un buon metodo è rinominare la directory esistente in DELETE-foo
, quindi crea una nuova directory foo
con le autorizzazioni appropriate e infine rimuovi DELETE-foo
. Un vantaggio collaterale di questo metodo è che il comando inserito nella cronologia è rm -rf DELETE-foo
.
cd ..
mv somedir DELETE-somedir
mkdir somedir # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir # just to make sure we're deleting the right thing
rm -rf DELETE-somedir
Se insisti davvero nell'eliminare un mucchio di file perché hai bisogno che la directory rimanga (perché deve sempre esistere o perché non avresti il permesso di ricrearla), sposta i file in una directory diversa ed elimina quella directory .
mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME
(Premi quel Alt +. chiave.)
Eliminare una directory dall'interno sarebbe attraente, perché rm -rf .
è breve quindi ha un basso rischio di errori di battitura. I sistemi tipici non ti consentono di farlo, sfortunatamente. Puoi fare rm -rf -- "$PWD"
invece, con un rischio maggiore di errori di battitura ma la maggior parte di essi porta a non rimuovere nulla. Fai attenzione perché questo lascia un comando pericoloso nella cronologia della tua shell.
Ogni volta che puoi, usa il controllo della versione. Non rm
, tu cvs rm
o qualsiasi altra cosa, e questo è annullabile.
Zsh ha delle opzioni per chiederti prima di eseguire rm
con un argomento che elenca tutti i file in una directory:rm_star_silent
(attivo per impostazione predefinita) richiede prima di eseguire rm whatever/*
e rm_star_wait
(disattivato per impostazione predefinita) aggiunge un ritardo di 10 secondi durante il quale non è possibile confermare. Questo è di uso limitato se intendi rimuovere tutti i file in qualche directory, perché ti aspetterai già il prompt. Può aiutare a prevenire errori di battitura come rm foo *
per rm foo*
.
Ci sono molte altre soluzioni in giro che comportano la modifica del rm
comando. Una limitazione di questo approccio è che un giorno sarai su una macchina con il vero rm
e chiamerai automaticamente rm
, al sicuro nella tua aspettativa di una conferma... e poi ripristinerai i backup.
Soluzione 5:
Potresti sempre creare un alias, come hai detto:
what_the_hell_am_i_thinking() {
echo "Stop." >&2
echo "Seriously." >&2
echo "You almost blew up your computer." >&2
echo 'WHAT WERE YOU THINKING!?!?!' >&2
echo "Please provide an excuse for yourself below: "
read
echo "I'm sorry, that's a pathetic excuse. You're fired."
sleep 2
telnet nyancat.dakko.us
}
alias rm -fr /*="what_the_hell_am_i_thinking"
Potresti anche integrarlo con un client Twitter a riga di comando per avvisare i tuoi amici di come ti sei quasi umiliato cancellando il tuo disco rigido con rm -fr /*
come radice.