Soluzione 1:
Uno dei trucchi che seguo è mettere # all'inizio usando il rm comando.
example@unixlinux.online:~# #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 * :
example@unixlinux.online:~$ touch {1..4}
example@unixlinux.online:~$ touch -- -i
example@unixlinux.online:~$ ls
1 2 3 4 -i
example@unixlinux.online:~$ 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.