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.
la source
/
qui seraient presque aussi mauvais à supprimer (/etc/
, par exemple). Il ne s'agit tout simplement pas derm
décider quels répertoires peuvent ou ne peuvent pas être facilement supprimés.Réponses:
rm
est 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.rm
devrait 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 choserm /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 standardrm
a une protection par défaut contre la destruction du système en refusant de supprimer/
sans l'--no-preserve-root
option.Par défaut, il existe trois protections contre la suppression de votre système de cette manière:
Pour supprimer tout le contenu d'un dossier, plutôt que de l'exécuter
rm /path/to/folder/*
, faites-lerm -rf /path/to/folder
,mkdir /path/to/folder
car cela déclenchera la--preserve-root
protection ainsi que la suppression des fichiers dot dans le dossierla source
/
, 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érentsafe-rm
est un wrapper autourrm
: 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 appelerrm
avec les arguments vérifiés. Ce n'est ni très complexe ni sujet à des erreurs.Meet
safe-rm
, le «wrapper autour de larm
commande pour éviter les suppressions accidentelles»:Si le lien d'installation ci-dessus ne fonctionne pas, utilisez-le à la
sudo apt install safe-rm
place. La configuration par défaut contient déjà les répertoires système, essayonsrm /*
par exemple: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_photos
répertoire, ajoutez simplement son chemin absolu avec le tilde résolu danssafe-rm
le fichier de configuration de/etc/safe-rm.conf
, par exemple:Pour les cas où vous exécutez
rm
sanssudo
1 et le-f
drapeau, c'est une bonne idée d' ajouter unalias
pour votre shell qui faitrm
du-i
drapeau par défaut. De cette façon,rm
demande chaque fichier avant de le supprimer:Un indicateur
-I
tout 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":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:
sudo
Ignore les alias , on peut travailler autour de ce en définissantalias sudo='sudo '
bienla source
La confirmation est déjà là, le problème est
-f
dans 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:
C'est différent avec l'
--force
option: 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
man
commande (même si la commande se trouve dans un tutoriel) pour des exemples: la première fois que j'ai vu la commandetar xzf some.tar.gz
je me pose la question "qu'est-ce que celaxzf
signifie? "J'ai ensuite lu la page de manuel tar et je l'ai découverte.
la source
-f
fallait supprimer les dossiers. J'ai même ouvert une invite pour confirmer et me plaindre mais j'ai appris que c'était juste-r
nécessaire. Je suppose que c'estrm -rf
devenu 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'utilisationrm -r
de 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).rm
ne 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 besoinrm
de demander une confirmation, vous devez passer le-i
paramètre. Par exemple:rm -ir ./*
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:
rm='rm -I'
pour demander si vous supprimez plus de 3 éléments.mv -i
etcp -i
(de nombreux cas d'utilisation normaux n'impliquent pas l' écrasement d'un fichier de destination).sudo='sudo '
pour faire l'expansion d'alias sur le premier argumentsudo
Je trouve que
rm -I
c'est beaucoup plus utile querm -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\rm
pour 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 -i
ou-I
alias 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 manuellementrm -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 unerm -r
fois que vous avez fini de taper. Ainsi, la ligne de commande ne contient jamais derm -rf ~/
commandes dangereuses similaires à aucun moment. Vous "l'armez" seulement en changeantls
enrm
avec control-a, alt-d pour aller au début de la ligne et en ajoutant le-r
ou le-f
après avoir fini de taper la~/some/sub/dir/
partie de la commande.Selon ce que vous supprimez, exécutez réellement le
ls -d
premier, ou non si cela n'ajoute rien à ce que vous voyez avec la tabulation. Vous pouvez commencer parrm
(sans-r
ou-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,
-rf
sauf 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
sudo
commande. Surtout si vous n'avez pas de sauvegardes complètes, ou que ce serait un mauvais moment pour les restaurer.la source
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
Je suppose que vous pourriez ajouter un alias ou une fonction pour vous assurer que cela ne pourra jamais être exécuté.
la source
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.
la source
rm
par dessafe-rm
aides, au moins..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.chroot
serait d'utiliser quelque chose comme Docker (que je pense en fait utilisechroot
sous les couvertures). Pour les autres fichiers que vous avez juste besoin de lire, montez un système de fichiers en lecture seule.rm
est 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 avecsudo
et ne pensent pas beaucoup à l'utiliser. Les fonctions qui modifient directement les fichiers commerm
,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.
la source