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.