GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso prevenire accidentali rm -rf /*?

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.


Linux
  1. Come prevenire e ripristinare l'eliminazione accidentale di file in Linux

  2. [Linux]:come prevenire l'esecuzione accidentale del comando "rm -rf".

  3. Linux:come misurare e prevenire la deriva dell'orologio?

  4. Come impedire a `ls` di ordinare l'output?

  5. Come prevenire l'esecuzione accidentale del comando Rm -r *?

Come evitare l'arresto o il riavvio accidentale in Linux

Come prevenire il timeout di SSH

Come posso impedire o interrompere il copia/incolla accidentale nel terminale?

Come impedire a un processo di scrivere file

Fail2Ban - come evitare che il mio IP dinamico ISP venga bannato?

Come fermare/prevenire SSH bruteforce