Řešení 1:
Jeden z triků, které následuji, je vložit # na začátku při použití rm příkaz.
example@unixlinux.online:~# #rm -rf /
Tím se zabrání náhodnému spuštění rm ve špatném souboru/adresáři. Po ověření odeberte # od začátku. Tento trik funguje, protože v Bash je slovo začínající # způsobí, že toto slovo a všechny zbývající znaky na tomto řádku budou ignorovány. Příkaz je tedy jednoduše ignorován.
NEBO
Pokud chcete zabránit jakémukoli důležitému adresáři, existuje ještě jeden trik.
Vytvořte soubor s názvem -i v tom adresáři. Jak lze vytvořit takový zvláštní soubor? Pomocí touch -- -i nebo touch ./-i
Nyní zkuste rm -rf * :
example@unixlinux.online:~$ touch {1..4}
example@unixlinux.online:~$ touch -- -i
example@unixlinux.online:~$ ls
1 2 3 4 -i
example@unixlinux.online:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'?
Zde je * rozbalí -i na příkazový řádek, takže váš příkaz se nakonec změní na rm -rf -i . Příkaz se tedy zobrazí před odstraněním. Tento soubor můžete vložit do / , /home/ , /etc/ , atd.
NEBO
Použijte --preserve-root jako možnost rm . V rm zahrnuto v novějších coreutils balíčků, tato možnost je výchozí.
--preserve-root
do not remove `/' (default)
NEBO
Použijte safe-rm
Výňatek z webové stránky:
Safe-rm je bezpečnostní nástroj, který má zabránit náhodnému smazání důležitých souborů nahrazením /bin/rm obalem, který porovná dané argumenty s konfigurovatelnou černou listinou souborů a adresářů, které by nikdy neměly být odstraněny.
Uživatelé, kteří se pokusí smazat jeden z těchto chráněných souborů nebo adresářů, tak nebudou moci učinit a místo toho se jim zobrazí varovné hlášení:
$ rm -rf /usr Skipping /usr
Řešení 2:
Váš problém:
Právě jsem omylem spustil rm -rf /*, ale myslel jsem rm -rf ./* (všimněte si hvězdičky za lomítkem).
Řešení:Nedělejte to! Z praxe nepoužívejte ./ na začátku cesty. Lomítka nepřidávají příkazu žádnou hodnotu a způsobí pouze zmatek.
./* znamená totéž jako * , takže výše uvedený příkaz je lepší napsat jako:
rm -rf *
Zde je související problém. Často vidím následující výraz, kde někdo předpokládal, že FOO je nastaveno na něco jako /home/puppies . Viděl jsem to vlastně právě dnes, v dokumentaci od významného dodavatele softwaru.
rm -rf $FOO/
Ale pokud FOO není nastaveno, bude to vyhodnoceno jako rm -rf / , který se pokusí odstranit všechny soubory ve vašem systému. Koncové lomítko je zbytečné, takže jej z praxe nepoužívejte.
Následující způsob udělá totéž a je méně pravděpodobné, že poškodí váš systém:
rm -rf $FOO
Naučil jsem se tyto tipy tvrdě. Když jsem před 14 lety měl svůj první superuživatelský účet, omylem jsem spustil rm -rf $FOO/ ze skriptu shellu a zničil systém. Ostatní 4 systémoví správci se na to podívali a řekli:„Ano. Každý to jednou udělá. Nyní zde máte instalační médium (36 disket). Jdi to opravit.'
Ostatní lidé zde doporučují řešení jako --preserve-root a safe-rm . Tato řešení však nejsou k dispozici pro všechny varianty Un*xe a nemusí fungovat na systémech Solaris, FreeBSD a MacOSX. Kromě toho safe-rm vyžaduje, abyste nainstalovali další balíčky na každý jednotlivý systém Linux, který používáte. Pokud se spoléháte na safe-rm , co se stane, když začnete novou zakázku a oni nemají safe-rm nainstalováno? Tyto nástroje představují berličku a je mnohem lepší spoléhat se na známé výchozí hodnoty a zlepšit své pracovní návyky.
Řešení 3:
Protože je to na "Serverfault", rád bych řekl toto:
Pokud máte desítky nebo více serverů, s velkým týmem administrátorů/uživatelů, někdo přejde na rm -rf nebo chown nesprávný adresář.
Měli byste mít plán, jak postiženou službu obnovit s co nejmenší MTTR.
Řešení 4:
Nejlepším řešením je změnit své návyky a nepoužívat rm přímo.
Jedním z přístupů je spuštění echo rm -rf /stuff/with/wildcards* První. Zkontrolujte, zda výstup ze zástupných znaků vypadá rozumně, a poté použijte historii shellu k provedení předchozího příkazu bez echo .
Dalším přístupem je omezení echo příkaz k případům, kdy je oslnivě zřejmé, co budete mazat. Namísto odstranění všech souborů v adresáři odstraňte adresář a vytvořte nový. Dobrou metodou je přejmenovat existující adresář na DELETE-foo a poté vytvořte nový adresář foo s příslušnými oprávněními a nakonec odstraňte DELETE-foo . Vedlejší výhodou této metody je, že příkaz, který je zapsán do vaší historie, je 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
Pokud opravdu trváte na smazání hromady souborů, protože potřebujete, aby adresář zůstal (protože musí vždy existovat, nebo protože byste neměli oprávnění jej znovu vytvořit), přesuňte soubory do jiného adresáře a smažte tento adresář. .
mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME
(Stiskněte Alt +. klíč.)
Smazání adresáře zevnitř by bylo atraktivní, protože rm -rf . je krátká, a proto má nízké riziko překlepů. Typické systémy vám to bohužel neumožňují. Můžete na rm -rf -- "$PWD" místo toho s vyšším rizikem překlepů, ale většina z nich nevede k odstranění ničeho. Dejte si pozor, že to zanechá nebezpečný příkaz ve vaší historii shellu.
Kdykoli můžete, použijte správu verzí. Nemáte rm , vy cvs rm nebo cokoli jiného, a to je nevratné.
Zsh má možnosti, jak vás před spuštěním rm vyzvat s argumentem, který uvádí všechny soubory v adresáři:rm_star_silent (ve výchozím nastavení zapnuto) zobrazí výzvu před provedením rm whatever/* a rm_star_wait (ve výchozím nastavení vypnuto) přidá 10sekundovou prodlevu, během níž nemůžete potvrdit. To má omezené použití, pokud jste zamýšleli odstranit všechny soubory v některém adresáři, protože výzvu již očekáváte. Může pomoci zabránit překlepům, jako je rm foo * pro rm foo* .
Existuje mnoho dalších řešení, která zahrnují změnu rm příkaz. Omezení tohoto přístupu je, že jednoho dne budete na počítači se skutečným rm a automaticky zavoláte rm , v bezpečí v očekávání potvrzení... a další věc, kterou budete obnovovat ze záloh.
Řešení 5:
Vždy můžete udělat alias, jak jste zmínil:
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"
Můžete jej také integrovat s twitterovým klientem příkazového řádku a upozornit své přátele na to, jak jste se málem ponížili vymazáním pevného disku pomocí rm -fr /* jako kořen.