Řešení 1:
Jeden z triků, které následuji, je vložit #
na začátku při použití rm
příkaz.
[email protected]:~# #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 *
:
[email protected]:~$ touch {1..4}
[email protected]:~$ touch -- -i
[email protected]:~$ ls
1 2 3 4 -i
[email protected]:~$ 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.