Question Comment prévenir rm -rf / * accidentel?


Je viens de courir rm -rf /* accidentellement, mais je voulais dire rm -rf ./* (remarquez l'étoile après la barre oblique).

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


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


Penser à deux fois et utiliser le cerveau. Je l'utilise réellement! Mais je l'utilise pour résoudre une tâche de programmation complexe impliquant 10 choses différentes. Je suis immergé dans cette tâche assez profondément, il n'y a 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 telles que 'empty current dir', une partie différente de mon cerveau les traduit en commandes et parfois des erreurs sont commises. Je veux que l'ordinateur les corrige, au moins les plus dangereux.


156
2017-12-02 17:09


origine


FYI, vous pouvez aussi faire rm -rf . /mydir au lieu de rm -rf ./mydir et tuez le répertoire dans lequel vous vous trouviez. Je constate que cela se produit plus souvent. - user606723
Pour utiliser une analogie avec une arme à feu, cette question dit s'il vous plaît faites en sorte que l'arme reconnaisse que je vise mon pied et non pas le feu, mais je ne veux pas avoir la responsabilité de ne pas viser mon arme avec le pied en premier lieu. Les armes à feu et les ordinateurs sont stupides et si vous faites une chose stupide, vous obtiendrez ces résultats. En suivant l’analogie du revolver, rien ne vous empêchera de vous blesser si ce n’est la vigilance et la pratique. - slillibri
@slillibri Sauf que rm n’est pas une arme à feu, c’est un programme informatique, pourrait soyez assez intelligent pour déterminer que l'utilisateur va supprimer certains fichiers importants et émettre un avertissement (comme c'est le cas si vous essayez de le faire rm -rf / sans étoile). - Valentin Nemcev
@slillibri Guns ont des sécurités. Demander comment mettre de meilleures sécurités sur le rm commande est une question parfaitement légitime sur l'administrateur système. - Gilles
sudo rm / bin / rm non recommandé, mais empêchera la plupart des entreprises :-) - Paul


Réponses:


Une des astuces que je suis est de mettre # au début en utilisant le rm commander.

root@localhost:~# #rm -rf /

Cela empêche l'exécution accidentelle de rm sur le mauvais fichier / répertoire. Une fois vérifié, retirez # Depuis le début. Cette astuce fonctionne, car dans Bash un mot commençant par # ce mot et tous les caractères restants sur cette ligne sont ignorés. Donc, la commande est simplement ignorée.

OU

Si vous voulez empêcher tout répertoire important, il y a encore une astuce.

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

Maintenant essaye 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 se développer -i à la ligne de commande, de sorte que votre commande devient finalement rm -rf -i. Ainsi, la commande demandera avant le retrait. Vous pouvez mettre ce fichier dans votre /, /home/, /etc/, etc.

OU

Utilisation --preserve-root en option à rm. dans le rm inclus dans les plus récents coreutils forfaits, cette option est la valeur par défaut.

--preserve-root
              do not remove `/' (default)

OU

Utilisation coffre-fort

Extrait du site web:

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

Les utilisateurs qui tentent de supprimer l'un de ces fichiers protégés ou   les répertoires ne pourront pas le faire et un avertissement sera affiché   message à la place:

$ rm -rf /usr
Skipping /usr

215
2017-12-02 23:36



safe-rm a l'air très bien, en regardant maintenant ... - Valentin Nemcev
safe-rm est soigné. C'est aussi un truc astucieux avec le -i fichier. Hah. Silly Bash. - EricR
Incroyable quel genre de tromperie est faite dans Unix. - WernerCD
Le fichier de création nommé -i est un pur génie. J'aurais pu l'utiliser il y a environ un an lorsque j'ai accidentellement lancé une application rm -rf / etc / * sur VPS ... (heureusement, je prends des instantanés nocturnes, ce qui m'a permis de restaurer en moins de 45 minutes). - David W
C'est du génie. La sorcellerie serait touch -- -rf - Mircea Vutcovici


Ton problème:

Je viens de lancer rm -rf / * accidentellement, mais je voulais dire rm -rf ./* (remarquez l'étoile après la barre oblique).

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

./*signifie la même chose que *, la commande ci-dessus s’écrit donc mieux comme:

rm -rf *

Voici un problème connexe. Je vois souvent l'expression suivante, où quelqu'un a supposé que FOO est réglé sur quelque chose comme /home/puppies. En fait, je l’ai vu juste aujourd’hui dans la documentation d’un grand éditeur de logiciels.

rm -rf $FOO/

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

Ce qui suit fera la même chose et risque moins de corrompre votre système:

rm -rf $FOO

J'ai appris ces astuces à la dure. Quand j’ai eu mon premier compte superutilisateur il ya 14 ans, j’ai couru accidentellement rm -rf $FOO/ à partir d'un script shell et détruit un système. Les 4 autres administrateurs ont examiné la situation et ont déclaré: «Ouais. Tout le monde le fait une fois. Maintenant, voici votre support d'installation (36 disquettes). Va le réparer.

D'autres personnes ici recommandent des solutions comme --preserve-root et safe-rm. Cependant, ces solutions ne sont pas présentes pour tous les Un-xe-varients et risquent de ne pas fonctionner sous Solaris, FreeBSD et MacOSX. En outre, safe-rm nécessite l'installation de packages supplémentaires sur chaque système Linux que vous utilisez. Si vous comptez sur safe-rm, que se passe-t-il quand vous commencez un nouvel emploi et qu'ils n'ont pas safe-rm installée? Ces outils sont une béquille, et il est bien préférable de s’appuyer sur les défauts connus et d’améliorer vos habitudes de travail.


42
2017-12-02 18:58



Mon ami m'a dit qu'il n'utilise jamais rm -rf *. Il change toujours le répertoire en premier et utilise une cible spécifique. La raison en est qu'il utilise beaucoup l'historique du shell et il craint qu'une telle commande dans son histoire n'apparaisse au mauvais moment. - haggai_e
@haggai_e: Bon conseil. Quand j'étais nouveau sur Unix, j'ai couru un jour un bogue où rm -rf * également enlevé . et ... J'étais root, et cela parcourait les répertoires inférieurs comme ../../..et était assez destructeur. J'essaie d'être très prudent avec rm -rf * depuis. - Stefan Lasiewski
rm -rf $FOO ne va pas aider si vous avez besoin de rm -rf $FOO/$BAR. cd $FOO && rm -rf $BAR aidera, bien que ce soit beaucoup plus long. - Victor Sergienko
@VictorSergienko, avec Bash, que diriez-vous de spécifier ${FOO:?}, un péché rm -rf ${FOO:?}/ et rm -rf ${FOO:?}/${BAR:?}. Cela l'empêchera de se traduire jamais en rm -rf /. J'ai plus d'informations à ce sujet dans ma réponse ici. - A-B-B
@haggai_e: Je trouve que c'est l'un des meilleurs conseils sur ce sujet. Je me suis brûlé le doigt en utilisant rm -rf *dans une boucle for qui a changé par erreur dans le mauvais répertoire et qui a fini par supprimer quelque chose d'autre. Si j'avais utilisé une cible spécifique, il aurait eu beaucoup moins de chances de supprimer la mauvaise chose. - richk


Puisqu'il s'agit de "Serverfault", j'aimerais dire ceci:

Si vous avez des dizaines ou plus de serveurs, avec une grande équipe d’administrateurs / utilisateurs, Quelqu'un va rm -rf ou chown le mauvais répertoire.

Vous devriez avoir un plan pour restaurer le service affecté avec le moins possible de MTTR.


30
2017-12-02 20:42



Et vous devriez utiliser une machine virtuelle ou une boîte de rechange pour vous exercer à la récupération - découvrez ce qui n'a pas fonctionné et peaufinez votre plan. Nous procédons à un redémarrage bimensuel - car il y a eu des coupures de courant dans notre bâtiment et cela a été douloureux à chaque fois. En faisant quelques arrêts planifiés de tous les racks, nous avons passé de quelques jours à environ 3 heures - à chaque fois, nous apprenons quels bits automatiser / réparer les scripts init.d, etc. - Danny Staple
Et essayez cette commande sur une machine virtuelle. C'est intéressant! Mais prenez un instantané en premier. - Stefan Lasiewski


Les meilleures solutions impliquent de changer vos habitudes de ne pas utiliser rm directement.

Une approche consiste à exécuter echo rm -rf /stuff/with/wildcards* premier. Vérifiez que la sortie des caractères génériques semble raisonnable, puis utilisez l’historique du shell pour exécuter la commande précédente sans le echo.

Une autre approche consiste à limiter le echo commande aux cas où il est aveuglément évident que vous allez supprimer. Plutôt que de supprimer tous les fichiers d'un répertoire, supprimez-le et créez-en un nouveau. Une bonne méthode consiste à renommer le répertoire existant en DELETE-foo, puis créez un nouveau répertoire foo avec les autorisations appropriées, et enfin supprimer DELETE-foo. Un autre avantage de cette méthode est que la commande entrée dans votre historique est rm -rf DELETE-foo.

cd ..
mv somedir DELETE-somedir
mkdir somedir                 # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir             # just to make sure we're deleting the right thing
rm -rf DELETE-somedir

Si vous insistez vraiment pour supprimer un groupe de fichiers parce que vous avez besoin de conserver le répertoire (parce qu'il doit toujours exister ou parce que vous n'avez pas le droit de le recréer), déplacez les fichiers dans un autre répertoire et supprimez ce répertoire. .

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

(Frapper ce Alt+. clé.)

Supprimer un répertoire de l'intérieur serait intéressant, car rm -rf . est court donc a un faible risque de fautes de frappe. Les systèmes typiques ne vous permettent pas de le faire, malheureusement. Vous pouvez rm -rf -- "$PWD" au lieu de cela, avec un risque plus élevé de fautes de frappe mais la plupart d'entre elles ne suppriment rien Attention, cela laisse une commande dangereuse dans l'historique de votre shell.

Chaque fois que vous le pouvez, utilisez le contrôle de version. Tu ne rm, vous cvs rm ou peu importe, et c'est impossible.

Zsh a des options pour vous demander avant de lancer rm avec un argument qui liste tous les fichiers d'un répertoire: rm_star_silent (activé par défaut) invite avant l'exécution 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. Ceci est d'une utilité limitée si vous souhaitez supprimer tous les fichiers de certains répertoires, car vous attendez déjà l'invite. Cela peut aider à prévenir les fautes de frappe comme rm foo * pour rm foo*.

Il y a beaucoup plus de solutions flottantes qui impliquent de changer la rm commander. Une limite de cette approche est qu’un jour vous serez sur une machine avec le vrai rm et vous appelerez automatiquement rm, en toute sécurité dans vos attentes de confirmation… et ensuite, vous restaurerez des sauvegardes.


23
2017-12-02 22:33



mv -t DELETE_ME -- * est un peu plus infaillible. - Tobu
@Giles n'utilisant pas rm directement c'est un bon conseil! Une alternative encore meilleure est de Utilisez le find commander. - aculich
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 de somedir mais quittera le répertoire et tous les sous-répertoires. - aculich


Vous pouvez 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 pouvez également l’intégrer à un client twitter en ligne de commande pour informer vos amis de la façon dont vous vous êtes presque humilié en effaçant votre disque dur avec rm -fr /* en tant que racine.


18
2017-12-02 17:16



+1 pour telnet miku.acm.uiuc.edu - Ali
alias echo = "telnet miku.acm.uiuc.edu" - kubanczyk
Je ne dois pas être assez old school ... quelle est la signification de telnet miku.acm.uiuc.edu? - Kyle Strand
Essayez-le et découvrez. C'est non destructif. Si vous êtes aussi paranoïaque que vous devriez l'être, exécutez-le sur une machine virtuelle. - Naftuli Kay
-1 Vous ne pouvez pas aliaser les commandes contenant des espaces, sans parler de / * qui est un nom invalide - xenithorb


Oui: ne travaillez pas en tant que root et réfléchissez toujours à deux fois avant d'agir.

Regardez aussi quelque chose comme https://launchpad.net/safe-rm.


15
2018-02-26 05:50



Mentionné travaillant en tant que root dans edit - Valentin Nemcev
@Valentin: o_O !! - Jonathan Rioux


Le moyen le plus simple de prévenir les accidents rm -rf /* est d'éviter toute utilisation de la rm commander! En fait, j'ai toujours été tenté de courir rm /bin/rm se débarrasser complètement de la commande! Non, je ne suis pas facétieux.

Utilisez plutôt le -delete option du find commander, mais avant de supprimer les fichiers, je vous recommande de prévisualiser les fichiers que vous souhaitez supprimer:

find | less

Remarque, dans les versions modernes de find Si vous omettez le nom d'un répertoire, il utilisera implicitement le répertoire actuel. Ce qui précède équivaut à:

find . | less

Une fois que vous êtes sûr que ce sont les fichiers que vous souhaitez supprimer, vous pouvez ajouter le -delete option:

find path/to/files -delete

Donc, non seulement find  plus sûr à utiliser, il est également plus expressifAinsi, si vous souhaitez supprimer uniquement certains fichiers d'une hiérarchie de répertoires correspondant à un modèle particulier, vous pouvez utiliser une expression comme celle-ci pour afficher un aperçu, puis supprimez les fichiers:

find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete

Il y a beaucoup de bonnes raisons d'apprendre et d'utiliser find en plus juste un plus sûr rm, alors vous vous remercierez plus tard si vous prenez le temps d'apprendre à utiliser find.


15
2017-12-03 22:44



Discussion très intéressante. J'aime votre approche et fait un petit extrait. C'est super inefficace, puisqu'il appelle au plus 3 fois, mais pour moi, c'est un bon début: github.com/der-Daniel/fdel - Daniel Hitzel


Il y a de très mauvais conseils dans ce fil, heureusement, la plupart ont été rejetés.

Tout d’abord, lorsque vous devez être root, devenez root - sudo et les diverses astuces de pseudonymes vous affaibliront. Et pire, ils vont vous rendre imprudent. Apprenez à bien faire les choses, arrêtez de vous fier à des alias pour vous protéger. Un jour, vous allez vous planter dans une boîte qui n’a pas vos roues d’entraînement et vous faites sauter quelque chose.

Deuxièmement, lorsque vous avez la racine, pensez à vous-même comme conduisant un bus rempli d'écoliers. Parfois, vous pouvez écouter la chanson à la radio, mais d'autres fois, vous devez regarder des deux côtés, ralentir les choses et vérifier tous vos miroirs.

Troisièmement - vous presque jamais vraiment devoir rm -rf - plus probablement vous voulez mv something something.bak ou mkdir _trash && mv something _trash/

Quatrième - toujours ls votre wildcard avant rm - Il n'y a rien de fou à regarder quelque chose avant de le détruire pour toujours.


14
2017-12-02 19:57



+1 pour l'utilisation de ls. - Sachin Divekar
@ eventi Je suis d'accord qu'il y a quelques conseils terribles et hacks laids dans ce fil. Et c'est certainement une bonne idée de regarder quelque chose avant de le détruire, mais il y a un encore meilleur moyen de le faire en utilisant le find commander. - aculich
Je ne vois pas comment trouver est plus simple ou plus sûr, mais j'aime votre find . -name '*~' Exemple. Mon point est que ls listera le même glob que rm utilisera. - eventi


Ceci est standard pour les expressions rationnelles dans le contexte de rm, mais cela vous aurait sauvé dans ce cas.

je fais toujours echo foo*/[0-9]*{bar,baz}* D'abord, pour voir ce que l'expression rationnelle va correspondre. Une fois que j'ai la sortie, je reviens avec l'édition en ligne de commande et change echo à rm -rf. je jamais, jamais utiliser rm -rf sur une expression rationnelle non testée.


11
2017-12-02 19:05



S'il vous plaît comparer: linuxmanpages.com/man3/regex.3.php  linuxmanpages.com/man3/glob.3.php - bukzor
OK, qu'est-ce que je cherche? Voulez-vous dire que la syntaxe de l'expression rationnelle pour la correspondance de fichiers est différente (et parfois appelée par un nom différent) de celle utilisée par exemple dans perl? Ou un autre point que j'ai manqué? Je m'excuse pour la lenteur de mes pensées, c'est samedi matin à la première heure! - MadHatter
Ces choses que vous appelez "regexp" sont en fait des globes. Ce n'est pas une syntaxe de regex différente; ce n'est pas une regex. - bukzor
Cet argument pourrait certainement être avancé. Cependant, dans l'article de Wikipédia sur les expressions régulières, je trouve que "De nombreux systèmes informatiques modernes fournissent des caractères génériques dans les noms de fichiers correspondants d'un système de fichiers. Il s'agit d'une fonctionnalité essentielle de nombreux shells de ligne de commande, également appelée" globbing "- notez le utilisation de "également connu sous le nom", ce qui me semble indiquer que les jetons d'appel contenant des métacaractères pour correspondre à un ou plusieurs noms de fichier regexps ne sont pas faux. Je conviens que «globbing» est un meilleur terme car il ne signifie rien d’autre que l’utilisation d’expressions régulières dans la recherche du nom de fichier. - MadHatter
@MadHatter Vérifier que les fichiers correspondent avant de les supprimer est un bon conseil, mais il existe plus sûr et plus expressif de le faire avec le find commander. - aculich