Pourquoi est-il possible de supprimer l'intégralité du système de fichiers?

24

Après avoir commis la fameuse erreur de supprimer l'intégralité de mon système de fichiers via sudo rm -rf /*, de récupérer des horribles dommages que j'avais causés et de faire face au fait que je viens de perdre 6 ans de ma vie, j'ai commencé à me demander pourquoi il était même possible de le faire, et ce qui pourrait être fait pour éviter que cette erreur ne se produise.

Une solution qui m'a été suggérée est de révoquer l'accès root de mon compte, mais cela n'est pas pratique, car de nombreuses commandes nécessitent un accès root et lorsque vous devez exécuter quelques dizaines de commandes chaque jour, cela devient ennuyeux.

La sauvegarde de votre système est la voie à suivre évidente. Mais la restauration d'une sauvegarde nécessite également un certain temps d'arrêt, et selon votre système, ce temps d'arrêt peut être de plusieurs jours ou semaines, ce qui peut être inacceptable dans certains cas.

Ma question est: pourquoi ne pas implémenter une confirmation lorsque l'utilisateur essaie de supprimer son système de fichiers? De sorte que lorsque vous voulez vraiment le faire, vous appuyez simplement sur Y ou entrez, et si vous ne le faites pas au moins, vous ne perdez pas tout.

Mister_Fix
la source
20
"Pourquoi est-il même possible de faire ça?" Pourquoi ne serait- ce pas possible? Il existe de très bonnes raisons de supprimer le contenu d'une hiérarchie de répertoires, et il existe de nombreux sous-ensembles /qui seraient presque aussi mauvais à supprimer ( /etc/, par exemple). Il ne s'agit tout simplement pas de rmdécider quels répertoires peuvent ou ne peuvent pas être facilement supprimés.
chepner
2
Le titre indique "Pourquoi est-il possible de supprimer le système?" alors que la question elle-même demande "Ma question est: Pourquoi ne pas implémenter une confirmation lorsque l'utilisateur essaie de supprimer son système de fichiers?". Cela rend donc la question peu claire. Laquelle est votre vraie question afin que nous sachions au moins quoi répondre? Veuillez modifier votre message pour clarifier
Sergiy Kolodyazhnyy
3
Quelle est réellement la question ici? J'en vois trois: (1) Pourquoi est-ce possible? (2) Comment éviter de le faire?, Et (3) Pourquoi ne pas mettre en œuvre une confirmation? - Ce n'est pas la même question, la première demande un raisonnement, la seconde des outils. (Le troisième est lié au deuxième, mais toujours pas vraiment le même. Une confirmation n'est pas le seul moyen d'empêcher quelque chose.)
ilkkachu
10
Si vous ne demandez pas de clarification à l'auteur de la question, alors ne commentez pas du tout . Je vois beaucoup de commentaires d'auto-félicitations ici, expliquant comment c'est la faute du PO pour ne pas savoir ce que signifient les drapeaux, ou pour ne pas avoir de sauvegarde ou autre. Je suis très heureux de savoir que beaucoup de nos utilisateurs sont assez sages pour avoir des sauvegardes et ne pas exécuter de commandes qu'ils ne comprennent pas. C'est absolument génial pour eux, mais fondamentalement inutile pour le PO qui, vraisemblablement, a également appris cette leçon maintenant. Alors arrêtons de nous prélasser dans notre propre brillance et répondons simplement à la question.
terdon

Réponses:

16

rmest un outil système de bas niveau. Ces outils sont construits aussi simplement que possible car ils doivent être présents sur n'importe quel système. rmdevrait avoir un comportement bien connu, en particulier en ce qui concerne les invites de confirmation afin qu'il puisse être utilisé dans des scripts.

L'ajout d'un cas spécial à l'invite rm /*ne serait pas possible car la commande rm ne le voit pas sous cette forme. Le *caractère générique est développé par le shell avant d'être transmis à rm, donc la commande réelle qui a besoin d'un cas spécial ressemblerait à quelque chose rm /bin /boot /dev /etc /home /initrd.img /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var /vmlinuz. Ajouter le code pour vérifier ce cas (qui sera probablement différent sur différents linux) serait un défi complexe tout en étant sujet à des erreurs subtiles. Le linux standard rma une protection par défaut contre la destruction du système en refusant de supprimer /sans l' --no-preserve-rootoption.

Par défaut, il existe trois protections contre la suppression de votre système de cette manière:

  1. Autorisations - les utilisateurs réguliers ne pourront pas supprimer les fichiers importants. Vous avez contourné cela avec sudo
  2. Répertoires - par défaut, rm ne supprimera pas les répertoires. Vous avez contourné cela avec le drapeau -r
  3. Écriture des fichiers protégés - par défaut, rm demandera une confirmation avant de supprimer un fichier protégé en écriture (cela n'aurait pas stoppé tous les dommages, mais aurait pu fournir une invite avant que le système ne soit irrécupérable). Vous avez ignoré cette protection avec le drapeau -f

Pour supprimer tout le contenu d'un dossier, plutôt que de l'exécuter rm /path/to/folder/*, faites-le rm -rf /path/to/folder, mkdir /path/to/foldercar cela déclenchera la --preserve-rootprotection ainsi que la suppression des fichiers dot dans le dossier

rhellen
la source
3
"rm devrait avoir un comportement bien connu" et c'est en fait l'un des outils spécifiés par la norme POSIX. "Il * le caractère générique est développé par le shell avant d'être passé à rm" Exactement, donc ajouter des vérifications pour tous les types de paramètres, qui peuvent être des liens symboliques vers des répertoires et des fichiers réels /, prendrait beaucoup de combinaisons et de considérations, donc ce n'est pas pratique. Et pour en revenir à l'idée de normes, l'ajout de tels contrôles romprait un comportement cohérent
Sergiy Kolodyazhnyy
C'est exactement pourquoi safe-rmest un wrapper autour rm: De cette façon, il peut vérifier chaque argument (au lieu de la ligne de commande aléatoire entière), vérifier qu'il ne figure pas sur la liste noire configurable et ensuite seulement appeler rmavec les arguments vérifiés. Ce n'est ni très complexe ni sujet à des erreurs.
dessert
59

Meet safe-rmInstaller Safe-RM, le «wrapper autour de la rmcommande pour éviter les suppressions accidentelles»:

safe-rm empêche la suppression accidentelle de fichiers importants en remplaçant rmpar un wrapper qui vérifie les arguments donnés par rapport à une liste noire configurable de fichiers et de répertoires qui ne doivent jamais être supprimés.

Les utilisateurs qui tentent de supprimer l'un de ces fichiers ou répertoires protégés ne pourront pas le faire et un message d'avertissement s'affichera à la place. ( man safe-rm)

Si le lien d'installation ci-dessus ne fonctionne pas, utilisez-le à la sudo apt install safe-rmplace. La configuration par défaut contient déjà les répertoires système, essayons rm /*par exemple:

$ rm /*
safe-rm: skipping /bin
safe-rm: skipping /boot
safe-rm: skipping /dev
safe-rm: skipping /etc
safe-rm: skipping /home
safe-rm: skipping /lib
safe-rm: skipping /proc
safe-rm: skipping /root
safe-rm: skipping /sbin
safe-rm: skipping /sys
safe-rm: skipping /usr
safe-rm: skipping /var
…

Comme vous le voyez, cela vous empêcherait de supprimer /home, où je suppose que vos fichiers personnels sont stockés. Cependant, cela ne vous empêche pas de supprimer l' ~un de ses sous-répertoires si vous essayez de les supprimer directement. Pour ajouter le ~/precious_photosrépertoire, ajoutez simplement son chemin absolu avec le tilde résolu dans safe-rmle fichier de configuration de /etc/safe-rm.conf, par exemple:

echo /home/dessert/precious_photos | sudo tee -a /etc/safe-rm.conf

Pour les cas où vous exécutez rmsans sudo1 et le -fdrapeau, c'est une bonne idée d' ajouter unalias pour votre shell qui fait rmdu -idrapeau par défaut. De cette façon, rmdemande chaque fichier avant de le supprimer:

alias rm='rm -i'

Un indicateur -Itout aussi utile est , juste qu'il avertit seulement "une fois avant de supprimer plus de trois fichiers, ou lors de la suppression récursive", ce qui est "moins intrusif que -i, tout en offrant une protection contre la plupart des erreurs":

alias rm='rm -I'

Le danger général de ces alias est que vous prenez facilement l'habitude de compter sur eux pour vous sauver, ce qui peut se retourner contre vous lorsque vous utilisez un environnement différent.


1: sudoIgnore les alias , on peut travailler autour de ce en définissant alias sudo='sudo 'bien

dessert
la source
25

La confirmation est déjà là, le problème est -fdans la commande, c'est-à-dire --force; Lorsque l'utilisateur force une opération, il est supposé qu'il sait ce qu'il fait (une erreur peut évidemment toujours se produire).

Un exemple:

 rm -r ./*
 rm: remove write-protected regular file './mozilla_mvaschetto0/WEBMASTER-04.DOC'? N
 rm: cannot remove './mozilla_mvaschetto0': Directory not empty
 rm: descend into write-protected directory './pulse-PKdhtXMmr18n'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-bolt.service-rZWMCb'? n
 rm: descend into write-protected directory './systemd-private-     890f5b31987b4910a579d1c49930a591-colord.service-4ZBnUf'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-fwupd.service-vAxdbk'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-minissdpd.service-9G8GrR'? 
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-ModemManager.service-s43zUX'? nn
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-rtkit-daemon.service-cfMePv'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-systemd-timesyncd.service-oXT4pr'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-upower.service-L0k9rT'? n

C'est différent avec l' --forceoption: je n'obtiendrai aucune confirmation et les fichiers seront supprimés.

Le problème est de connaître la commande et ses paramètres, de naviguer davantage dans la mancommande (même si la commande se trouve dans un tutoriel) pour des exemples: la première fois que j'ai vu la commande tar xzf some.tar.gzje me pose la question "qu'est-ce que cela xzfsignifie? "

J'ai ensuite lu la page de manuel tar et je l'ai découverte.

AtomiX84
la source
Je ne pense pas que ce soit pertinent ici. Au moment où rm demande d'abord un fichier protégé en écriture ou autre, il a peut-être déjà supprimé tout un tas de fichiers importants.
Jonas Schäfer
1
Donc, personnellement, j'ai toujours pensé qu'il -ffallait supprimer les dossiers. J'ai même ouvert une invite pour confirmer et me plaindre mais j'ai appris que c'était juste -rnécessaire. Je suppose que c'est rm -rfdevenu la norme car il est tellement utile dans un script (vous ne voulez pas que le script échoue juste parce que vous essayez de supprimer des choses qui n'existent pas) donc vous le voyez souvent, mais je suppose que nous avons besoin être vigilant sur l'utilisation rm -rde notre "valeur par défaut" dans un shell (naturellement, il ne devrait pas y avoir d'hypothèses "par défaut" que vous ne comprenez pas, en particulier avec sudo, mais les gens seront des gens et au moins c'est plus sûr).
Captain Man
2
Rmdir est le moyen le plus sûr de supprimer un dossier
AtomiX84
rmne demande pas de confirmation par défaut, il ne lui demande que des répertoires et des fichiers protégés en écriture. Si vous avez exécuté cette commande sur votre ordinateur, vous avez probablement supprimé beaucoup de vos propres fichiers. Si vous avez besoin rmde demander une confirmation, vous devez passer le -iparamètre. Par exemple:rm -ir ./*
Dan
8

L'exécution sans sauvegardes signifie que vous devez faire très attention à ne jamais faire d'erreurs. Et j'espère que votre matériel ne tombera jamais en panne. (Même RAID ne peut pas vous sauver de la corruption du système de fichiers causée par une RAM défectueuse.) C'est donc votre premier problème. (Ce que je suppose que vous avez déjà réalisé et que vous ferez des sauvegardes à l'avenir.)


Mais vous pouvez faire certaines choses pour réduire la probabilité d'erreurs comme celle-ci:

  • alias rm='rm -I'pour demander si vous supprimez plus de 3 éléments.
  • alias mv et cp vers mv -iet cp -i(de nombreux cas d'utilisation normaux n'impliquent pas l' écrasement d'un fichier de destination).
  • alias sudo='sudo 'pour faire l'expansion d'alias sur le premier argumentsudo

Je trouve que rm -Ic'est beaucoup plus utile que rm -i. Il n'invite généralement pas lors d'une utilisation normale, donc le toucher lorsque vous ne vous y attendiez pas est un avertissement beaucoup plus visible / meilleur. Avec -i(avant de découvrir -I), je me suis habitué à taper \rmpour désactiver l'expansion des alias, après m'être assuré d'avoir correctement tapé la commande.

Vous ne voulez pas prendre l'habitude de compter sur rm -iou -Ialias pour vous sauver . C'est votre ligne de sécurité que vous espérez ne jamais utiliser. Si je veux réellement sélectionner de manière interactive les correspondances à supprimer, ou si je ne suis pas sûr que mon glob puisse correspondre à certains fichiers supplémentaires, je tape manuellement rm -i .../*whatever*. (Aussi une bonne habitude au cas où vous seriez jamais dans un environnement sans vos alias).

Défendez-vous contre le doigté des graisses Enteren tapant d' ls -d /*foo*abord , puis vers le haut et changez-le en une rm -rfois que vous avez fini de taper. Ainsi, la ligne de commande ne contient jamais de rm -rf ~/commandes dangereuses similaires à aucun moment. Vous "l'armez" seulement en changeant lsen rmavec control-a, alt-d pour aller au début de la ligne et en ajoutant le -rou le -faprès avoir fini de taper la ~/some/sub/dir/partie de la commande.

Selon ce que vous supprimez, exécutez réellement le ls -dpremier, ou non si cela n'ajoute rien à ce que vous voyez avec la tabulation. Vous pouvez commencer par rm(sans -rou -rf) donc c'est juste control-a / control-right (ou alt + f) / space / -r.

(Habituez-vous aux raccourcis clavier d'édition puissants de bash / readline pour vous déplacer rapidement, comme les flèches de contrôle ou alt + f / b pour vous déplacer par des mots, et tuer des mots entiers avec alt + backspace ou alt + d, ou control-w. -u pour tuer jusqu'au début de la ligne. Et control- / pour annuler une modification si vous allez trop loin. Et bien sûr, l'historique des flèches vers le haut que vous pouvez rechercher avec control-r / control-s.)

À éviter, -rfsauf si vous en avez réellement besoin pour désactiver les invites de suppression des fichiers en lecture seule.

Prenez le temps de réfléchir avant d'appuyer sur Retour sur une sudocommande. Surtout si vous n'avez pas de sauvegardes complètes, ou que ce serait un mauvais moment pour les restaurer.

Peter Cordes
la source
6

Eh bien, la réponse courte est de ne pas exécuter une telle commande.

La longue histoire est que cela fait partie de la personnalisation. Il y a essentiellement deux facteurs en jeu ici. L'une est le fait que vous êtes libre de modifier tous les fichiers.

La seconde est que la commande rm offre le sucre syntaxique utile pour supprimer tous les fichiers d'un dossier.

En fait, cela pourrait être reformulé comme un simple principe des machines Unix. Tout est un fichier . Pour améliorer les choses, il existe des contrôles d'accès, mais ceux-ci sont remplacés par votre utilisation de

sudo

Je suppose que vous pourriez ajouter un alias ou une fonction pour vous assurer que cela ne pourra jamais être exécuté.

HaoZeke
la source
4

Si l'utilisation de l'espace fichier de votre système n'est pas immense (et de nos jours «immense» signifie «des centaines de gigaoctets ou plus»), créez des instances de machine virtuelle et travaillez toujours à l'intérieur d'une seule. La récupération impliquerait simplement l'utilisation d'une instance de sauvegarde.

Ou vous pouvez créer une prison chroot et y travailler. Vous auriez toujours besoin d'une récupération si elle était mise à la poubelle, mais ce serait plus facile avec un système en cours d'exécution (englobant) à partir duquel travailler.

Loren Rosen
la source
C'est probablement la réponse la plus efficace, car elle peut protéger contre tout dommage, même les scripts tiers. Vous n'auriez qu'à vous soucier des logiciels malveillants réels.
PyRulez
Pensé sous un autre angle. Il vaut la peine de se demander pourquoi vous devez effectuer des suppressions récursives en premier lieu. Peut-être que ce qui est vraiment nécessaire, ce sont des scripts pour supprimer un projet, etc.
Loren Rosen
"Il vaut la peine de se demander pourquoi vous devez effectuer des suppressions récursives en premier lieu." Eh bien, ce n'est pas parce qu'il n'y a pas de commande intégrée que vous ne pouvez toujours pas faire d'erreur. Les scripts tiers peuvent supprimer les fichiers un par un d'un répertoire. Et il existe d'autres façons de bork le système qui ne touchent qu'un seul fichier. Cependant, le remplacement rmpar des safe-rmaides, au moins.
PyRulez
Ma notion avec le script était qu'il aurait une notion intégrée de «projet» ou similaire. Peut-être auriez-vous un fichier vide à la racine du projet appelé .project_root, ou, si le système de fichiers le prend en charge, un attribut sur le répertoire lui-même. Ensuite, le script remontait l'arborescence des fichiers à la recherche de la racine du projet et se plaignait que le répertoire actuel n'était pas dans un projet. Ou, si les projets vivent tous au même endroit, le script peut vous obliger à nommer un projet. Vous pouvez toujours supprimer le mauvais projet, mais pas détruire tout le système.
Loren Rosen
... aussi, une variante de chrootserait d'utiliser quelque chose comme Docker (que je pense en fait utilise chrootsous les couvertures). Pour les autres fichiers que vous avez juste besoin de lire, montez un système de fichiers en lecture seule.
Loren Rosen
3

rmest une très ancienne commande Unix et n'a probablement pas été conçue dans un souci de convivialité. Il essaie de faire exactement ce qu'on lui demande, quand il a les autorisations. Un écueil pour de nombreux nouveaux utilisateurs est qu'ils voient souvent du code avec sudoet ne pensent pas beaucoup à l'utiliser. Les fonctions qui modifient directement les fichiers comme rm, dd, chroot, etc. nécessitent un soin extrême à l' utilisation.

De nos jours j'aime utiliser trash(sans sudo) de trash-cli . Il fonctionne comme la Corbeille de Windows, en ce sens que vous pouvez facilement récupérer des fichiers supprimés accidentellement. Ubuntu a déjà un dossier Corbeille et une fonctionnalité de déplacement vers la corbeille intégrés dans Fichiers.

Même alors, vous pouvez faire des erreurs, alors assurez-vous de faire des sauvegardes de tout votre système de fichiers.

qwr
la source