187 votes

Comment puis-je éviter le rm -rf /* accidentel ?

J'ai simplement exécuté accidentellement rm -rf /*, mais je voulais dire rm -rf ./* (remarquez l'étoile après le slash).

alias rm='rm -i' et --preserve-root par défaut ne m'ont pas sauvé, alors y a-t-il des protections automatiques pour cela ?


Je n'étais pas en root et j'ai annulé la commande immédiatement, mais il y avait des permissions relax quelque part ou quelque chose parce que j'ai remarqué que mon invite de commandes Bash était déjà cassée. Je ne veux pas compter sur les permissions et ne pas être en root (je pourrais faire la même erreur avec sudo), et je ne veux pas chasser des bugs mystérieux à cause d'un fichier manquant quelque part dans le système, donc, les sauvegardes et sudo sont bien, mais je voudrais quelque chose de mieux pour ce cas spécifique.


À propos de réfléchir à deux fois et d'utiliser le cerveau. Je l'utilise en fait ! Mais je l'utilise pour résoudre une tâche de programmation complexe impliquant 10 choses différentes. Je suis tellement plongé dans cette tâche qu'il ne reste plus de puissance cérébrale pour vérifier les drapeaux et les chemins, je ne pense même pas en termes de commandes et d'arguments, je pense en termes d'actions comme 'vider le répertoire actuel', une partie de mon cerveau les traduit en commandes et parfois il fait des erreurs. Je veux que l'ordinateur les corrige, du moins les plus dangereuses.

17 votes

Pour information, vous pouvez également faire rm -rf . /mydir au lieu de rm -rf ./mydir et supprimer le répertoire dans lequel vous vous trouviez. Je trouve que cela arrive plus souvent.

31 votes

Pour utiliser une analogie avec les armes à feu, cette question demande de faire en sorte que le pistolet reconnaisse que je vise mon pied et ne tire pas, mais je ne veux pas avoir la responsabilité de ne pas viser mon pied en premier lieu. Les armes à feu, tout comme les ordinateurs, sont stupides et si vous faites une chose stupide, vous obtiendrez des résultats similaires. En suivant cette analogie avec les armes à feu, rien ne vous empêchera de vous faire du mal sauf la vigilance et la pratique.

82 votes

@slillibri Sauf que rm n'est pas un pistolet, c'est un programme informatique, il pourrait être assez intelligent pour déterminer que l'utilisateur s'apprête à supprimer des fichiers importants et émettre un avertissement (comme il le fait réellement si vous essayez de faire rm -rf / sans étoile).

1voto

jlliagre Points 8651

Utilisez simplement ZFS pour stocker les fichiers dont vous avez besoin pour résister à la suppression accidentelle et avoir un démon qui:

  • fait régulièrement des instantanés de ce système de fichiers
  • supprime les instantanés plus anciens/inutiles.

Si des fichiers sont supprimés, écrasés, corrompus, quoi que ce soit, il vous suffit de revenir en arrière sur votre système de fichiers jusqu'à un clone du dernier instantané valide et vous avez fini.

1voto

Charity Points 1

Si vous n'êtes pas d'humeur à acquérir de nouvelles habitudes en ce moment, .bashrc/.profile est un bon endroit pour ajouter des tests afin de vérifier si vous êtes sur le point de faire quelque chose de stupide. J'ai pensé qu'avec une fonction Bash, je pourrais rechercher un motif qui pourrait gâcher ma journée et j'ai trouvé ceci :

alias rm='set -f; myrm' #set -f désactive l'expansion des métacaractères, il faut le faire en dehors
                        #de la fonction pour obtenir la chaîne "brute".
myrm() {
    ARGV="$*"
    set +f #opposé de set -f
    if echo "$ARGV" | grep -e '-rf /*' \
                           -e 'un autre motif effrayant'
    then
        echo "Ne pas utiliser de machines lourdes sous l'influence de ce médicament"
        return 1
    else
        /bin/rm $@
    fi
}

Le bon côté, c'est que c'est uniquement du Bash.

De toute évidence, ce n'est pas assez générique sous cette forme, mais je pense que cela a du potentiel, alors n'hésitez pas à proposer des idées ou des commentaires.

0 votes

C'est bien que tu essaies de prévisualiser tes fichiers avant de les supprimer, cependant cette solution est trop compliquée. Tu peux plutôt accomplir cela très simplement de façon plus générique en utilisant la commande find. De plus, je ne comprends pas pourquoi tu dis "le bon côté c'est que c'est seulement Bash"? Il est recommandé d' éviter les bash-ismes dans les scripts.

0 votes

Pour nous protéger de "rm -rf /*" ou "rm -rf dir/ *" lorsque nous voulons dire "rm -rf ./*" et "rm -rf dir/*", nous devons détecter les motifs " /*" et " *" (de manière simpliste). Mais nous ne pouvons pas simplement passer tous les arguments de la ligne de commande à travers grep à la recherche de certains motifs nocifs, car bash étend les arguments joker avant de les transmettre (l'astérisque sera étendue à tous les contenus d'un dossier). Nous avons besoin de la chaîne d'argument "brut". Cela se fait avec set -f avant d'appeler la fonction "myrm" à laquelle est ensuite transmise la chaîne d'argument brute et grep recherche des modèles prédéfinis. *

0 votes

Je comprends ce que vous essayez de faire avec set -f qui est équivalent à set -o noglob en Bash, mais cela n'explique toujours pas votre déclaration selon laquelle "Le bon côté, c'est que c'est uniquement du Bash". Au lieu de cela, vous pouvez éliminer le problème entièrement et de manière générique pour n'importe quelle shell en ne utilisant pas du tout rm, mais plutôt en utilisant la commande find. Avez-vous réellement essayé cette suggestion pour voir comment elle se compare à ce que vous suggérez ici?

1voto

a3nm Points 819

En plus de toutes les autres solutions ici, lorsque je fais un grand rm, j'utilise généralement le drapeau -v pour voir ce qui est supprimé et avoir la possibilité d'appuyer rapidement sur ^C si j'ai le moindre doute. Ce n'est pas vraiment un moyen de prévenir les mauvais rm, mais cela peut être utile pour limiter les dégâts en cas de problème.

1voto

Miles Wolbe Points 151

Malheureusement, je ne peux pas laisser de commentaire ci-dessus en raison d'un karma insuffisant, mais je voulais avertir les autres que safe-rm n'est pas une panacée pour les cauchemars de suppression massive accidentelle.

Le test suivant a été effectué dans une machine virtuelle Linux Mint 17.1 (avertissement pour ceux qui ne sont pas familiers avec ces commandes : NE FAITES PAS ÇA ! En fait, même ceux familiers avec ces commandes ne devraient/probablement jamais le faire pour éviter une perte de données catastrophique) :

Version texte (condensée) :

$ cd /
$ sudo safe-rm -rf *
$ ls
bash: /bin/ls: Aucun fichier ou dossier de ce type

Version image (complète) :

entrez ici la description de l'image

1voto

Johnny Wong Points 171

Je pense que c'est un conseil de prévention puissant, avec un raccourci d'expansion * dans le shell :

Tout d'abord, tapez rm -rf * ou rm -rf votre/chemin/*, NE tapez PAS la touche Entrée. (bien sûr, vous devriez avoir l'habitude de faire attention à ne pas appuyer trop rapidement/accidentellement sur Entrée en utilisant rm -rf)

Ensuite, appuyez sur Alt-Shift-8 (c'est-à-dire Alt-Shift-*) pour élargir le joker "*" explicitement dans bash. Cela évite également de ré-entrer une commande "rm -rf *" lors de la navigation dans l'historique.

Enfin, après avoir vérifié que l'expansion contient les bons fichiers/répertoires, appuyez sur Entrée.

Fini.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X