Meilleures pratiques pour alias la commande rm et la rendre plus sûre

21

Il y a quelque temps, j'ai supprimé par erreur mon dossier personnel car j'ai exécuté un rm -rf *sur le mauvais terminal, dont le répertoire de travail était le dossier personnel!

J'aimerais avoir un alias pour la rmcommande, mais ce n'était pas le cas.

Maintenant, je prévois de faire un script comme alias pour rm.

Avez-vous des meilleures pratiques à suggérer?

Merci.

Vincenzo Pii
la source
7
Non pas que je n'aie pas de sympathie, mais je ne pense pas que ce rmsoit une commande dangereuse nécessitant un pseudonyme pour des raisons de sécurité. En utilisant les options ret f, vous dites au shell que je sais que c'est dangereux, et j'y ai réfléchi attentivement, et c'est _vraiment_ ce que je veux faire . Si vous n'utilisez pas ces options, vous ne pouvez pas supprimer l'intégralité de votre dossier de départ avec.
user26512
Cette question couvre-t-elle les mêmes informations que stackoverflow.com/questions/373156/… ?
David Harris
1
@grossvogel aucune infraction prise :)! Cependant, l'alias de cette commande est une pratique courante. Beaucoup de gens utilisent l'option -f pour éviter de confirmer chaque suppression.
23
Notez que si vous utilisez un alias, rmvous vous habituerez à cet alias. Puis un jour, vous serez sur un système où l'alias n'existe pas et vous ferez la mauvaise chose quand vous vous y attendez le moins. Et ce ne sera probablement pas votre système.
Stefan Lasiewski
2
@puller uniquement sur des systèmes tels que RHEL cet alias bêtement rmà rm -i.
Daniel Beck

Réponses:

30

Si vous voulez une personnalisation rm, ne l'appelez pas rmmais un nom à vous myrm, deleteou autre chose.

L' rm='rm -i'alias est une horreur car après un certain temps, vous vous attendez rmà vous inviter par défaut avant de supprimer des fichiers. Bien sûr, un jour, vous l'exécuterez avec un compte qui n'a pas cet alias défini et avant de comprendre ce qui se passe, il est trop tard.

Dans tous les cas, une bonne façon de se préparer à la perte ou à la corruption de fichiers consiste à effectuer des sauvegardes.

Une alternative rapide qui vous protégera contre la suppression ou l'écrasement accidentel de fichiers utilise un système de fichiers qui prend en charge des instantanés illimités comme ZFS. Si des instantanés fréquents sont effectués automatiquement, vous pouvez récupérer les fichiers dans l'état où ils étaient lors du dernier instantané avant l'incident.  

jlliagre
la source
3
J'ai entendu personnellement cette histoire d'horreur de la part de ceux qui en ont souffert.
Dan D.
Je suis d'accord mais la plupart des gens ne sont pas libres de passer à un système de fichiers entièrement différent.
Peon
En effet, c'est la raison pour laquelle je suggère d'abord de faire des sauvegardes, une fonctionnalité qu'aucun système de fichiers n'interdit.
jlliagre
12

Si vous voulez enregistrer des alias, mais ne voulez pas risquer de vous habituer aux commandes fonctionnant différemment sur votre système que sur les autres, vous pouvez désactiver rmcomme ceci

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

Ensuite, vous pouvez créer votre propre alias sécurisé, par exemple

alias remove='/bin/rm -irv'

ou utilisez à la trashplace.

Dario Seidl
la source
2
Notez que (au moins dans certaines versions) vous devez définir les alias dans l'autre ordre. Le faire dans l'ordre que vous présentez définit removecomme echo "rm is disabled, use trash or /bin/rm instead." -irv. Et, juste comme une question de bon sens, ne voudriez-vous pas que le message de rmse réfère à votre removecommande sûre ?
Scott
Vous avez raison, je mettrai à jour la réponse en conséquence.
Dario Seidl
5

Vous pouvez essayer d'utiliser à la trashplace. N'oubliez pas de le vider de temps en temps ...

l0b0
la source
3

Sans avoir à changer le profil de tout le monde, vous pouvez placer le fichier appelé -i dans le répertoire.

# 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'? 
Cœur sombre
la source
Ne fonctionnera pas si l'utilisateur décide d'utiliser *. * au lieu de simplement *. Mais toujours un bon truc.
Peon
1
afaik rm -rf. ni rm -rf .. ne peut pas réussir car vous êtes actuellement dans le répertoire.
Peon
@Peon: Je pense que vous voulez dire .* *, plutôt que * .*(ce que je pense être plus courant) ou * . *(ce que vous avez dit). ……………………………………………………………………… Pour que cette technique soit vraiment, globalement efficace, vous devez la faire dans chaque répertoire où vous avez la permission d'écriture . Mais je suis d'accord, c'est une astuce intéressante.
Scott
1

J'utilise le script suivant.

#!/bin/sh

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

Si vous supprimez accidentellement un fichier, récupérez-le à partir du $HOME/tmp.

Le script déplace les fichiers supprimés vers un tmprépertoire et les supprime la prochaine fois que le script de suppression est exécuté si le délai d'accès est de 7 jours plus tard (nettoyage semi-automatisé du $HOME/tmprépertoire).

user580224
la source
-2

Dans ton profil,

alias rm="rm -i"

la source
3
Aliasing rm est, à mon avis, un assez mauvais conseil et cela n'aidera en rien dans le cas de puller.
jlliagre
rm -Idonne le meilleur des deux mondes, @jlliagre.
Tamara Wijsman
@Tom Wijsman, en partie en effet. Changer le comportement d'une commande Unix standard critique est toujours un risque potentiel ici. Si vous souhaitez qu'il soit interactif, donnez à l'alias un nom différent.
jlliagre
@jlliagre: Hmm, donc vous voulez dire que les scripts interceptent ce changement?
Tamara Wijsman
Veuillez lire ma réponse superuser.com/a/382498/19279 pour comprendre mon point.
jlliagre
-2

Un script appelé d, avec contenu mv $* /tmp.

edit: C'est une mauvaise idée; voir ci-dessous. J'ai actuellement alias d='mv -t /tmp'dans ma .profileplace.

boeuf
la source
2
Cette suggestion est dangereuse et pourrait a) remplacer les fichiers déjà supprimés avec le même nom ou b) supprimer les fichiers complètement incorrects ( d "foo bar"supprimera les fichiers fooet bar). Quelque chose de plus sûr est probablement #!/bin/bash TRASH="$( mktemp -d -t trashed.XXX )"; echo "Moving to trash $TRASH"; mv -v -- "$@" "$TRASH"( mktempet la mvsyntaxe dépend de votre système, celui-ci fonctionne pour Linux).
Daniel Beck
2
Merci pour l'explication. Je suis d'accord avec le problème a) mais le problème b) est un gros problème. J'ai changé mon dcommandement alias d='mv -t /tmp'en mon .profile; Je pense que c'est la solution simple que je cherchais.
beefus
-2

Ce code bash ajoute la fonction rmà votre ~/.bash_profilefichier de configuration. Après avoir exécuté cela, si vous écrivez rm file, vous déplacerez ce fichier vers/tmp

cat << EOF >> ~/.bash_profile
rm () {
  mv $1 /tmp
}
EOF
Vicente Gonzalez
la source
1
Que fait ce script / code? Veuillez expliquer pour que les utilisateurs moins techniques puissent comprendre votre réponse.
Vylix
2
Bien que cela puisse répondre à la question, ce serait une meilleure réponse si vous pouviez expliquer pourquoi .
DavidPostill
1
Cela fournit une réponse à la question, mais elle est très mauvaise. Deux meilleures versions de cette réponse ont déjà été publiées.
Scott
Ce code bash ajoute la fonction rmà votre ~/.bash_profilefichier de configuration. Après avoir exécuté ce fichier, si vous écrivez rm file, vous déplacerez ce fichier vers le /tmp.
Vicente Gonzalez
Merci d'avoir expliqué. Pourriez-vous modifier votre réponse pour l'inclure dans le message lui-même?
Ben N