Come prevenire un errore rm -rf per cartelle specifiche?


8

Penso che molte persone qui rm -rfabbiano erroneamente " inserito la directory sbagliata, e si spera che non abbia causato un danno enorme ... Esiste un modo per impedire agli utenti di fare una simile storia horror unix ?? Qualcuno ha menzionato (nella sezione commenti del link precedente ) che

... Sono abbastanza sicuro ora che ogni corso o azienda unix che utilizza unix set rm -fr per disabilitare gli account delle persone che provano a eseguirlo o impedire loro di eseguirlo ...

C'è qualche implementazione di questo in qualsiasi distribuzione Unix o Linux attuale? E qual è la pratica comune per prevenire quell'errore anche da un amministratore di sistema (con accesso root)?

Sembra che ci fosse una certa protezione per la directory root ( /) in Solaris (dal 2005) e GNU (dal 2006). Esiste un modo per implementare lo stesso modo di protezione anche su alcune altre cartelle ??

Per dare più chiarezza, non stavo chiedendo consigli generali rmsull'utilizzo (e ho aggiornato il titolo per indicarlo di più), voglio qualcosa di più simile alla protezione della cartella principale: per rm -rf /poter passare un parametro specifico: rm -rf --no-preserve-root /.. Esistono implementazioni simili per un set personalizzato di directory? Oppure posso specificare file oltre /a essere protetti dall'opzione preserv-root ?


11
1) Gestione delle modifiche 2) Backup.
Mattdm,

6
probabilmente l'unico modo sarebbe sostituire il rmcomando con uno che non ha quella funzione.
Keith,

2
safe-rm forse
sr_

2
la maggior parte delle distro fa `alias rm = 'rm -i' che fa sì che rm ti chieda se sei sicuro. oltre a ciò: sapere cosa stai facendo. diventa root solo se necessario. per qualsiasi utente con privilegi di root la sicurezza di qualsiasi tipo deve essere implementata in e dall'utente. assumere qualcuno se non è possibile farlo da soli. Nel tempo qualsiasi contromisura diventa equivalente alla linea di alias sopra se non riesci ad avvolgere la tua testa intorno al problema.
Bananguin,

1
L'utilizzo di @amyassin rm -rfpuò essere un evento di generazione del curriculum. Controlla e controlla tre volte prima di eseguirlo
midnightsteel

Risposte:


15

Per evitare un errore rm -rf, non digitarerm -rf .

Se è necessario eliminare un albero di directory, si consiglia il flusso di lavoro seguente:

  • Se necessario, passare al genitore della directory che si desidera eliminare.
  • mv directory-to-delete DELETE
  • Esplora DELETEe verifica che sia effettivamente ciò che desideri eliminare
  • rm -rf DELETE

Non chiamare mai rm -rfcon un argomento diverso da DELETE. Fare la cancellazione in più fasi ti dà l'opportunità di verificare che non stai cancellando la cosa sbagliata, o a causa di un errore di battitura (come in rm -rf /foo /barinvece di rm -rf /foo/bar) o a causa di un braino (oops, no, intendevo eliminare foo.olde mantenere foo.new) .

Se il tuo problema è che non puoi fidarti che gli altri non digitino rm -rf, considera di rimuovere i loro privilegi di amministratore. C'è molto di più che può andare storto rm.


Effettua sempre i backup .

Verificare periodicamente che i backup funzionino e siano aggiornati.

Tieni tutto ciò che non può essere facilmente scaricato da qualche parte sotto il controllo della versione.


Con un sistema unix di base, se vuoi davvero rendere alcune directory non cancellabili rm, sostituisci (o meglio l'ombra) rmcon uno script personalizzato che rifiuta determinati argomenti. O di hg rm.

Alcune varianti di unix offrono più possibilità.

  • Su OSX, è possibile impostare un elenco di controllo di accesso su una directory che impedisce l'eliminazione dei file e delle sottodirectory al suo interno, senza impedire la creazione di nuove voci o la modifica di voci esistenti: chmod +a 'group:everyone deny delete_child' somedir(ciò non impedisce l'eliminazione dei file nelle sottodirectory: se vuoi che, imposta anche l'ACL nella sottodirectory).
  • Su Linux, è possibile impostare regole in SELinux, AppArmor o altri framework di sicurezza che vietano rmdi modificare determinate directory.

Sì, il backup è la soluzione più sorprendente, ma stavo pensando a qualcosa di simile --no-preserve-rootall'opzione, per un'altra cartella importante .. E che a quanto pare non esiste nemmeno come pratica ...
Amyassin

Ho modificato la domanda per indicare cosa voglio di più ...
Amyassin,

1
@amyassin Temo non ci sia niente di più (almeno non su Linux). rm -rfsignifica già "eliminare questo, sì, sono sicuro di sapere cosa sto facendo". Se vuoi di più, sostituiscilo rmcon uno script che rifiuta di eliminare alcune directory.
Gilles 'SO- smetti di essere malvagio' il

Per favore, modifica l'ultimo commento alla domanda poiché penso che stia rispondendo bene alla domanda ...
Amyassin,

2
@amyassin In realtà, lo riprendo. Non c'è nient'altro su un Linux tradizionale, ma è possibile impostare le regole di Apparmor / SELinux / ... che impediscono l' rmaccesso a determinate directory. Inoltre, poiché la tua domanda non riguarda solo Linux, avrei dovuto menzionare OSX, che ha qualcosa di simile a quello che desideri.
Gilles 'SO- smetti di essere malvagio' il

4

Se stai usando rm *zsh, puoi impostare l'opzione rmstarwait:

setopt rmstarwait

Ora la shell avvisa quando stai usando *:

> zsh -f
> setopt rmstarwait
> touch a b c
> rm *
zsh: sure you want to delete all the files in /home/unixuser [yn]? _

Quando lo rifiuti ( n), non succede nulla. In caso contrario, tutti i file verranno eliminati.


A cosa zsh -fserve?
James,

3

Per proteggerti da un accidentale rm -rf *in una directory, crea un file chiamato "-i" (puoi farlo con emacs o qualche altro programma) in quella directory. La shell tenterà di interpretare -i e provocherà il passaggio alla modalità interattiva.

Ad esempio: hai una directory chiamata rmtestcon il file chiamato -identro. Se provi a rmtutto ciò che si trova all'interno della directory, rmti verrà prima -ipassato e passerà alla modalità interattiva. Se si inserisce un file del genere all'interno delle directory in cui si desidera proteggere, potrebbe essere di aiuto.

Si noti che questo è inefficace contro rm -rf rmtest.


Ho modificato la domanda per indicare cosa voglio di più ...
Amyassin,

Trucco fantastico! Il file può essere facilmente creato con> -i
capitano666,

2

MODIFICA come suggerito dal commento:

È possibile modificare l'attributo di in immutabile il file o la directory e quindi non può essere eliminato nemmeno dalla radice fino a quando l'attributo non viene rimosso.

chattr +i /some/important/file

Questo significa anche che il file non può essere scritto o modificato in alcun modo, nemmeno da root . Un altro attributo apparentemente disponibile che non ho usato da solo è l'attributo append ( chattr +a /some/important/file. Quindi il file può essere aperto solo in modalità append, il che significa che non è possibile eliminarlo, ma è possibile aggiungerlo (ad esempio un file di registro). non sarà in grado di modificarlo vimad esempio, ma puoi farlo echo 'this adds a line' >> /some/important/file. L'uso al >posto di >>fallirà.

Questi attributi possono essere annullati usando un segno meno, ad es chattr -i file

Altrimenti, se questo non è adatto, una cosa che pratico è sempre ls /some/dirprima, e quindi invece di digitare nuovamente il comando, premere la freccia in alto CTL-A, quindi eliminare il lse digitare my rm -rfse ne ho bisogno. Non perfetto, ma guardando i risultati di ls, sai in anticipo se è quello che volevi.


Ho modificato la domanda per indicare cosa voglio di più ...
Amyassin,

2

Se capisci il linguaggio di programmazione C, penso che sia possibile riscrivere il codice sorgente rm e creare una piccola patch per il kernel. Ho visto questo su un server ed era impossibile eliminare alcune directory importanti e quando si digita 'rm -rf / direcotyr' invia e-mail a sysadmin.


1

Una possibile scelta è di smettere di usare rm -rfe iniziare a usare rm -ri. Il iparametro aggiuntivo è quello di assicurarsi che ti chieda se sei sicuro di voler eliminare il file.

Probabilmente la tua scommessa migliore sarebbe quella di alias rm -riin qualcosa di memorabile kill_it_with_fire. In questo modo ogni volta che hai voglia di rimuovere qualcosa, vai avanti e uccidilo con il fuoco.


1
Mi piace il nome, ma non fè l'esatto contrario idell'opzione ?? L'ho provato e ha funzionato ...
Amyassin,

@amyassin Sì, lo è. Per uno strano tipo di moda, pensavo di avere solo rlì. L'ho appena risolto.
NlightNFotis

Ho modificato la domanda per indicare cosa voglio di più ...
Amyassin,

-1

Mi piace inserire prima il nome della directory in questo modo:

$ rm /directoryname -rf

5
ciò viola le linee guida POSIX.
Gelraen,

Ho modificato la domanda per indicare cosa voglio di più ...
Amyassin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.