Best practice per alias il comando rm e renderlo più sicuro


21

Qualche tempo fa ho erroneamente cancellato la mia cartella principale perché avevo eseguito un rm -rf *terminale errato, la cui directory di lavoro era la cartella principale!

Vorrei avere un alias per il rmcomando, ma non è stato il caso.

Ora sto pensando di creare una sceneggiatura come alias per rm.

Hai qualche best practice da suggerire?

Grazie.


7
Non che non abbia simpatia, ma non credo rmsia un comando pericoloso che richiede un alias per sicurezza. Usando le opzioni re f, stai dicendo alla shell che so che è pericoloso, e ci ho pensato attentamente, ed è davvero ciò che voglio fare . Se non si utilizzano queste opzioni, non è possibile eliminare l'intera cartella home con essa.
— user26512

Questa domanda copre le stesse informazioni di stackoverflow.com/questions/373156/… ?
— David Harris,

1
@grossvogel senza offesa :)! Tuttavia, alias questo comando è una pratica comune. Molte persone usano l'opzione -f per evitare di confermare ogni cancellazione.

23
Nota che se usi un alias per rmti abituerai a quell'alias. Quindi un giorno, sarai su un sistema in cui l'alias non esiste e farai la cosa sbagliata quando meno te lo aspetti. E probabilmente non sarà il tuo sistema.
— Stefan Lasiewski,

2
@puller Solo su sistemi come RHEL che alias stupidamente rma rm -i.
— Daniel Beck

Risposte:


30

Se si desidera una misura rm, non chiamatela rm, ma un nome di tuo, myrm, deleteo qualsiasi altra cosa.

L' rm='rm -i'alias è un orrore perché dopo un po 'di tempo, ti aspetterai rmdi richiederti di default prima di rimuovere i file. Certo, un giorno lo eseguirai con un account che non ha quell'alias impostato e prima di capire cosa sta succedendo, è troppo tardi.

In ogni caso, un buon modo per prepararsi alla perdita o al danneggiamento dei file è fare i backup.

Un'alternativa rapida che ti proteggerà dalla cancellazione o dalla sovrascrittura accidentale dei file è l'utilizzo di un file system che supporta snapshot illimitate come ZFS. Se le istantanee frequenti vengono eseguite automaticamente, è possibile ripristinare i file nello stato in cui si trovavano durante l'ultima istantanea prima dell'incidente.  


3
ho sentito personalmente quella storia dell'orrore da una di quelle che l'hanno sofferta.
— Dan D.

Sono d'accordo, ma molte persone non sono libere di passare a un filesystem completamente diverso.
— Peon,

In effetti, questo è il motivo per cui suggerisco di fare prima i backup, una funzionalità che nessun file system vieta.
— jlliagre,

12

Se vuoi salvare gli alias, ma non vuoi rischiare di abituarti ai comandi che funzionano in modo diverso sul tuo sistema rispetto ad altri, puoi disabilitare in rmquesto modo

alias rm='echo "rm is disabled, use remove or trash or /bin/rm instead."'

Quindi puoi creare il tuo alias sicuro, ad es

alias remove='/bin/rm -irv'

o usa trashinvece.


2
Si noti che (almeno in alcune versioni) è necessario definire gli alias nell'altro ordine. Farlo nell'ordine che presenti definisce removecome echo "rm is disabled, use trash or /bin/rm instead." -irv. E, proprio come una questione di buon senso, non vorresti che il messaggio si rmriferisse al tuo removecomando sicuro ?
— Scott,

Hai ragione, aggiornerò la risposta di conseguenza.
— Dario Seidl,

5

Potresti provare a usare trashinvece. Ricordati di svuotarlo di tanto in tanto ...


3

Senza dover cambiare il profilo di tutti, ciò che puoi fare è posizionare il file chiamato -i nella directory.

# touch -- -i
# ll
total 0
-rw-r--r-- 1 root users  0 Jan 26 19:24 files
drwxr-xr-x 2 root users 40 Jan 26 19:24 folder_of_power
-rw-r--r-- 1 root root   0 Jan 26 19:25 -i
-rw-r--r-- 1 root users  0 Jan 26 19:24 important
-rw-r--r-- 1 root users  0 Jan 26 19:24 very
# rm -rf *
rm: remove regular empty file `files'? 

Non funzionerà se l'utente decide di utilizzare *. * invece di solo *. Ma è ancora un trucco.
— Peone,

1
afaik rm -rf. né rm -rf .. non può riuscire perché ci si trova attualmente nella directory.
— Peon,

@Peon: credo che tu intenda .* *, piuttosto che * .*(che credo sia più comune) o * . *(che hai detto). ...… ... . Ma sono d'accordo, è un trucco pulito.
— Scott,

1

Uso il seguente script.

#!/bin/sh

trash=$HOME/tmp
mv "$@" $trash
nohup find "$trash" -type f -atime +7 -exec /bin/rm '{}' \; 2>&1 &

Se si elimina accidentalmente un file, recuperarlo da $HOME/tmp.

Lo script sposta i file eliminati in una tmpdirectory e li elimina alla successiva esecuzione dello script di eliminazione se il tempo di accesso è 7 giorni dopo (pulizia semiautomatica della $HOME/tmpdirectory).


-2

Nel tuo profilo,

alias rm="rm -i"

3
Aliasing rm è, a mio avviso, un consiglio piuttosto scarso e non aiuterà comunque nel caso di puller.
— jlliagre,

rm -Idà il meglio di entrambi i mondi, @jlliagre.
— Tamara Wijsman,

@ Tom Wijsman, in parte in effetti. La modifica del comportamento di un comando Unix standard critico è ancora un potenziale rischio qui. Se vuoi che sia interattivo, dai un nome diverso all'alias.
— jlliagre,

@jlliagre: Hmm, quindi vuoi dire che gli script rilevano questo cambiamento?
— Tamara Wijsman,

Si prega di leggere la mia risposta superuser.com/a/382498/19279 per ottenere il mio punto.
— jlliagre,

-2

Una sceneggiatura chiamata d, con contenuti mv $* /tmp.

modifica: questa è una cattiva idea; vedi sotto. Attualmente ho alias d='mv -t /tmp'nel mio .profileinvece.


2
Questo suggerimento è pericoloso e potrebbe a) sovrascrivere i file già eliminati con lo stesso nome oppure b) eliminare i file completamente errati ( d "foo bar"eliminerà i file fooe bar). Qualcosa di più sicuro è probabilmente #!/bin/bash TRASH="$( mktemp -d -t trashed.XXX )"; echo "Moving to trash $TRASH"; mv -v -- "$@" "$TRASH"( mktempe la mvsintassi dipende dal tuo sistema, questo funziona per Linux).
— Daniel Beck

2
Grazie per la spiegazione. Sto bene con il problema a) ma il problema b) è un grosso problema. Ho cambiato il mio dcomando in alias d='mv -t /tmp'nel mio .profile; Penso che sia la soluzione semplice che stavo cercando.
— beefus,

-2

Questo codice bash aggiunge la funzione rmal ~/.bash_profilefile di configurazione. Dopo averlo eseguito, se scrivi rm file, sposterai quel file in/tmp

cat << EOF >> ~/.bash_profile
rm () {
  mv $1 /tmp
}
EOF

1
Cosa fa questo script / codice? Spiega in modo che gli utenti meno tecnici possano comprendere la tua risposta.
— Vylix,

2
Sebbene ciò possa rispondere alla domanda, sarebbe una risposta migliore se tu potessi fornire qualche spiegazione sul perché lo faccia.
— DavidPostill

1
Questo fornisce una risposta alla domanda, ma è molto scarsa. Sono già state pubblicate due versioni migliori di questa risposta.
— Scott,

Questo codice bash aggiunge la funzione rmal ~/.bash_profilefile di configurazione. Dopo aver eseguito questo file, se scrivi rm file, lo sposterai in /tmp.
— Vicente Gonzalez,

Grazie per aver spiegato. Potresti modificare la tua risposta per includerla nel post stesso?
— Ben N,
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.