Як запобігти випадковій rm -rf / *?


164

Я просто побіг rm -rf /*випадково, але мав на увазі rm -rf ./*(помітити зірку після косої риси).

alias rm='rm -i'і --preserve-rootза замовчуванням мене не врятували, тож чи є якісь автоматичні гарантії для цього?


Я не вкоренився і скасував команду одразу, але десь були розслаблені дозволи чи щось, тому що я помітив, що мій рядок Bash вже зламався. Я не хочу покладатися на дозволи та не мати root (я можу зробити таку ж помилку з sudo), і я не хочу полювати на таємничі помилки через один файл, який відсутній десь у системі, тому резервні копії та sudoхороші , але я хотів би чогось кращого для цього конкретного випадку.


Про те, що думати двічі і використовувати мозок. Я його фактично використовую! Але я використовую це для вирішення якоїсь складної задачі програмування, що включає 10 різних речей. Я занурений у цю задачу досить глибоко, не залишається жодної сили мозку для перевірки прапорів і шляхів, я навіть не думаю в плані команд і аргументів, я думаю, що в таких діях, як "порожній поточний рейтинг", інша частина мого мозку перекладає їх на команди, а іноді робить помилки. Я хочу, щоб комп’ютер їх виправляв, принаймні небезпечні.


13
FYI, ти також можеш робити rm -rf . /mydirзамість цього rm -rf ./mydirі вбивати те, в якому каталозі ти знаходився. Я вважаю, що це трапляється частіше.
user606723

27
Щоб застосувати аналогію пістолета, у цьому питанні сказано, будь ласка, дайте пістолету визнати, що я націлююсь на ногу, а не на вогонь, але я не хочу брати відповідальності за те, щоб в першу чергу не націлити пістолет на ногу. Пістолети та комп’ютери - дурні, і якщо ти зробиш дурну справу, то отримаєш ці результати. Слідуючи аналогії пістолета, нічого не убереже вас від шкоди, крім пильності та практики.
slillibri

73
@slillibri Окрім того, що rmце не пістолет, це комп’ютерна програма, це може бути досить розумним, щоб визначити, що користувач збирається видалити деякі важливі файли та видати попередження (як це є насправді, якщо ви намагаєтесь обійтися rm -rf /без зірки).
Валентин Нємцев

80
@slillibri Guns мають безпеку. Запитання про те, як забезпечити кращу безпеку для rmкоманди - це цілком законне питання систематичного управління.
Жиль

21
sudo rm / bin / rm не рекомендується, але запобіжить більшості rm :-)
Павло

Відповіді:


220

Один із хитрощів, яких я дотримуюся, - це ставити #на початку, використовуючи rmкоманду.

root@localhost:~# #rm -rf /

Це запобігає випадковому виконанню rmнеправильного файлу / каталогу. Після перевірки видаліть #спочатку. Цей трюк працює, тому що в Bash слово, що починається з, #викликає ігнорування цього слова та всіх решти символів у цьому рядку. Отже команду просто ігнорують.

АБО

Якщо ви хочете запобігти будь-якому важливому каталогу, є ще одна хитрість.

Створіть файл, названий -iу цьому каталозі. Як можна створити такий непарний файл? Використання touch -- -iабоtouch ./-i

Тепер спробуйте 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'? 

Тут команда *розшириться -iдо командного рядка, тому ваша команда в кінцевому підсумку стане rm -rf -i. Таким чином команда підкаже перед видаленням. Ви можете помістити цей файл у вашому /, /home/, /etc/і т.д.

АБО

Використовувати --preserve-rootяк варіант для rm. Для rmвключених у новіші coreutilsпакети цей параметр є типовим.

--preserve-root
              do not remove `/' (default)

АБО

Використовуйте сейф-rm

Витяг з веб-сайту:

Safe-rm - це інструмент безпеки, покликаний запобігти випадковому видаленню важливих файлів, замінивши / bin / rm на обгортку, яка перевіряє задані аргументи на налаштований чорний список файлів і каталогів, які ніколи не слід видаляти.

Користувачі, які намагаються видалити один із цих захищених файлів або каталогів, не зможуть це зробити, і натомість з’явиться попереджувальне повідомлення:

$ rm -rf /usr
Skipping /usr

10
safe-rm виглядає дуже гарно, зараз його
вивчаємо

45
safe-rm охайний. Також це чудовий трюк з -iфайлом. Ха-ха. Дурний баш.
EricR

5
Дивовижно, яке своєрідне хитрість робиться в Unix.
WernerCD

4
Файл, який називається -i, - абсолютно чистий геній. Я міг би використати це близько року тому, коли я випадково запустив rm -rf / etc / * на VPS ... (на щастя, я роблю нічні знімки, тому зміг відновитись за 45 хвилин).
David W

9
Це геній. Чарівництво було бtouch -- -rf
Мірча Вутковичі

46

Твоя проблема:

Я щойно пробіг rm -rf / * випадково, але мав на увазі rm -rf ./* (зауважте зірку після косої риси).

Рішення: Не робіть цього! Як правило, не використовуйте ./на початку шляху. Штрихи не додають значення команді і спричинять лише плутанину.

./*означає те саме, що *, тому вищезгадану команду краще записати як:

rm -rf *

Ось пов’язана проблема. Я часто бачу такий вираз, коли хтось припускає, що FOOце встановлено на щось подібне /home/puppies. Я бачив це саме сьогодні фактично в документації від великого постачальника програмного забезпечення.

rm -rf $FOO/

Але якщо FOOце не встановлено, це буде визначено rm -rf /, що спробує видалити всі файли у вашій системі. Косою косою рисою не потрібно, тому в практиці не використовуйте її.

Наступне зробить те ж саме, і менше шансів пошкодити вашу систему:

rm -rf $FOO

Ці поради я навчився важко. Коли у мене був перший обліковий запис суперпользователя 14 років тому, я випадково вибіг rm -rf $FOO/із сценарію оболонки і знищив систему. 4 інші сисадміни подивились на це і сказали: "Так. Усі роблять це один раз. Тепер ось ваш інсталяційний носій (36 дискети). Іди виправляй ».

Інші люди рекомендують такі рішення, як --preserve-rootі safe-rm. Однак ці рішення відсутні для всіх Un * xe-варіантів і можуть не працювати на Solaris, FreeBSD та MacOSX. Крім того, safe-rmпотрібно встановити додаткові пакети на кожній окремій системі Linux, яку ви використовуєте. Якщо ви покладаєтесь на safe-rmте, що відбувається, коли ви починаєте нову роботу, і вони не safe-rmвстановлені? Ці інструменти є милицею, і набагато краще покладатися на відомі за замовчуванням та вдосконалювати свої робочі звички.


19
Мій друг сказав мені, що він ніколи не використовує rm -rf *. Він завжди спочатку змінює каталог і використовує конкретну ціль. Причина полягає в тому, що він багато використовує історію оболонки, і він переживає, що мати таку команду в своїй історії може спливати в неправильний час.
haggai_e

@haggai_e: Гарна порада. Коли я був новаком в Unix, я побіг одного разу наткнувся на помилку, де rm -rf *також видалив .і ... Я корінь, і це потрапило в нижчі каталоги на зразок ../../.., і було досить руйнівним. Я намагаюся бути дуже обережним з rm -rf *тих пір.
Стефан Ласєвський

2
rm -rf $FOOне допоможе, якщо вам потрібно rm -rf $FOO/$BAR. cd $FOO && rm -rf $BARдопоможе, хоча це довше.
Віктор Сергієнко

5
@VictorSergienko, з bash, як щодо уточнення ${FOO:?}, як у rm -rf ${FOO:?}/і rm -rf ${FOO:?}/${BAR:?}. Це не дозволить йому будь-коли перетворитися на rm -rf /. Я маю ще трохи інформації про це у своїй відповіді тут .
Acumenus

@haggai_e: Я вважаю це одним із найкращих порад на цю тему. Я спалив палець, використовуючи rm -rf *цикл for, який помилково змінився в неправильний каталог і видалив щось інше. Якби я використав конкретну ціль, вона мала б набагато менший шанс видалити неправильну річ.
Richk

30

Оскільки це на "Serverfault", я хотів би сказати це:

Якщо у вас є десятки і більше серверів, з великою командою адміністраторів / користувачів, хтось збирається в rm -rfабо chownнеправильний каталог.

У вас повинен бути план повернення пошкодженої служби з мінімально можливим MTTR.


4
І вам слід скористатися машиною вільного зв'язку або запасною коробкою, щоб практикувати відновлення - дізнайтеся, що не працювало, і уточнити зазначений план. Ми потрапляємо на щотижневу перезавантаження - бо в нашій будівлі були втрати електроенергії, і кожен раз було боляче. Роблячи кілька запланованих відключень усіх стелажів, ми скоротили це з декількох днів роботи до приблизно 3 годин - кожен раз, коли ми дізнаємося, які біти автоматизувати / виправити сценарії init.d тощо.
Danny Staple

І спробуйте цю команду на VM. Це цікаво! Але спершу зробіть знімок.
Стефан Ласєвський

23

Найкращі рішення включають зміну звичок не використовувати rmбезпосередньо.

Один із підходів - це запустити echo rm -rf /stuff/with/wildcards*перший. Переконайтеся, що висновок з підстановних знаків виглядає розумним, а потім використовуйте історію оболонки для виконання попередньої команди без echo.

Інший підхід - обмежити echoкоманду випадками, коли сліпо очевидно, що ви будете видаляти. Замість того, щоб видаляти всі файли в каталозі, видаліть каталог і створіть новий. Хороший метод - перейменувати існуючий каталог у DELETE-foo, потім створити новий каталог fooз відповідними дозволами та, нарешті, видалити DELETE-foo. Побічною перевагою цього методу є те, що команда, введена у вашу історію, є 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

Якщо ви дійсно наполягаєте на видаленні купи файлів, тому що потрібен каталог, щоб він залишався (тому що він завжди повинен існувати або тому, що ви не мали б дозволу на його відтворення), перемістіть файли в інший каталог та видаліть цей каталог .

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

(Натисніть цю клавішу Alt+ ..)

Видалення каталогу зсередини було б привабливим, оскільки rm -rf .короткий, отже, малий ризик помилок друку. Типові системи, на жаль, не дозволяють цього робити. Ви можете, rm -rf -- "$PWD"замість цього, з більшим ризиком помилок, але більшість з них нічого не призводить до видалення. Будьте уважні, що це залишає небезпечну команду в історії вашої оболонки.

Коли можна, використовуйте контроль версій. Ви цього не зробите rm, ви cvs rmчи що завгодно, і це не можна.

Zsh має параметри запросити вас до запуску rmз аргументом, який перераховує всі файли в каталозі: rm_star_silent(за замовчуванням) запитує перед виконанням rm whatever/*, і rm_star_wait(вимкнено за замовчуванням) додає 10-секундну затримку, протягом якої ви не можете підтвердити. Це обмежене використання, якщо ви мали намір видалити всі файли в деякому каталозі, тому що ви вже очікуєте на запит. Це може допомогти запобігти помилки , як rm foo *для rm foo*.

Існує ще багато рішень, що плавають навколо, які передбачають зміну rmкоманди. Обмеженням цього підходу є те, що одного дня ви будете знаходитись на машині з реальним, rmі ви автоматично зателефонуєте rm, безпечні в очікуванні підтвердження… і наступне, що ви відновите резервні копії.


mv -t DELETE_ME -- *трохи дурніший.
Тобу

@Giles Не використовуйте rmбезпосередньо - це корисна порада! Ще кращою альтернативою є використання findкоманди .
aculich

І якщо вам потрібен каталог, який ви можете залишити, ви можете зробити це досить просто, використовуючи, find somedir -type f -deleteякий видалить усі файли в, somedirале залишить каталог і всі підкаталоги.
aculich

19

Ви завжди можете зробити псевдонім, як ви згадали:

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"

Ви також можете інтегрувати його з клієнтом Twitter twitter, щоб попередити своїх друзів про те, як ви майже принизили себе, витираючи жорсткий диск із rm -fr /*корінням.


3
+1 для telnet miku.acm.uiuc.edu
Алі

1
alias echo = "telnet miku.acm.uiuc.edu"
kubanczyk

Я не повинен бути достатньо старим в школі ... в чому значення telnet miku.acm.uiuc.edu?
Кайл Странд

Спробуйте це і з’ясуйте. Це не руйнує. Якщо ви настільки параноїчні, як і належить, біжіть у вітчизняній машині.
Naftuli Kay

3
-1 Ви не можете псевдоніми команд з пробілами в них, не кажучи вже / *, що є невірним іменем
xenithorb


15

Найпростіший спосіб запобігти випадковому rm -rf /*- уникнути будь-якого використання rmкоманди! Насправді я завжди спокусився бігти, rm /bin/rmщоб повністю позбутися команди! Ні, я не пильную.

Замість цього скористайтеся -deleteопцією findкоманди , але спочатку перед видаленням файлів рекомендую переглянути, які файли ви будете видаляти:

find | less

Зауважте, що в сучасних версіях, findякщо ви не залишите ім'я каталогу, воно буде неявно використовувати поточний каталог, тому вищевказане є еквівалентом:

find . | less

Коли ви впевнені, що це файли, які потрібно видалити, ви можете додати -deleteопцію:

find path/to/files -delete

Отже, не тільки find безпечніше використовувати, але і більш виразно , тому якщо ви хочете видалити лише певні файли в ієрархії каталогів, які відповідають певним шаблоном, ви можете використати такий вираз для попереднього перегляду, а потім видаліть файли:

find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete

Є багато вагомих причин, щоб навчитися та використовувати, findкрім просто безпечнішого rm, тому ви пізніше подякуєте собі, якщо знайдете час, щоб навчитися використовувати find.


Дуже цікава дискусія. Мені подобається ваш підхід і зробив невеликий фрагмент. Це дуже неефективно, оскільки дзвінки знаходять не більше 3 разів, але для мене це приємний початок: github.com/der-Daniel/fdel
Даніель Гітзел

14

У цій темі є кілька дійсно поганих порад, на щастя, більшість із них були проголошені.

Перш за все, коли вам потрібно вкоренитися, станьте root - sudo, і різні трюки з псевдонімом зроблять вас слабкими. А ще гірше, вони зроблять вас необережними. Навчіться робити справи правильно, зупиніться залежно від псевдонімів, щоб захистити вас. Одного разу ви приживетесь на коробці, у якій немає ваших тренувальних коліс, і щось підірвете.

По-друге - коли у вас є корінь, подумайте про себе, як керувати автобусом, повним шкільних дітей. Іноді можна піти на пісню по радіо, але інший раз потрібно дивитись обома способами, уповільнювати справи та перевіряти всі дзеркала.

По-третє - Навряд чи вам справді доведеться це робити rm -rf- швидше ви хочете mv something something.bakчи хочетеmkdir _trash && mv something _trash/

По-четверте - завжди lsваш підказник раніше rm- немає нічого божевільного в тому, щоб подивитися на щось, перш ніж зруйнувати його назавжди.


2
+1 для використання ls.
Сахін Дівекар

@eventi Я погоджуюсь, що в цій темі є страшні поради та некрасиві хаки. І це, безумовно, хороша ідея подивитися на щось, перш ніж знищити його, але є ще кращий спосіб зробити це за допомогою findкоманди .
aculich

Я не бачу, як знайти простіше чи безпечніше, але мені подобається ваш find . -name '*~'приклад. Моя думка, що lsв списку буде той самий глобус, який rmбуде використовуватись.
eventi

11

Це мій стандарт спеціально для регулярних виразів в контексті rm, але це врятувало б вас у цьому випадку.

Я завжди роблю echo foo*/[0-9]*{bar,baz}*перше, щоб побачити, що збігається регулярний вираз. Після отримання висновку я повертаюся назад з редагуванням командного рядка та зміною echoна rm -rf. Я ніколи, ніколи не використовую rm -rfна неперевіреному регулярному показі .



5
Добре, що я шукаю? Чи зазначаєте ви, що синтаксис regexp для відповідності файлів відрізняється (а іноді викликається іншим іменем) від того, що використовується в напр. Perl? Або якийсь інший момент, який я пропустив? Прошу вибачення за свою повільність думок, це найперше суботній ранок тут!
MadHatter

9
Ці речі, які ви називаєте "regexp", насправді є глобусами. Це не інший синтаксис регулярних виразів; це не регулярний вираз.
bukzor

1
Цей аргумент, безумовно, можна зробити; однак, із статті вікіпедії про регулярні вирази, я виявляю, що "Багато сучасних обчислювальних систем забезпечують символи підстановки у відповідності імен файлів з файлової системи. Це основна здатність багатьох оболонок командного рядка і також відома як глобалізація" - зауважте використання "також відомого як", що, як мені здається, вказує на те, що викликати маркери, що містять метахарактери, щоб відповідати одному або декільком іменам файлів regexps, не є помилковим. Я погоджуюся, що глобалізація - це кращий термін, оскільки він не означає нічого, крім використання регулярних виразів у відповідності імен файлів.
MadHatter

1
@MadHatter Також глобус, хоча і візуально дещо схожий, дуже семантично відрізняється від регулярних виразів. У регулярному вираженні значення *має дуже точне визначення під назвою Зірка Клейна, яка є одинарним оператором, який відповідає нулю або більше елементів набору, до якого він застосовується (у випадку регулярних виразів, символів або набору символів, що передують Клійн Стар), тоді як в глобулі поєднується *все, що випливає з цього шаблону. Вони семантично дуже різні, навіть якщо вони, схоже, мають подібний синтаксис.
aculich

9

Рішення цієї проблеми - регулярне резервне копіювання. Щоразу, коли ви виробляєте щось, чого не хочете ризикувати втратою, резервні копії. Якщо ви регулярно створюєте резервну копію занадто болісно, ​​спростіть процес, щоб не було боляче.

Наприклад, якщо ви працюєте над вихідним кодом, використовуйте такий інструмент, як gitдзеркальний код та зберігайте історію на іншій машині. Якщо ви працюєте над документами, майте сценарій, який містить rsyncваші документи на іншій машині.


Також може допомогти файлова система копіювання під час запису, така як btrfs. Ви можете легко налаштувати просте автоматичне обертання знімка, яке працює локально (крім зовнішньої резервної копії).
малте

6

Здається, найкращим способом зменшити цей ризик є двоступеневе видалення, як і більшість графічних інтерфейсів. Тобто замініть rm чимось, що переміщує речі до кошика для сміття (на тому самому томі). Потім очистіть сміття після того, як пройшло достатньо часу, щоб помітити будь-яку помилку.

Однією з таких утиліт, треш-клі, обговорюється на Unix StackExchange, тут .


Це перше, що я встановлюю на кожній машині. Це повинен бути інструментом видалення за замовчуванням, при цьому rm використовується лише тоді, коли вам потрібно щось абсолютно видалити зараз. Мені сумно, що він ще не злетів, але одного дня це станеться. Ймовірно, після дуже публічного екземпляра rm, що спричинив величезну проблему, яку неможливо було вирішити резервними копіями. Можливо, те, де час, необхідний для відновлення, грає величезний фактор.
Джеррі

+1 Після використання Linux протягом 20 років, я все ще думаю, що має бути певна поведінка для сміття rm.
Шова

3

Одним з важливих факторів, щоб уникнути подібних помилок, є не входити в систему за допомогою root-акаунта. Під час входу в систему, використовуючи звичайного непривілейованого користувача, потрібно використовувати sudoдля кожної команди. Отже, вам слід бути обережнішими.


4
Я не впевнений, що судо завадить щось подібне. Ви можете зробити те саме, що і OP, навіть якщо перед "rm" введете "sudo".
cjc

1
Згадується, що працює як root в
редакції

Якщо ви все ще не впевнені у використанні sudoта створенні резервних копій. Погляньте на цю сторінку: forum.synology.com/wiki/index.php/… . У ньому йдеться про створення кошика. Сподіваюся, це допомагає!
Халед

1
@Khaled Я використовую sudo та резервні копії, я просто хочу щось краще для цієї конкретної проблеми
Валентин Немцев

3

Коли я видаляю каталог рекурсивно, я кладу -r, і, -fякщо це можливо, наприкінці команди, наприклад rm /foo/bar -rf. Таким чином, якщо я випадково натискаю Enter занадто рано, ще не ввівши весь шлях, команда не є рекурсивною, тому, ймовірно, нешкідлива. Якщо я натискаю Enter, намагаючись ввести косу рису після /foo, я написав, rm /fooа не rm -rf /foo.

Це добре працює в системах, що використовують основні утиліти GNU, але утиліти деяких інших Unixes не дозволяють розміщувати параметри в кінці так. На щастя, я не використовую такі системи дуже часто.


2

Це може бути складним, але ви можете встановити ролі в SELinux, так що навіть якщо користувач отримує корінь через sudo su - (або звичайний su), можливість видалення файлів може бути обмежена (для видалення вам доведеться ввійти безпосередньо як root файли). Якщо ви використовуєте AppArmor, ви можете зробити щось подібне .

Звичайно, іншим рішенням було б переконатися, що у вас є резервні копії. :)


2

Уникайте використання глобуса . У Bash ви можете встановити noglob. Але знову ж таки, переходячи до системи, де noglobне встановлено, ви можете забути це і продовжувати так, ніби це було.

Встановіть noclobberдля запобігання mvта cpзнищення файлів також.

Використовуйте браузер файлів для видалення. Деякі браузери файлів пропонують кошик для сміття (наприклад, Konqueror ).

Ще один спосіб уникнути глобалізації - наступний. У командному рядку я echo filenamepattern >> xxx. Потім я редагую файл з Vim або vi, щоб перевірити, які файли потрібно видалити (слідкуйте за символами шаблону імен файлів у назви файлів), а потім використовую, %s/^/rm -f/щоб перетворити кожен рядок у команду видалення. Джерело ххх Таким чином ви бачите кожен файл, який буде видалений, перш ніж це зробити.

Перемістіть файли до «горищного» каталогу або тарболу. Або скористайтеся контролем версій (як говорилося раніше).


+1 для використання певного способу попереднього перегляду файлів перед їх видаленням, однак є більш прості та безпечні способи зробити це за допомогою findкоманди .
aculich


1

Поза межами chattr, існує не так багато гарантій, що дозволяють root виконувати таку команду. Ось чому належні групи та обережні команди важливі при пільговому виконанні.

Наступного разу; витягніть файли, які ви плануєте видалити - опустіть 'f' з rm -rfабо використовуйте findта передайте їхxargs rm


Це добре, що ви пропонуєте використовувати find, але я рекомендую більш безпечний спосіб його використання у своїй відповіді . Немає необхідності користуватися, xargs rmоскільки у всіх сучасних версіях findє -deleteможливість . Крім того , щоб безпечно використовувати xargs rmвам також потрібно використовувати find -print0і в xargs -0 rmіншому випадку ви будете мати проблеми , коли ви стикаєтеся речі , як імена файлів з пробілами.
aculich

Моя думка полягала не в нюансах щодо xargs, а скоріше з використанням знахідки спочатку, без видалення файлів, а потім продовження ..
thinice

Так, я вважаю, що розбір файлів за допомогою файлів findє гарною пропозицією, однак нюанси xargsважливі, якщо ви пропонуєте його використовувати, інакше це призводить до плутанини і розладу при зустрічі файлів з пробілами (чого уникає використання -deleteпараметра).
aculich

1

Деякі псевдоніми безпеки для інших команд, щоб запобігти подібним катастрофам, можна знайти тут :

# 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'

Зауважте -I, що вона велика , вона відрізняється від -i:

запит один раз перед видаленням більше трьох файлів або при рекурсивному видаленні. Менш нав'язливий, ніж -i, але все ж захищає від більшості помилок


Хоча варіант I не повторить те, що ви збираєтесь видалити.
Кальмарій

1

Зазвичай я використовую -vпрапор, щоб побачити, що видаляється, і я маю шанс ^Cшвидко, якщо у мене є найменші сумніви. Насправді це спосіб запобігти поганим rm, але це може бути корисно для обмеження шкоди, якщо щось піде не так.


1

Мій процес видалення на машинах на базі Unix полягає в наступному.

  • Введіть ls /path/to/intented/file_or_directoryу вікно терміналу, а потім натисніть return(або Tab, за бажанням), щоб побачити список файлів.

Якщо все виглядає добре,

  • натисніть up arrowклавішу, щоб ls /path/to/intented/file_or_directoryзнову взяти з історії терміналів.

  • замінити lsз rmабо rm -rабо rm -rf, по мірі необхідності. Я особисто не люблю використовувати -fпрапор.

Цей процес перевірки також запобігає передчасному виконанню rmкоманди, що сталося зі мною, перш ніж я почав слідкувати за цим процесом.


Попередній перегляд файлів перед їх видаленням - хороша ідея, і є ще безпечніший і виразніший спосіб зробити це, використовуючи так, find як я пояснюю у своїй відповіді .
aculich

1

Якщо ви зараз не в настрої здобувати нові звички, .bashrc/.profileце хороше місце, щоб додати кілька тестів, щоб перевірити, чи збираєтесь ви зробити щось дурне. Я зрозумів, що у функції Bash я можу поцікавитися схемою, яка може зіпсувати мені день, і придумав це:

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
}

Хороша річ у тому, що це лише Баш.

Це явно недостатньо загальне в цій формі, але я думаю, що він має потенціал, тому, будь ласка, опублікуйте кілька ідей чи коментарів.


Добре, що ви намагаєтеся переглянути свої файли перед тим, як видалити їх, однак це рішення надмірно складне. Натомість ви можете це зробити дуже просто більш загальним способом, використовуючи findкоманду . Крім того, я не розумію, чому ви говорите "добре, що це лише Баш"? Рекомендується уникати базофізмів у сценаріях .
aculich

Щоб запобігти нам "rm -rf / *" або "rm -rf dir / *", коли ми маємо на увазі "rm -rf ./*" і "rm -rf dir / *", ми повинні виявити шаблони "/ *" та "*" (спрощено). Але ми не можемо просто передати всі аргументи командного рядка через grep, шукаючи шкідливий зразок, оскільки bash розширює аргументи підстановки перед передачею їх (зірка буде розширена на весь вміст папки). Нам потрібна "сира" аргументна рядок. Це робиться з set -f, перш ніж ми будемо викликати функцію "myrm", яка потім передається необробленому рядку аргументу і grep шукає попередньо визначені шаблони. *
клн

Я розумію, що ви намагаєтеся зробити з тим, set -fщо еквівалентно set -o noglobв Bash, але це все ще не пояснює ваше твердження, що "Добре в тому, що це лише Баш". Натомість ви можете усунути проблему повністю та загальним чином для будь-якої оболонки, не використовуючи rmзовсім, а скориставшись findкомандою . Ви насправді спробували цю пропозицію, щоб побачити, як вона порівнюється з тим, що ви тут пропонуєте?
aculich

@aculich лише bash Я маю на увазі відсутність пітонних або перл-залежностей, все можна зробити в bash. Після внесення змін до свого .bashrc я можу продовжувати працювати без необхідності порушувати старі звички. Кожен раз, коли я викликаю rm bash, я переконуюсь, що я не роблю щось дурне. Мені просто потрібно визначити деякі зразки, про які я хочу попередити. Як-от "*", який би видалив усе з поточної папки. Кожен раз і знову це буде саме те, що я хочу, але з трохи більшою робочою інтерактивністю можна додати до "myrm".
клн

@aculich Добре gotcha.No я не пробував це. Я думаю, що це потребує значних змін у робочому процесі. Щойно перевірено тут на Mac OS X, моя .bash_history становить 500, і 27 цих команд є rm. І в наші дні я не використовую термінал дуже часто.
клн

1

На жаль, я не можу залишити коментар вище через недостатню карму, але хотів попередити інших про те, що безпека не є панацеєю від випадкових кошмарів масового видалення.

У віртуальній машині Linux Mint 17.1 було протестовано наступне (попередження для тих, хто не знає цих команд: НЕ РОБИТИ ЦЕ! Насправді навіть ті, хто знайомий з цими командами, повинні / мабуть ніколи цього не робитимуть, щоб уникнути катастрофічної втрати даних):

Текстова версія (стисла):

$ cd /
$ sudo safe-rm -rf *
$ ls
bash: /bin/ls: No such file or directory

Версія зображення (повна):

введіть тут опис зображення


1

Мені подобається підхід Windows до кошика.

Зазвичай я створюю каталог з назвою "/ tmp / recyclebin", щоб все, що мені потрібно видалити:

mkdir /tmp/recyclebin

І ніколи не використовую rm -rf, я завжди використовую:

mv target_folder /tmp/recyclebin

Потім пізніше я спорожняю коробку за допомогою сценарію aa або вручну.


0

Хе-хе (неперевірено і дещо гранічно!):

$ 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

І потім:

alias rm="/usr/local/bin/saferm"

Реально ви повинні мати ментальну паузу перед тим, як виконати подібну операцію з глобулом, будь то ви працюєте як root, передчуваючи "sudo" для нього тощо. Ви можете запустити "ls" на тому самому глобусі тощо, але, подумки, ви повинні зупинитися на секунду, переконайтесь, що ви набрали те, що хотіли, переконайтеся, що ви хочете, це насправді те, що ви хочете, і т. д. Я припускаю, що це те, що в основному дізнається, знищивши щось на першому курсі, як Unix SA, так само, як гарячий конфорка - хороший викладач, який говорить вам, що щось на плиті може бути гарячим.

І переконайтеся, що у вас є гарні резервні копії!


Я намагаюся подумати двічі, перш ніж робити небезпечні речі, але якось це не завжди працює, я знищив річ в минулому через неуважність, як це.
Валентин Немцев

0

Крім того, не як захисний засіб, а як спосіб дізнатися, які файли були видалені перед натисканням ^ C, ви можете використовувати locateбазу даних (звичайно, лише якщо вона була встановлена ​​та збереглася rm)

Я дізнався про це з цієї публікації в блозі


0

Просто використовуйте ZFS, щоб зберігати файли, які вам потрібні, щоб протистояти випадковому видаленню та мати демон, який:

  • регулярно робить знімки цієї файлової системи
  • видаляє старі / непотрібні знімки.

Якщо файли будуть видалені, перезаписані, пошкоджені, будь-що, просто відкачайте вашу файлову систему до клону останнього хорошого знімка, і ви закінчите.


0

не стільки відповідь, скільки підказка, я завжди rm (dir) -rfне rm -rf (dir)кажу, тобто: не йди ядерним до останнього можливого моменту.

Це допомагає пом’якшити ситуації, коли ви жирите пальцем ім'я режисура таким чином, що це все-таки дійсне видалення, наприклад, ковзання та натискання клавіші введення.


Розумний, але не працює на BSD rm, де параметри повинні бути перед іменами файлів.
svenper

так. Я виявив, що з використанням яблука нещодавно. Виправлення полягає в тому, щоб встановити інструменти gnu та встановити псевдоніми для всього :) та / або бажано викинути яблуко у смітник. :)
Sirex


1
якби мені було дозволено, я б у наносекунд. Це сміття порівняно з Linux.
Сірекс

0

Я думаю, що це потужна порада щодо запобігання, із * ярликом розширення в оболонці:

Спочатку введіть rm -rf *або rm -rf your/path/*, НЕ введіть Enterключ. (звичайно, ви повинні мати звичку дбати, щоб не натискати Enter швидко / випадково під час використання rm -rf)

Потім натисніть Alt-Shift-8(тобто Alt-Shift-*), щоб явно розгорнути підстановку "*" в баші. Це також уникає повторного введення команди "rm -rf *" під час навігації по історії.

Нарешті, після перевірки розширення має потрібні файли / каталоги, натисніть Enter.

Зроблено.


0

Якщо це допомагає комусь там для власної справи:

1. Використовуйте rmsafe:

Він переміщує файли у папку "сміття", і ви завжди маєте шанс повернути їх просто mv:

$ rmsafe /path/to/important/files

Джерело: https://github.com/pendashteh/rmsafe

2. Використовуйте safe:

Ви можете встановити псевдонім для rmвикористання безпечного:

$ alias rm="safe rm"

Тепер якщо ви запускаєте rm /*, отримуєте це у відповідь:

$ 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]

і я вірю, що ти не набереш y!

Джерело: https://github.com/pendashteh/safe

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.