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, cela ne m'a pas sauvé. Existe-t-il des sauvegardes automatiques pour cela?
Je n'étais pas root et j'ai annulé la commande immédiatement, mais il y avait des autorisations détendues quelque part ou quelque chose parce que j'ai remarqué que mon invite Bash était déjà cassée. Je ne veux pas compter sur les autorisations et ne pas être root (je pourrais faire la même erreur avec Sudo
), et je ne veux pas rechercher des bugs mystérieux à cause d'un fichier manquant quelque part dans le système, donc, les sauvegardes et Sudo
sont bonnes, 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 immergé dans cette tâche assez profondément, il n'y a plus de puissance cérébrale pour vérifier les indicateurs et les chemins, je ne pense même pas en termes de commandes et d'arguments, je pense en termes d'actions comme 'dir courant vide', différentes parties de mon cerveau les traduisent en commandes et parfois cela fait des erreurs. Je veux que l'ordinateur les corrige, au moins les dangereux.
L'une des astuces que je suis consiste à mettre #
au début lors de l'utilisation de la commande rm
.
root@localhost:~# #rm -rf /
Cela empêche l'exécution accidentelle de rm
sur le mauvais fichier/répertoire. Une fois vérifié, supprimez #
Depuis le début. Cette astuce fonctionne, car dans Bash un mot commençant par #
fait que ce mot et tous les caractères restants sur cette ligne sont ignorés. La commande est donc simplement ignorée.
[~ # ~] ou [~ # ~]
Si vous voulez empêcher tout répertoire important, il y a une autre astuce.
Créez 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 s'agrandir -i
à la ligne de commande, donc votre commande devient finalement rm -rf -i
. Ainsi, la commande demandera avant la suppression. Vous pouvez mettre ce fichier dans votre /
, /home/
, /etc/
, etc.
[~ # ~] ou [~ # ~]
Utilisation --preserve-root
en option pour rm
. Dans les rm
inclus dans les nouveaux packages coreutils
, cette option est la valeur par défaut.
--preserve-root
do not remove `/' (default)
[~ # ~] ou [~ # ~]
Utilisez safe-rm
Extrait du site web:
Safe-rm est un outil de sécurité destiné à empêcher la suppression accidentelle de fichiers importants en remplaçant/bin/rm par 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:
$ rm -rf /usr Skipping /usr
Ton problème:
J'ai juste exécuté rm -rf/* accidentellement, mais je voulais dire rm -rf ./* (remarquez l'étoile après la barre oblique).
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 créer de la confusion.
./*
signifie la même chose que *
, donc la commande ci-dessus est mieux écrite comme:
rm -rf *
Voici un problème connexe. Je vois souvent l'expression suivante, où quelqu'un a supposé que FOO
est défini sur quelque chose comme /home/puppies
. Je l'ai vu aujourd'hui, en fait, dans la documentation d'un grand fournisseur de logiciels.
rm -rf $FOO/
Mais si FOO
n'est pas défini, cela sera évalué à rm -rf /
, qui tentera de supprimer tous les fichiers de votre système. La barre oblique de fin n'est pas nécessaire, donc en pratique, ne l'utilisez pas.
Ce qui suit fera la même chose et est moins susceptible de corrompre votre système:
rm -rf $FOO
J'ai appris ces conseils à 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 a détruit un système. Les 4 autres administrateurs système ont regardé cela et ont dit: "Ouaip. Tout le monde le fait une fois. Voici maintenant votre support d'installation (36 disquettes). Va le réparer.
D'autres personnes recommandent ici des solutions telles que --preserve-root
et safe-rm
. Cependant, ces solutions ne sont pas présentes pour tous les variantes Un * xe et peuvent ne pas fonctionner sur Solaris, FreeBSD et MacOSX. En plus, safe-rm
requiert que vous installiez des packages supplémentaires sur chaque système Linux que vous utilisez. Si vous comptez sur safe-rm
, que se passe-t-il lorsque vous commencez un nouvel emploi et qu'ils n'ont pas safe-rm
installée? Ces outils sont une béquille, et il est préférable de s'appuyer sur des valeurs par défaut connues et d'améliorer vos habitudes de travail.
Puisque c'est sur "Serverfault", je voudrais dire ceci:
Si vous avez des dizaines de serveurs ou plus, avec une grande équipe d'administrateurs/utilisateurs, quelqu'un va rm -rf
ou chown
le mauvais répertoire.
Vous devez avoir un plan pour récupérer le service affecté avec le moins de MTTR possible.
Les meilleures solutions consistent à changer vos habitudes pour ne pas utiliser rm
directement.
Une approche consiste à exécuter echo rm -rf /stuff/with/wildcards*
première. 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 echo
.
Une autre approche consiste à limiter la commande echo
aux cas où il est évident de savoir ce que vous allez supprimer. Plutôt que de supprimer tous les fichiers d'un répertoire, supprimez le répertoire 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 supprimez enfin DELETE-foo
. Un avantage secondaire 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 tas de fichiers parce que vous avez besoin que le répertoire reste (car il doit toujours exister, ou parce que vous n'auriez pas l'autorisation de le recréer), déplacez les fichiers vers 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é.)
La suppression d'un répertoire de l'intérieur serait intéressante, car rm -rf .
est court et présente donc un faible risque de fautes de frappe. Les systèmes typiques ne vous permettent malheureusement pas de le faire. Vous pouvez rm -rf -- "$PWD"
au lieu de cela, avec un risque plus élevé de fautes de frappe mais la plupart d'entre elles conduisent à ne rien supprimer. Attention, cela laisse une commande dangereuse dans votre historique Shell.
Chaque fois que vous le pouvez, utilisez le contrôle de version. Vous n'avez pas rm
, vous cvs rm
ou autre chose, et cela ne peut pas être annulé.
Zsh a des options pour vous inviter avant d'exécuter rm
avec un argument qui répertorie tous les fichiers dans un répertoire: rm_star_silent
(activé par défaut) vous invite 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. Ceci est d'une utilité limitée si vous aviez l'intention de supprimer tous les fichiers d'un répertoire, car vous vous attendez déjà à l'invite. Il peut aider à prévenir les fautes de frappe comme rm foo *
pour rm foo*
.
Il existe de nombreuses autres solutions flottantes 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 sécurité dans votre attente d'une confirmation… et la prochaine chose que vous vais restaurer des sauvegardes.
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 alerter vos amis de la façon dont vous vous êtes presque humilié en essuyant votre disque dur avec rm -fr /*
en tant que root.
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 différentes astuces d'alias vous rendront faible. Et pire, ils vous rendront négligents. Apprenez à faire les choses dans le bon sens, arrêtez de dépendre des alias pour vous protéger. Un jour, vous vous enracinerez sur une boîte qui n'a pas vos roues d'entraînement et exploserez quelque chose.
Deuxièmement - lorsque vous avez des racines, 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 dans les deux sens, ralentir les choses et vérifier tous vos miroirs.
Troisièmement - Vous n'avez presque jamais vraiment devez rm -rf
- plus probablement vous voulez mv something something.bak
ou mkdir _trash && mv something _trash/
Quatrièmement - toujours ls
votre caractère générique avant rm
- Il n'y a rien de fou à regarder quelque chose avant de le détruire pour toujours.
Le moyen le plus simple de prévenir les accidents rm -rf /*
est pour éviter toute utilisation de la commande rm
! En fait, j'ai toujours été tenté d'exécuter rm /bin/rm
pour se débarrasser complètement de la commande! Non, je ne suis pas facétieux.
Utilisez plutôt -delete
option de la commande find
, mais avant de supprimer les fichiers, je recommande de prévisualiser les fichiers que vous supprimerez:
find | less
Notez que dans les versions modernes de find
si vous omettez le nom d'un répertoire, il utilisera implicitement le répertoire courant, donc ce qui précède est l'équivalent de:
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
Ainsi, non seulement find
plus sûr à utiliser, il est également plus expressif , donc si vous souhaitez supprimer uniquement certains fichiers dans une hiérarchie de répertoires qui correspondent à un modèle particulier, vous pouvez utiliser un expression comme celle-ci pour prévisualiser, 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 d'un rm
plus sûr, donc vous vous remercierez plus tard si vous prenez le temps d'apprendre à utiliser find
.
Oui: ne travaillez pas en tant que root et réfléchissez toujours à deux fois avant d'agir.
Jetez également un œil à quelque chose comme https://launchpad.net/safe-rm .
C'est la norme à moi spécifiquement pour les regexps 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 à quoi va correspondre l'expression rationnelle. Une fois que j'ai la sortie, je reviens avec l'édition en ligne de commande et je change echo
en rm -rf
. I jamais, jamais utiliser rm -rf
sur une expression rationnelle non testée.
La solution à ce problème consiste à effectuer des sauvegardes régulières. Chaque fois que vous produisez quelque chose que vous ne voulez pas risquer de perdre, sauvegardez-le. Si vous trouvez que la sauvegarde régulière est trop douloureuse, simplifiez le processus afin que ce ne soit pas douloureux.
Par exemple, si vous travaillez sur du code source, utilisez un outil comme git
pour mettre en miroir le code et conserver l'historique sur une autre machine. Si vous travaillez sur des documents, disposez d'un script qui rsync
s vos documents sur une autre machine.
Il semble que la meilleure façon de réduire ce risque soit d'avoir une suppression en deux étapes comme la plupart des interfaces graphiques. Autrement dit, remplacez rm par quelque chose qui déplace les choses vers un répertoire de corbeille (sur le même volume). Ensuite, nettoyez cette poubelle après suffisamment de temps pour remarquer une erreur.
Un tel utilitaire, trash-cli, est discuté sur Unix StackExchange, ici .
Lorsque je supprime un répertoire récursivement, je mets le -r
, et -f
le cas échéant, à la fin de la commande, par ex. rm /foo/bar -rf
. De cette façon, si j'appuie accidentellement trop tôt sur Entrée, sans avoir encore tapé le chemin complet, la commande n'est pas récursive, donc elle est probablement inoffensive. Si je heurte Enter en essayant de taper la barre oblique après /foo
, J'ai écris rm /foo
plutôt que rm -rf /foo
.
Cela fonctionne bien sur les systèmes utilisant les coreutils GNU, mais les utilitaires sur certains autres Unix ne permettent pas de placer des options à la fin comme ça. Heureusement, je n'utilise pas de tels systèmes très souvent.
Un facteur clé important pour éviter ce type d'erreurs est de ne pas se connecter en utilisant le compte root. Lorsque vous vous connectez à l'aide d'un utilisateur normal non privilégié, vous devez utiliser Sudo
pour chaque commande. Donc, vous devriez être plus prudent.
Évitez d'utiliser globbing . Dans Bash, vous pouvez définir noglob
. Mais encore une fois, lorsque vous passez à un système où noglob
n'est pas défini, vous pouvez l'oublier et procéder comme si c'était le cas.
Définissez noclobber
pour éviter que mv
et cp
ne détruisent également les fichiers.
Utilisez un navigateur de fichiers pour la suppression. Certains navigateurs de fichiers proposent une corbeille (par exemple, Konqueror ).
Une autre façon d'éviter le globbing est de suivre. Sur la ligne de commande, je echo filenamepattern >> xxx
. Ensuite, je modifie le fichier avec Vim ou vi pour vérifier quels fichiers doivent être supprimés (surveillez les caractères de modèle de nom de fichier dans filenmates.), Puis utilisez %s/^/rm -f/
pour transformer chaque ligne en une commande de suppression. Source xxx. De cette façon, vous voyez chaque fichier qui va être supprimé avant de le faire.
Déplacez les fichiers vers un répertoire "grenier" ou tarball. Ou utilisez le contrôle de version (comme dit avant moi).
Le ZSH me demande (par défaut) avant d'effectuer un rm -rf *
.
Cela peut être compliqué, mais vous pouvez configurer rôles dans SELinux afin que même si l'utilisateur devient root via Sudo su ou plain su), la possibilité de supprimer des fichiers peut être limitée (vous devez vous connecter directement en tant que root pour supprimer les fichiers). Si vous utilisez AppArmor, vous pouvez faire quelque chose --- (similaire .
Bien sûr, l'autre solution serait de vous assurer que vous disposez de sauvegardes. :)
Mon processus de suppression sur les machines basées sur Unix est le suivant.
ls /path/to/intented/file_or_directory
dans la fenêtre du terminal, puis appuyez sur return
(ou Tab
, comme vous le souhaitez) pour afficher la liste des fichiers.Si tout semble bon,
clique le up arrow
clé pour apporter ls /path/to/intented/file_or_directory
à partir de l'historique du terminal.
remplacez ls
par rm
ou rm -r
ou rm -rf
, comme demandé. Personnellement, je n'aime pas utiliser -f
drapeau.
Ce processus de validation empêche également l'exécution prématurée de la commande rm
, ce qui m'est arrivé avant que je ne commence à suivre ce processus.
J'aime l'approche Windows de la corbeille.
Je crée généralement un répertoire nommé "/ tmp/recyclebin" pour tout ce que je dois supprimer:
mkdir /tmp/recyclebin
Et n'utilisez jamais rm -rf, j'utilise toujours:
mv target_folder /tmp/recyclebin
Plus tard, je vide la corbeille à l'aide d'un script ou manuellement.
Si vous n'êtes pas d'humeur à acquérir de nouvelles habitudes dès maintenant, .bashrc/.profile
est un bon endroit pour ajouter des tests pour vérifier si vous êtes sur le point de faire quelque chose de stupide. J'ai pensé dans une fonction Bash que je pouvais chercher un motif qui pourrait ruiner ma journée et j'ai trouvé ceci:
alias rm='set -f; myrm' #set -f turns off wildcard expansion need to do it outside of
#the function so that we get the "raw" string.
myrm() {
ARGV="$*"
set +f #opposite of set -f
if echo "$ARGV" | grep -e '-rf /*' \
-e 'another scary pattern'
then
echo "Do Not Operate Heavy Machinery while under the influence of this medication"
return 1
else
/bin/rm $@
fi
}
La bonne chose à ce sujet est que ce n'est que Bash.
Ce n'est clairement pas assez générique sous cette forme, mais je pense qu'il a du potentiel, alors veuillez poster quelques idées ou commentaires.
J'utilise habituellement le -v
drapeau pour voir ce qui est supprimé et avoir une chance de ^C
rapidement si j'ai le moindre doute. Pas vraiment un moyen de prévenir mauvais rm
, mais cela peut être utile pour limiter les dégâts en cas de problème.
Quelques alias de sécurité pour d'autres commandes, pour éviter des catastrophes similaires, trouvés ici :
# safety features
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -I' # 'rm -i' prompts for every file
alias ln='ln -i'
alias chown='chown --preserve-root'
alias chmod='chmod --preserve-root'
alias chgrp='chgrp --preserve-root'
Remarquez les majuscules -I
, c'est différent de -i
:
Demander une fois avant de supprimer plus de trois fichiers ou lors de la suppression récursive. Moins intrusif que -i, tout en offrant une protection contre la plupart des erreurs
En dehors de chattr
, il n'y a pas beaucoup de garanties de laisser root exécuter une telle commande. C'est pourquoi les groupes appropriés et les commandes prudentes sont importants lors de l'exécution de privilèges.
La prochaine fois; délimitez les fichiers que vous prévoyez de supprimer - omettez "f" de rm -rf
, ou utilisez find
et passez-le à xargs rm
Malheureusement, je ne peux pas laisser de commentaire ci-dessus en raison d'un karma insuffisant, mais je voulais avertir les autres que Safe-rm n'est pas une panacée pour les cauchemars de suppression de masse accidentelle.
Ce qui suit a été testé sur une machine virtuelle Linux Mint 17.1 (avertissement à ceux qui ne connaissent pas ces commandes: NE FAITES PAS CECI! En fait, même ceux qui connaissent ces commandes ne devraient/ne devraient probablement jamais le faire pour éviter une perte de données catastrophique):
Version texte (condensée):
$ cd /
$ Sudo safe-rm -rf *
$ ls
bash: /bin/ls: No such file or directory
Version d'image (complète):
J'ai simplement fait mon propre script qui peut simplement avertir et demander une confirmation pour chaque type de situation, à vous de voir comment l'améliorer
#!/bin/sh
# just Sudo mv /usr/bin/rm to /usr/bin/rm-original
path=${!#}
color_yel="\x1b[1;33m"
color_rst="\x1b[0m"
function get_yn() {
read i
if [ "$i" != "y" ]; then echo "aborted."; exit 1; fi
}
if [ -d ${path} ]; then
echo -e "${color_yel}You are deleting a folder, it's potentially dangerous, are you sure (y/n) ?${col>
get_yn
/usr/bin/rm-original $@
fi
Idée supplémentaire pour l'améliorer:
Un simple script personnalisable permet donc d'avoir un comportement particulier et d'éviter l'installation de tout package supplémentaire.
Avec quelques connaissances bash, vous ne pouvez jeter que certains types de choses.
Je pense que c'est une astuce de prévention puissante, avec * un raccourci d'expansion dans Shell:
Tout d'abord, tapez rm -rf *
ou rm -rf your/path/*
, NE tapez PAS la touche Enter
. (bien sûr, vous devez prendre l'habitude de ne pas appuyer sur Entrée rapidement/accidentellement lorsque vous utilisez rm -rf
)
Puis appuyez Alt-Shift-8
(c'est à dire. Alt-Shift-*
) pour développer explicitement le caractère générique "*" dans bash. Cela évite également de ressaisir une commande "rm -rf *" lors de la navigation dans l'historique.
Enfin, après avoir vérifié que l'extension possède les bons fichiers/répertoires, appuyez sur Entrée.
Terminé.
Au cas où cela aiderait quelqu'un pour son propre cas:
rmsafe
:Il déplace les fichiers vers un dossier "corbeille" et vous avez toujours la possibilité de les ramener avec un simple mv
:
$ rmsafe /path/to/important/files
Source: https://github.com/pendashteh/rmsafe
safe
:Vous pouvez définir un alias pour rm
en utilisant le coffre-fort:
$ alias rm="safe rm"
Maintenant, si vous exécutez rm /*
vous obtenez ceci en réponse:
$ rm /*
Are you sure you want to 'rm /bin /boot /data /dev /etc /home /initrd.img /lib /lib64 /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var'? [y/n]
et je crois que vous ne taperez pas y
!
De plus, non pas comme sauvegarde, mais comme moyen de savoir quels fichiers ont été supprimés avant d'appuyer sur ^ C, vous pouvez utiliser la base de données locate
(bien sûr uniquement si elle a été installée et a survécu rm
)
Je l'ai appris de cela article de blog
Hehe (non testé et quelque peu facétieux!):
$ cat /usr/local/bin/saferm
#! /bin/bash
/bin/ls -- "$@"
echo "Those be the files you're about to delete."
echo "Do you want to proceed (y/N)?"
read userresponse
if [ "$userresponse" -eq "y" ]; then
echo "Executing...."
/bin/rm -- "$@"
fi
Et alors:
alias rm="/usr/local/bin/saferm"
De manière réaliste, vous devriez avoir une pause mentale avant d'exécuter ce type d'opération avec un glob, que vous exécutiez en tant que root, en y ajoutant "Sudo", etc. Vous pouvez exécuter un "ls" sur le même glob, etc., mais, mentalement, vous devez vous arrêter pendant une seconde, assurez-vous d'avoir tapé ce que vous vouliez, assurez-vous que ce que vous voulez est bien ce que vous voulez, etc. Je suppose que c'est quelque chose qui est principalement appris en détruisant quelque chose la première année un Unix SA, de la même manière que le brûleur chaud est un bon professeur pour vous dire que quelque chose sur le poêle peut être chaud.
Et assurez-vous d'avoir de bonnes sauvegardes!
Utilisez simplement ZFS pour stocker les fichiers dont vous avez besoin pour résister à une suppression accidentelle et avoir un démon qui:
Si des fichiers sont supprimés, écrasés, corrompus, peu importe, restaurez simplement votre système de fichiers en un clone du dernier bon instantané et vous avez terminé.
pas tant une réponse mais une astuce, je fais toujours rm (dir) -rf
pas rm -rf (dir)
c'est-à-dire: ne devenez pas nucléaire jusqu'au dernier moment possible.
Il aide à atténuer les situations dans lesquelles vous touchez le nom du répertoire de manière à ce qu'il s'agisse toujours d'une suppression valide, comme glisser et appuyer sur la touche Entrée.