Чому можна видалити всю файлову систему?


24

Після допущення сумнозвісної помилки при видаленні всієї файлової системи через sudo rm -rf /*вилучення жахливих збитків, які я завдав, і впоравшись з тим, що я просто втратив 6 років від свого життя, я почав цікавитись, чому це можливо зробити, і що можна зробити, щоб не допустити цієї помилки.

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

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

Моє запитання: чому б не здійснити підтвердження, коли користувач намагається видалити свою файлову систему? Так що коли ви насправді хочете це зробити, ви просто натискаєте Y або входите, і якщо ви принаймні не втрачаєте все.


Дивіться serverfault.com/q/337082

20
"Чому це навіть можливо зробити?" Чому should't це можливо? Для видалення вмісту ієрархії каталогів є цілком вагомі причини, і є безліч підмножин, /які було б так само погано ( /etc/наприклад,). Просто rmвирішувати, які каталоги можна або не можна легко видалити, просто не є завданням .
чепнер

2
Назва зазначає "Чому можливо видалити систему?" тоді як саме запитання задає "Моє запитання: чому б не здійснити підтвердження, коли користувач намагається видалити свою файлову систему?". Тож це робить питання незрозумілим. Яке з них - ваше власне питання, щоб ми принаймні знали, що відповісти? Будь ласка, відредагуйте своє повідомлення, щоб уточнити
Сергій Колодяжний

3
У чому насправді питання тут? Я бачу три: (1) Чому це можливо? (2) Як не допустити цього? (3) Чому б не застосувати підтвердження? - Вони не одне і те ж питання, перший просить міркувати, другий - інструменти. (Третя пов’язана з другою, але все ще насправді не однакова. Підтвердження - не єдиний спосіб запобігти чомусь.)
ilkkachu

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

Відповіді:


16

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

Додавання спеціального випадку до запиту rm /*неможливо, оскільки команда rm не бачить його у цій формі. *Символи розширюється оболонки перед передачею rm, тому фактична команда , яка потребує особливого випадку було б що - щось подібне rm /bin /boot /dev /etc /home /initrd.img /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var /vmlinuz. Додавання коду для перевірки на цей випадок (який, мабуть, відрізнятиметься від різних Linux) було б складною проблемою, а також схильною до тонких помилок. У стандартного linux rmє захист за замовчуванням від руйнування системи, відмовившись видаляти /без --no-preserve-rootможливості.

За замовчуванням три захисні засоби проти видалення вашої системи таким чином:

  1. Дозволи - постійні користувачі не зможуть видалити важливі файли. Ви обійшли це судо
  2. Каталоги - за замовчуванням rm не буде видаляти каталоги. Ви обійшли це прапором -r
  3. Пишіть захищені файли - за замовчуванням rm попросить підтвердження перед видаленням файлу, захищеного від запису (це не зупинило б усі пошкодження, але, можливо, надало б запит до того, як система не вийде відновити). Ви обійшли цей захист прапором -f

Щоб видалити весь вміст папки, а не запустити rm /path/to/folder/*, зробіть це rm -rf /path/to/folder, mkdir /path/to/folderоскільки це призведе до --preserve-rootзахисту, а також видалення будь-яких точкових файлів у папці


3
"rm, як очікується, має добре відому поведінку", і це насправді один із інструментів, визначених стандартом POSIX. "wild * wildcard розширюється оболонкою перед передачею в rm" Рівне, тому додавання перевірок для всіх типів параметрів, які можуть бути посиланнями на фактичні каталоги та файли /, потребує багатьох комбінацій та міркувань, тому це не практично. І повернувшись до ідеї стандартів, додавання таких перевірок порушило б послідовну поведінку
Сергій Колодяжний,

Саме тому safe-rmобертається навколо rm: таким чином він може перевірити кожен окремий аргумент (замість усього випадкового командного рядка), переконатися, що він не в налаштованому чорному списку, і лише потім викликати rmперевірені аргументи. Це ні дуже складно, ні схильно до помилок.
десерт

59

Знайомтесь safe-rmВстановіть safe-rm, "обгортка навколо rmкоманди для запобігання випадкових видалень":

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

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

Якщо посилання на встановлення вище не працює, просто використовуйте sudo apt install safe-rmзамість цього. Конфігурація за замовчуванням вже містить системні каталоги, спробуємо, rm /*наприклад:

$ rm /*
safe-rm: skipping /bin
safe-rm: skipping /boot
safe-rm: skipping /dev
safe-rm: skipping /etc
safe-rm: skipping /home
safe-rm: skipping /lib
safe-rm: skipping /proc
safe-rm: skipping /root
safe-rm: skipping /sbin
safe-rm: skipping /sys
safe-rm: skipping /usr
safe-rm: skipping /var
…

Як бачите, це не дозволить вам видалити /home, де я вважаю, що ваші особисті файли зберігаються. Однак це не заважає вам видалити ~або будь-який з його підкаталогів, якщо ви спробуєте їх видалити безпосередньо. Щоб додати ~/precious_photosкаталог, просто додайте його абсолютний шлях за допомогою тильду, дозволеного до safe-rmконфігураційного файлу /etc/safe-rm.conf, наприклад:

echo /home/dessert/precious_photos | sudo tee -a /etc/safe-rm.conf

Для тих випадків , коли ви біжите rmбез sudo1 і -fпрапора це ідея добре додайтеalias для оболонки , що марка rm«и -iпрапор за замовчуванням. Цей спосіб rmзапитує кожен файл перед його видаленням:

alias rm='rm -i'

Аналогічно корисний прапор полягає в тому -I, що він попереджає лише "один раз перед видаленням більше трьох файлів або при рекурсивному видаленні", що є "менш нав'язливим, ніж -iпри цьому все ще забезпечує захист від більшості помилок":

alias rm='rm -I'

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


1: sudoігнорує псевдоніми , можна обійти це шляхом визначення, alias sudo='sudo 'хоча


25

Підтвердження вже є, проблема полягає -fв команді, тобто --force; Коли користувач змушує операцію, він, напевно, знає, що робить (очевидно, завжди може бути помилка).

Приклад:

 rm -r ./*
 rm: remove write-protected regular file './mozilla_mvaschetto0/WEBMASTER-04.DOC'? N
 rm: cannot remove './mozilla_mvaschetto0': Directory not empty
 rm: descend into write-protected directory './pulse-PKdhtXMmr18n'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-bolt.service-rZWMCb'? n
 rm: descend into write-protected directory './systemd-private-     890f5b31987b4910a579d1c49930a591-colord.service-4ZBnUf'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-fwupd.service-vAxdbk'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-minissdpd.service-9G8GrR'? 
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-ModemManager.service-s43zUX'? nn
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-rtkit-daemon.service-cfMePv'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-systemd-timesyncd.service-oXT4pr'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-upower.service-L0k9rT'? n

Інакше є --forceваріант: я не отримаю підтвердження і файли видаляються.

Проблема полягає в тому, щоб знати команду та її параметри, більше орієнтуватися manв команді (також якщо команда знайдена в підручнику) для прикладів: коли я побачив команду, tar xzf some.tar.gzя запитую себе ", що xzfозначає?" "

Тоді я прочитав масляну сторінку та виявив її.


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

1
Отож особисто я завжди вважав, що -fпотрібно видаляти папки. Я навіть відкрив підказку для підтвердження та скарги, але дізнався, що просто -rпотрібно. Я вважаю, що rm -rfце стало нормою, оскільки воно є таким корисним у сценарії (ви не хочете, щоб сценарій вийшов з ладу лише тому, що ви намагаєтесь видалити речі, які не існують), тому ви бачите це часто, але я думаю, нам це потрібно бути пильним щодо того, щоб просто використовувати rm -rяк "за замовчуванням", коли в оболонці (зрозуміло, не повинно бути припущень "за замовчуванням", яких ви не розумієте, особливо з судо, але люди будуть людьми і, принаймні, це безпечніше).
Капітан Людина

2
Rmdir - найбезпечніший спосіб видалення папки
AtomiX84

rmне запитує підтвердження за замовчуванням, він запитує його лише для каталогів та файлів, захищених від запису. Якщо ви виконали цю команду на своїй машині, ви, ймовірно, видалили багато власних файлів. Якщо вам потрібно rmбуло попросити підтвердження, вам потрібно передати -iпараметр. Наприклад:rm -ir ./*
День

8

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


Але ви можете зробити, щоб зменшити ймовірність таких помилок:

  • псевдонім rm='rm -I'для підказок, якщо видалити більше трьох речей.
  • псевдоніми mv і cp to mv -iі cp -i(багато звичайних випадків використання для них не включають перезапис файлу призначення).
  • псевдонім sudo='sudo 'зробити розширення псевдоніму на першому аргументі доsudo

Я вважаю rm -I, що набагато корисніше, ніж rm -i. Зазвичай він не підкаже під час звичайного використання, тому підказки підказки, коли ви не сподівались, є набагато помітнішим / кращим попередженням. З -i(до того, як я виявив -I), я звик вводити текст, \rmщоб відключити розширення псевдоніму, переконавшись, що я правильно ввів команду.

Ви не хочете, щоб врятувати вас покладатися на псевдоніми rm -iчи -Iпсевдоніми . Ви сподіваєтесь, що це ніколи не звикне. Якщо я дійсно хочу інтерактивно вибрати, які збіги потрібно видалити, або я не впевнений, чи мій глобул може відповідати деяким зайвим файлам, я вводя вручну rm -i .../*whatever*. (Також хороша звичка, якщо ви коли-небудь знаходитесь в оточенні без псевдонімів).

Захистіться від жирового пальця Enter, ввівши ls -d /*foo*спочатку , потім стрілку вгору та змініть на, rm -rпісля того як ви закінчите вводити текст. Таким чином, командний рядок ніколи не містить rm -rf ~/або подібні небезпечні команди в будь-якій точці. Ви лише "озброюєте" його, змінивши lsна " rmcontrol-a", "alt-d", щоб перейти до початку рядка і додавши -rабо -fпісля того, як ви закінчили вводити ~/some/sub/dir/частину команди.

Залежно від того, що ви видаляєте, насправді запустіть ls -dперший, чи ні, якщо це не додасть нічого до того, що ви бачите із заповненням вкладки. Ви можете почати з rm(без -rабо -rf), так що це просто control-a / control-right (або alt + f) / space / -r.

(Звикайте до потужного редагування клавіш bash / readline для швидкого переміщення, наприклад, стрілки управління або alt + f / b для переміщення словами, і вбивання цілих слів за допомогою alt + backspace або alt + d, або control-w. І управління -u вбити до початку рядка. І control- / скасувати редагування, якщо ви перейдете на крок занадто далеко. І звичайно історію стрілки вгору, яку ви можете шукати за допомогою control-r / control-s.)

Уникайте, -rfякщо вам насправді не потрібно, щоб замовчувати підказки про видалення файлів лише для читання.

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


6

Ну і коротка відповідь - не запускати таку команду.

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

Друга полягає в тому, що команда rm пропонує корисний синтаксичний цукор для видалення всіх файлів у папці.

Ефективно це можна відновити як окремий простір машин Unix. Все - файл . Щоб покращити питання, існують контролі доступу, але вони переохоплені вашим використанням

судо

Я думаю, ви можете додати псевдонім або функцію, яка гарантує, що це неможливо виконати.


4

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

Або ви могли створити в'язницю Chroot і працювати всередині неї. Вам все-таки знадобиться певне відновлення, якби воно потрапило в кошик, але це може бути легше за допомогою запущеної (огороджувальної) системи роботи.


Це, мабуть, найефективніша відповідь, оскільки вона може захистити від будь-яких збитків, навіть сторонніх сценаріїв. Вам потрібно буде турбуватися лише про фактичне зловмисне програмне забезпечення.
PyRulez

Думка іншого кута. Варто запитати, чому в першу чергу потрібно робити рекурсивні видалення. Можливо, справді потрібні сценарії для видалення проекту тощо.
Лорен Розен,

"Варто запитати, чому потрібно робити рекурсивні видалення в першу чергу." Ну, тільки те, що вбудована команда не означає, що ви все одно не можете помилитися. Сторонні сценарії можуть видаляти файли по одному з якогось каталогу. Є й інші способи зв'язати систему, яка торкається лише одного файлу. Однак заміна rmна safe-rmдопомогу принаймні.
PyRulez

Моє уявлення про сценарій полягало в тому, що воно буде мати вбудоване поняття "проект" або подібне. Можливо, у вас буде пустий файл у корені проекту, який називається .project_root, або, якщо файлова система його підтримує, атрибут у самому каталозі. Потім скрипт підніме дерево файлів, шукаючи корінь проекту, і поскаржиться, що поточний каталог не був у проекті. Або, якщо всі проекти живуть на одному місці, сценарій може вимагати від вас назвати проект. Ви все ще можете видалити неправильний проект, але не знищити всю систему.
Лорен Розен

... Крім того, варіантом chrootбуло б використовувати щось на кшталт Docker (що, на мою думку, насправді використовує chrootпід обкладинками). Для інших файлів, які вам потрібно просто прочитати, змонтуйте файлову систему лише для читання.
Лорен Розен

3

rmце дуже стара команда Unix і, ймовірно, не розроблена з урахуванням зручності для користувача. Він намагається зробити саме те, про що вимагають, коли має дозволи. Проблема багатьох нових користувачів полягає в тому, що вони часто бачать код sudoі не дуже задумуються над його використанням. Функції , які безпосередньо змінюють файли , такі як rm, dd, chrootі т.д. вимагають крайньої обережності у використанні.

У наш час я люблю використовувати trash(без судо) з trash-cli . Він функціонує як кошик з Windows, завдяки чому ви можете легко отримати випадково видалені файли. Ubuntu вже має папку Trash та функцію переходу до сміття, вбудовану у файли.

Навіть тоді ви можете помилитися, тому обов'язково робіть резервні копії всієї файлової системи.

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