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).

231voto

TheLegend0713 Points 21

Un des astuces que je suis est de mettre # au début lors de l'utilisation de la commande rm.

root@localhost:~# #rm -rf /

Cela évite l'exécution accidentelle de rm sur le mauvais fichier/répertoire. Une fois vérifié, retirer # du début. Cette astuce fonctionne, car en Bash un mot commençant par # fait que ce mot et tous les caractères restants sur cette ligne sont ignorés. Ainsi la commande est simplement ignorée.

OU

Si vous voulez empêcher la suppression de tout répertoire important, il y a une autre astuce.

Créez un fichier nommé -i dans ce répertoire. Comment peut-on créer un fichier aussi étrange ? En utilisant touch -- -i ou touch ./-i

Maintenant essayez rm -rf *:

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

Ici le * va étendre -i à la ligne de commande, donc votre commande devient finalement rm -rf -i. Ainsi la commande demandera confirmation avant la suppression. Vous pouvez mettre ce fichier dans votre /, /home/, /etc/, etc.

OU

Utilisez l'option --preserve-root avec la commande rm. Dans la version de rm incluse dans les nouveaux paquets coreutils, cette option est la valeur par défaut.

--preserve-root
              ne pas supprimer `/' (par défaut)

OU

Utilisez safe-rm

Extrait du site web:

Safe-rm est un outil de sécurité destiné à prévenir la suppression accidentelle de fichiers importants en remplaçant /bin/rm par un enrobage, qui vérifie les arguments donnés contre une liste noire configurable de fichiers et répertoires qui ne devraient jamais être supprimés.

Les utilisateurs qui essaient de supprimer un de ces fichiers ou répertoires protégés ne pourront pas le faire et verront à la place un message d'avertissement:

$ rm -rf /usr
Skipping /usr

11 votes

Safe-rm a l'air très bien, je vais y jeter un œil maintenant...

51 votes

Safe-rm est génial. Aussi, c'est une astuce astucieuse avec le fichier -i. Hah. Silly bash.

6 votes

Incroyable ce genre de tours de passe-passe qui sont faits en unix.

58voto

Stefan Lasiewski Points 22459

Votre problème :

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

La solution : Ne faites pas ça! En pratique, n'utilisez pas ./ au début d'un chemin. Les barres obliques n'ajoutent aucune valeur à la commande et ne feront que causer de la confusion.

./* signifie la même chose que *, donc la commande ci-dessus est mieux écrite comme suit :

rm -rf *

Voici un problème connexe. Je vois souvent l'expression suivante, où quelqu'un suppose que FOO est défini comme quelque chose comme /home/puppies. Je l'ai vu justement aujourd'hui dans la documentation d'un grand éditeur de logiciels.

rm -rf $FOO/

Mais si FOO n'est pas défini, cela évaluera à rm -rf /, ce qui tentera de supprimer tous les fichiers de votre système. Le slash final est inutile, donc en pratique ne l'utilisez pas.

La commande suivante fera la même chose, et est moins susceptible de corrompre votre système :

rm -rf $FOO

J'ai appris ces astuces à la dure. Quand j'ai eu mon premier compte superutilisateur il y a 14 ans, j'ai accidentellement exécuté rm -rf $FOO/ à partir d'un script shell et j'ai détruit un système. Les 4 autres administrateurs système ont regardé ça et ont dit, 'Oui. Tout le monde le fait une fois. Maintenant voici vos supports d'installation (36 disquettes). Allez réparer ça.'

D'autres personnes ici recommandent des solutions comme --preserve-root et safe-rm. Cependant, ces solutions ne sont pas présentes pour toutes les variantes Un*x et peuvent ne pas fonctionner sur Solaris, FreeBSD et MacOSX. De plus, safe-rm nécessite que vous installiez des paquets supplémentaires sur chaque système Linux que vous utilisez. Si vous dépendez de safe-rm, que se passe-t-il lorsque vous commencez un nouveau travail et qu'ils n'ont pas safe-rm installé ? Ces outils sont une béquille, et il est préférable de compter sur les valeurs par défaut connues et d'améliorer vos habitudes de travail.

26 votes

Mon ami m'a dit qu'il n'utilise jamais rm -rf *. Il change toujours de répertoire en premier et utilise une cible spécifique. La raison en est qu'il utilise beaucoup l'historique de l'interpréteur de commandes et il craint qu'une telle commande dans son historique puisse apparaître au mauvais moment.

0 votes

@haggai_e: Bon conseil. Quand j'étais nouveau sous Unix, j'ai une fois rencontré un bug où rm -rf * a également supprimé . et ... J'étais root, et ceci a parcouru les répertoires inférieurs comme ../../.., et a été assez destructeur. J'essaie d'être très prudent avec rm -rf * depuis.

6 votes

rm -rf $FOO ne fonctionnera pas si vous avez besoin de rm -rf $FOO/$BAR. cd $FOO && rm -rf $BAR aidera, bien que ce soit beaucoup plus long.

34voto

Not Now Points 3522

Étant donné que nous sommes sur "Serverfault", je tiens à dire ceci :

Si vous avez des dizaines voire des centaines de serveurs, avec une équipe assez importante d'administrateurs/utilisateurs, quelqu'un finira par exécuter la commande rm -rf ou chown sur le mauvais répertoire.

Vous devriez avoir un plan pour remettre en service le service affecté avec le MTTR le plus court possible.

5 votes

Et vous devriez utiliser une machine virtuelle ou une boîte de secours pour pratiquer les récupérations - découvrez ce qui n'a pas fonctionné et affinez ledit plan. Nous passons à un redémarrage bi-hebdomadaire - car il y a eu des pannes de courant dans notre bâtiment, et à chaque fois cela a été douloureux. En effectuant quelques arrêts planifiés de toutes les baies, nous avons réduit le temps de quelques jours de course à environ 3 heures maintenant - à chaque fois, nous apprenons quels éléments automatiser/réparer les scripts init.d, etc.

1 votes

Et essayez cette commande sur une VM. C'est intéressant! Mais prenez d'abord un instantané.

0 votes

Un excellent argument en faveur des systèmes de fichiers pouvant être instantanés, avec possibilité de retour en arrière. ZFS possède cette fonctionnalité... docs.oracle.com/cd/E19253-01/819-5461/gbcxk/index.html

24voto

Les meilleures solutions consistent à changer vos habitudes pour ne pas utiliser directement rm.

Une approche consiste à exécuter d'abord echo rm -rf /stuff/with/wildcards*. Vérifiez que la sortie des wildcards semble raisonnable, puis utilisez l'historique de la ligne de commande pour exécuter la commande précédente sans le echo.

Une autre approche est de limiter l'utilisation de la commande echo dans les cas où il est évident ce que vous allez supprimer. Plutôt que de supprimer tous les fichiers dans un répertoire, supprimez le répertoire et créez-en un nouveau. Une bonne méthode est de renommer le répertoire existant en DELETE-foo, puis de créer un nouveau répertoire foo avec les permissions appropriées, et enfin de supprimer DELETE-foo. Un avantage secondaire de cette méthode est que la commande inscrite dans votre historique est rm -rf DELETE-foo.

cd ..
mv somedir DELETE-somedir
mkdir somedir                 # ou rsync -dgop DELETE-somedir somedir pour conserver les permissions
ls DELETE-somedir             # juste pour s'assurer que l'on supprime le bon élément
rm -rf DELETE-somedir

Si vous insistez vraiment sur la suppression d'un groupe de fichiers car le répertoire doit rester (parce qu'il doit toujours exister, ou parce que vous n'auriez pas la permission de le recréer), déplacez les fichiers vers un répertoire différent, et supprimez ce répertoire.

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

(Appuyez sur la touche Alt+..)

Supprimer un répertoire depuis l'intérieur serait pratique, car rm -rf . est court et donc comporte peu de risques de fautes de frappe. Malheureusement, les systèmes typiques ne vous permettent pas de le faire. Vous pouvez plutôt utiliser rm -rf -- "$PWD", avec un risque plus élevé de fautes de frappe mais la plupart d'entre elles ne supprimeront rien. Attention cela laisse une commande dangereuse dans votre historique de ligne de commande.

Dès que vous le pouvez, utilisez un contrôle de version. Vous ne rm, vous cvs rm ou autre, et c'est réversible.

Zsh propose des options pour vous demander avant d'exécuter rm avec un argument qui liste tous les fichiers dans un répertoire : rm_star_silent (activé par défaut) demande avant d'exécuter rm whatever/*, et rm_star_wait (désactivé par défaut) ajoute un délai de 10 secondes pendant lequel vous ne pouvez pas confirmer. Cela a une utilité limitée si vous aviez l'intention de supprimer tous les fichiers d'un répertoire, car vous vous attendez déjà à la demande. Cela peut aider à éviter les fautes de frappe comme rm foo * à la place de rm foo*.

Il existe de nombreuses autres solutions qui impliquent de modifier la commande rm. Une limitation de cette approche est qu'un jour, vous serez sur une machine avec le vrai rm et vous appellerez automatiquement rm, en toute confiance dans l'attente d'une confirmation... et la prochaine chose que vous ferez sera de restaurer des sauvegardes.

0 votes

mv -t DELETE_ME -- * est un peu plus fiable.

0 votes

@Giles Ne pas utiliser directement rm est un bon conseil! Une alternative encore meilleure est d' utiliser la commande find.

1 votes

Et si vous avez besoin que le répertoire reste, vous pouvez le faire tout simplement en utilisant find somedir -type f -delete qui supprimera tous les fichiers dans somedir mais laissera le répertoire et tous les sous-répertoires.

21voto

Naftuli Kay Points 1608

Vous pourriez toujours faire un alias, comme vous l'avez mentionné:

what_the_hell_am_i_thinking() {
   echo "Stop." >&2
   echo "Seriously." >&2
   echo "You almost blew up your computer." >&2
   echo 'WHAT WERE YOU THINKING!?!?!' >&2
   echo "Please provide an excuse for yourself below: " 
   read 
   echo "I'm sorry, that's a pathetic excuse. You're fired."
   sleep 2
   telnet nyancat.dakko.us
}

alias rm -fr /*="what_the_hell_am_i_thinking"

Vous pourriez aussi l'intégrer avec un client Twitter en ligne de commande pour alerter vos amis sur le fait que vous avez failli vous humilier en effaçant votre disque dur avec rm -fr /* en tant que root.

3 votes

+1 pour telnet miku.acm.uiuc.edu

1 votes

Alias echo="telnet miku.acm.uiuc.edu"

0 votes

Je ne dois pas être assez old-school... quelle est la signification de telnet miku.acm.uiuc.edu?

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