Comment éviter une erreur rm -rf pour des dossiers spécifiques?

8

Je pense que la plupart des gens ici par erreur ' rm -rf' ont édité le mauvais répertoire, et j'espère que cela n'a pas causé d'énormes dégâts .. Existe-t-il un moyen d'empêcher les utilisateurs de faire une histoire d'horreur Unix similaire ?? Quelqu'un a mentionné (dans la section des commentaires du lien précédent ) que

... Je suis presque sûr maintenant que chaque cours ou entreprise Unix utilise unix définit rm -fr pour désactiver les comptes des personnes qui essaient de l'exécuter ou les empêcher de l'exécuter ...

Y a-t-il une implémentation de cela dans une distribution Unix ou Linux actuelle? Et quelle est la pratique courante pour empêcher cette erreur même à partir d'un administrateur système (avec accès root)?

Il semble qu'il y avait une certaine protection pour le répertoire racine ( /) dans Solaris (depuis 2005) et GNU (depuis 2006). Y a-t-il de toute façon à implémenter la même manière de protection à certains autres dossiers?

Pour plus de clarté, je ne demandais pas de conseils généraux sur l' rmutilisation (et j'ai mis à jour le titre pour en indiquer plus), je veux quelque chose de plus comme la protection du dossier racine: pour que rm -rf /vous deviez passer un paramètre spécifique: rm -rf --no-preserve-root /.. Existe-t-il des implémentations similaires pour un ensemble personnalisé de répertoires? Ou puis-je spécifier des fichiers en plus /d'être protégés par l' option conserve-racine ?

amyassin
la source
11
1) Gestion du changement 2) Sauvegardes.
mattdm
6
la seule façon serait probablement de remplacer la rmcommande par une qui ne possède pas cette fonctionnalité.
Keith
2
safe-rm peut - être
sr_
2
la plupart des distributions font `alias rm = 'rm -i' ce qui fait que rm vous demande si vous êtes sûr. en plus de cela: sachez ce que vous faites. devenir root uniquement si nécessaire. pour tout utilisateur disposant de privilèges root, la sécurité de tout type doit être implémentée dans et par l'utilisateur. embaucher quelqu'un si vous ne pouvez pas le faire vous-même. Au fil du temps, toute contre-mesure devient équivalente à la ligne d'alias ci-dessus si vous ne pouvez pas vous occuper du problème.
Bananguin
1
L'utilisation de @amyassin rm -rfpeut être un événement générateur de CV. Vérifiez et revérifiez avant de l'exécuter
minuit

Réponses:

15

Pour éviter une erreur rm -rf, ne tapez pasrm -rf .

Si vous devez supprimer une arborescence de répertoires, je recommande le workflow suivant:

  • Si nécessaire, passez au parent du répertoire que vous souhaitez supprimer.
  • mv directory-to-delete DELETE
  • Explorez DELETEet vérifiez que c'est bien ce que vous vouliez supprimer
  • rm -rf DELETE

N'appelez jamais rm -rfavec un argument autre que DELETE. Effectuer la suppression en plusieurs étapes vous donne la possibilité de vérifier que vous ne supprimez pas la mauvaise chose, soit à cause d'une faute de frappe (comme dans rm -rf /foo /barau lieu de rm -rf /foo/bar) ou à cause d'un braino (oups, non, je voulais supprimer foo.oldet conserver foo.new) .

Si votre problème est que vous ne pouvez pas faire confiance aux autres pour ne pas taper rm -rf, pensez à supprimer leurs privilèges d'administrateur. Il y a beaucoup plus de choses qui peuvent mal tourner rm.


Effectuez toujours des sauvegardes .

Vérifiez régulièrement que vos sauvegardes fonctionnent et sont à jour.

Gardez tout ce qui ne peut pas être facilement téléchargé depuis un emplacement sous contrôle de version.


Avec un système Unix de base, si vous voulez vraiment rendre certains répertoires non supprimables par rm, remplacez (ou mieux shadow) rmpar un script personnalisé qui rejette certains arguments. Ou par hg rm.

Certaines variantes Unix offrent plus de possibilités.

  • Sur OSX, vous pouvez définir une liste de contrôle d'accès sur un répertoire empêchant la suppression des fichiers et sous-répertoires à l'intérieur, sans empêcher la création de nouvelles entrées ou la modification des entrées existantes: chmod +a 'group:everyone deny delete_child' somedir(cela n'empêche pas la suppression des fichiers dans les sous-répertoires: si vous le souhaitez, définissez également l'ACL dans le sous-répertoire).
  • Sous Linux, vous pouvez définir des règles dans SELinux, AppArmor ou d'autres cadres de sécurité qui interdisent rmde modifier certains répertoires.
Gilles 'SO- arrête d'être méchant'
la source
Oui, la sauvegarde est la solution la plus étonnante, mais je pensais à quelque chose comme l' --no-preserve-rootoption, pour un autre dossier important .. Et cela n'existe apparemment même pas en tant que pratique ...
amyassin
J'ai édité la question pour indiquer ce que je veux plus ...
amyassin
1
@amyassin J'ai bien peur qu'il n'y ait rien de plus (du moins pas sous Linux). rm -rfsignifie déjà «supprimer ceci, oui je suis sûr de savoir ce que je fais». Si vous en voulez plus, remplacez-le rmpar un script qui refuse de supprimer certains répertoires.
Gilles 'SO- arrête d'être méchant'
Veuillez modifier le dernier commentaire de la question car je pense qu'il répond bien à la question ...
amyassin
2
@amyassin En fait, je reprends cela. Il n'y a rien de plus sur un Linux traditionnel, mais vous pouvez définir des règles Apparmor / SELinux /… qui empêchent rmd'accéder à certains répertoires. De plus, puisque votre question ne concerne pas seulement Linux, j'aurais dû mentionner OSX, qui a quelque chose d'un peu comme ce que vous voulez.
Gilles 'SO- arrête d'être méchant'
4

Si vous utilisez rm *et le zsh, vous pouvez définir l'option rmstarwait:

setopt rmstarwait

Maintenant, le shell avertit lorsque vous utilisez *:

> zsh -f
> setopt rmstarwait
> touch a b c
> rm *
zsh: sure you want to delete all the files in /home/unixuser [yn]? _

Lorsque vous la rejetez ( n), rien ne se passe. Sinon, tous les fichiers seront supprimés.

qbi
la source
À quoi zsh -fsert-il?
James
3

Pour vous protéger contre un accident rm -rf *dans un répertoire, créez un fichier appelé "-i" (vous pouvez le faire avec emacs ou un autre programme) dans ce répertoire. Le shell essaiera d'interpréter -i et le fera passer en mode interactif.

Par exemple: Vous avez un répertoire appelé rmtestavec le fichier nommé à l' -iintérieur. Si vous essayez de rmtout dans le répertoire, vous y rmserez d'abord -itransféré et passerez en mode interactif. Si vous placez un tel fichier dans les répertoires sur lesquels vous souhaitez bénéficier d'une protection, cela peut être utile.

Notez que cela est inefficace contre rm -rf rmtest.

Silverrocker
la source
J'ai édité la question pour indiquer ce que je veux plus ...
amyassin
Super truc! Le fichier est facilement créé avec> -i
capitano666
2

MODIFIER comme suggéré par le commentaire:

Vous pouvez changer l'attribut de en immuable le fichier ou le répertoire et puis il ne peut pas être supprimé même par root tant que l'attribut n'est pas supprimé.

chattr +i /some/important/file

Cela signifie également que le fichier ne peut en aucun cas être écrit ou modifié, même par root . Un autre attribut apparemment disponible que je n'ai pas utilisé moi-même est l'attribut append ( chattr +a /some/important/file. Ensuite, le fichier ne peut être ouvert qu'en mode append, ce qui signifie également aucune suppression, mais vous pouvez y ajouter (par exemple un fichier journal). Cela signifie que vous vimpar exemple, vous ne pourrez pas le modifier , mais vous pouvez le faire echo 'this adds a line' >> /some/important/file. L'utilisation >au lieu de >>échouera.

Ces attributs peuvent être désactivés à l'aide d'un signe moins, c'est-à-dire chattr -i file

Sinon, si cela ne convient pas, une chose que je pratique est de toujours d' ls /some/dirabord, puis au lieu de retaper la commande, appuyez sur la flèche vers le haut CTL-A, puis supprimez le lset tapez mon rm -rfsi j'en ai besoin. Pas parfait, mais en regardant les résultats de ls, vous savez d'avance si c'est ce que vous vouliez.

Drake Clarris
la source
J'ai édité la question pour indiquer ce que je veux plus ...
amyassin
2

Si vous comprenez le langage de programmation C, je pense qu'il est possible de réécrire le code source rm et de faire un petit patch pour le noyau. J'ai vu cela sur un serveur et il était impossible de supprimer certains répertoires importants et lorsque vous tapez «rm -rf / direcotyr», il envoie un e-mail à sysadmin.

ValeriRangelov
la source
1

Un choix possible est d'arrêter rm -rfet de commencer à utiliser rm -ri. Le iparamètre supplémentaire est de s'assurer qu'il vous demande si vous êtes sûr de vouloir supprimer le fichier.

Votre meilleur pari serait probablement de créer un alias rm -ripour quelque chose de mémorable kill_it_with_fire. De cette façon, chaque fois que vous avez envie d'enlever quelque chose, allez-y et tuez-le avec le feu.

NlightNFotis
la source
1
J'aime le nom, mais ce n'est pas fexactement le contraire de l' ioption ?? Je l'ai essayé et j'ai quand même travaillé ...
amyassin
@amyassin Oui, c'est ça. Pour une sorte de mode étrange, je pensais que je n'avais que rlà-dedans. Je l'ai juste réparé.
NlightNFotis
J'ai édité la question pour indiquer ce que je veux plus ...
amyassin
-1

J'aime mettre le nom du répertoire en premier comme ceci:

$ rm /directoryname -rf
kieranwild
la source
5
cela viole les directives POSIX.
gelraen
J'ai édité la question pour indiquer ce que je veux plus ...
amyassin