Skip to content

Come si può evitare un rm -rf /* accidentale?

I nostri migliori sviluppatori hanno esaurito le loro scorte di caffè, cercando continuamente la risposta, finché Omar non ha trovato il risultato su GitLab, quindi ora lo condivide qui.

Soluzione:

Soluzione 1:

Uno dei trucchi che seguo è quello di mettere # all'inizio, mentre uso l'opzione rm .

[email protected]:~# #rm -rf /

Impedisce l'esecuzione accidentale del comando rm sul file/directory sbagliato. Una volta verificato, rimuovere # 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 si vuole evitare qualsiasi directory importante, c'è un altro trucco.

Creare un file chiamato -i in quella directory. Come si può creare un file così strano? Utilizzando touch -- -i o touch ./-i

Ora provate con 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 * si espanderà -i alla riga di comando, per cui il comando diventerà in definitiva rm -rf -i. Il comando verrà quindi richiesto prima della rimozione. È possibile inserire questo file nella cartella /, /home/, /etc/ecc.

O

Utilizzare --preserve-root come opzione per rm. In rm incluso nel più recente coreutils questa opzione è quella predefinita.

--preserve-root
              do not remove `/' (default)

O

Usa safe-rm

Estratto dal sito web:

Safe-rm è uno strumento di sicurezza che ha lo scopo di prevenire la cancellazione accidentale di
di file importanti sostituendo /bin/rm con un wrapper che controlla gli argomenti dati
gli argomenti forniti con una lista nera configurabile di file e directory che non devono essere
directory che non dovrebbero mai essere rimosse.

Gli utenti che tentano di eliminare uno di questi file o directory protette
protetti non potranno farlo e verrà visualizzato un messaggio di avvertimento
un messaggio di avvertimento:

$ rm -rf /usr
Skipping /usr

Soluzione 2:

Il vostro problema:

Ho eseguito per sbaglio rm -rf /*, ma intendevo rm -rf ./* (notare l'asterisco dopo la barra).

La soluzione: Non farlo! Come pratica, non si deve usare il metodo ./ all'inizio di un percorso. Gli slash non aggiungono alcun valore al comando e creano solo confusione.

./* ha lo stesso significato di *, quindi il comando di cui sopra è meglio scritto come:

rm -rf *

Ecco un problema correlato. Vedo spesso la seguente espressione, in cui qualcuno ha assunto che FOO sia impostato su qualcosa come /home/puppies. L'ho vista proprio oggi, nella documentazione di un importante fornitore di software.

rm -rf $FOO/

Ma se FOO non è impostato, questo valuterà rm -rf /che tenterà di rimuovere tutti i file presenti sul sistema. Lo slash finale non è necessario, quindi per praticità non va usato.

Il seguente comando ha lo stesso effetto, ma ha meno probabilità di corrompere il sistema:

rm -rf $FOO

Ho imparato questi consigli nel modo più difficile. Quando ho avuto il mio primo account di superutente 14 anni fa, per sbaglio ho eseguito rm -rf $FOO/ da uno script di shell e ho distrutto un sistema. Gli altri 4 sysadmin lo guardarono e dissero: "Sì. Tutti lo fanno una volta. Ecco il vostro supporto di installazione (36 dischetti). Vai a sistemarlo".

Altre persone qui raccomandano soluzioni come --preserve-root e safe-rm. Tuttavia, queste soluzioni non sono presenti per tutte le varianti di 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 utilizzato. Se ci si affida a safe-rmcosa succede quando si inizia un nuovo lavoro e non si dispone di safe-rm installato? Questi strumenti sono una stampella ed è molto meglio affidarsi alle impostazioni predefinite e migliorare le proprie abitudini di lavoro.


Soluzione 3:

Dato che si tratta di "Serverfault", vorrei dire questo:

Se avete decine o più server, con un team di amministratori/utenti molto numeroso, qualcuno sta per rm -rf o chown la directory sbagliata.

Dovreste avere un piano per ripristinare il servizio interessato con il minor MTTR possibile.


Soluzione 4:

Le soluzioni migliori consistono nel cambiare le proprie abitudini per non utilizzare rm direttamente.

Un approccio è quello di eseguire echo rm -rf /stuff/with/wildcards* prima. Verificate che l'output dei caratteri jolly sia ragionevole, quindi utilizzate la cronologia della shell per eseguire il comando precedente senza l'elemento echo.

Un altro approccio consiste nel limitare il comando echo ai casi in cui è evidente cosa si intende eliminare. Piuttosto che rimuovere tutti i file in una directory, rimuovete la directory e createne una nuova. Un buon metodo è rinominare la directory esistente in DELETE-fooe poi creare una nuova directory foo con i permessi appropriati e infine rimuovere DELETE-foo. Un vantaggio secondario 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 proprio si vuole cancellare un gruppo di file perché è necessario che la directory rimanga (perché deve sempre esistere o perché non si hanno i permessi per ricrearla), spostare i file in un'altra directory e cancellarla.

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

(Colpire quel Alt+. ).

L'eliminazione di una directory dall'interno sarebbe interessante, perché rm -rf . è breve e quindi ha un basso rischio di errori di battitura. I sistemi tipici non consentono di farlo, purtroppo. È possibile rm -rf -- "$PWD" con un rischio maggiore di errori di battitura, ma la maggior parte di essi non porta alla rimozione di nulla. Attenzione, questo lascia un comando pericoloso nella cronologia della shell.

Ogni volta che potete, usate il controllo di versione. Non rm, si cvs rm o qualsiasi altra cosa, e questo è annullabile.

Zsh ha delle opzioni che richiedono all'utente di eseguire rm con un argomento che elenca tutti i file in una directory: rm_star_silent (attivo per impostazione predefinita) chiede di eseguire prima di rm whatever/*e rm_star_wait (disattivato per impostazione predefinita) aggiunge un ritardo di 10 secondi durante il quale non è possibile confermare. L'utilità di questa opzione è limitata se si intende rimuovere tutti i file di una directory, perché ci si aspetta già il prompt. Può aiutare a prevenire errori di battitura come rm foo * per rm foo*.

Ci sono molte altre soluzioni in giro che prevedono la modifica del parametro rm . Un limite di questo approccio è che un giorno ci si troverà su una macchina con il vero comando rm e si chiamerà automaticamente rm, sicuri di ricevere una conferma... e un attimo dopo si ripristinano i backup.


Soluzione 5:

Si può sempre fare un alias, come hai detto tu:

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"

Potreste anche integrarlo con un client twitter a riga di comando per avvisare i vostri amici di come vi siete quasi umiliati cancellando il vostro disco rigido con rm -fr /* come root.

Ti mostriamo commenti e valutazioni



Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.