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

24

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

Одно из предложенных мной решений - отмена корневого доступа из моей учетной записи, но это неудобно, потому что для многих команд требуется root-доступ, и когда вам приходится выполнять несколько десятков команд каждый день, это раздражает.

Резервное копирование вашей системы - очевидный путь. Но восстановление резервной копии также требует некоторого времени простоя, и в зависимости от вашей системы время простоя может составлять дни или недели, что в некоторых случаях может быть неприемлемым.

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

Mister_Fix
источник
20
"Почему это вообще возможно сделать?" Почему should't это возможно? Есть совершенно веские причины для удаления содержимого иерархии каталогов, и существует множество подмножеств, /которые было бы почти так же плохо удалить ( /etc/например). Это просто не задача rmрешить, какие каталоги могут или не могут быть легко удалены.
chepner
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. Разрешения - обычные пользователи не смогут удалить важные файлы. Вы обошли это с sudo
  2. Каталоги - по умолчанию rm не удаляет каталоги. Вы обошли это с флагом -r
  3. Защищенные от записи файлы - по умолчанию, rm будет запрашивать подтверждение перед удалением защищенного от записи файла (это не остановило бы все повреждения, но могло бы обеспечить запрос до того, как система стала невосстановимой). Вы обошли эту защиту с флагом -f

Чтобы удалить все содержимое папки, а не запустить rm /path/to/folder/*, выполните rm -rf /path/to/folder, затем, так mkdir /path/to/folderкак это активирует --preserve-rootзащиту, а также удалит все точечные файлы в папке.

rhellen
источник
3
«Ожидается, что rm будет иметь хорошо известное поведение», и на самом деле это один из инструментов, определенных стандартом POSIX. «Подстановочный знак he * раскрывается оболочкой перед передачей в 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значит? "

Затем я прочитал man-страницу tar и обнаружил ее.

AtomiX84
источник
Я не думаю, что это актуально здесь. В тот момент, когда rm сначала запрашивает защищенный от записи или любой другой файл, он, возможно, уже удалил целую кучу важных файлов.
Йонас Шефер
1
Так что лично я всегда думал, что -fнужно удалять папки. Я даже открыл приглашение подтвердить и пожаловаться, но узнал, что это просто -rнеобходимо. Я полагаю, что rm -rfэто стало нормой, поскольку это очень полезно в сценарии (вы не хотите, чтобы сценарий не выполнялся, просто потому что вы пытаетесь удалить вещи, которые не существуют), поэтому вы часто это видите, но я полагаю, что нам нужно проявлять бдительность в том, чтобы просто использовать rm -r«по умолчанию» в оболочке (понятно, что не должно быть допущений «по умолчанию», которые вы не понимаете, особенно с sudo, но люди будут людьми, и, по крайней мере, это безопаснее).
Капитан Мэн
2
Rmdir - самый безопасный способ удаления папки
AtomiX84
rmпо умолчанию не запрашивает подтверждения, он запрашивает только каталоги и файлы, защищенные от записи. Если вы запустили эту команду на своем компьютере, вы, вероятно, удалили много своих файлов. Если вам нужно rmзапросить подтверждение, вам нужно передать -iпараметр. Например:rm -ir ./*
Дан
8

Запуск без резервных копий означает, что вы должны быть очень осторожны, чтобы никогда не делать ошибок. И надеюсь, что ваше оборудование никогда не выйдет из строя. (Даже RAID не может спасти вас от повреждения файловой системы, вызванного неисправным ОЗУ.) Так что это ваша первая проблема. (Что, я полагаю, вы уже поняли и будете делать резервные копии в будущем.)


Но есть вещи, которые вы можете сделать, чтобы уменьшить вероятность таких ошибок:

  • псевдоним, rm='rm -I'чтобы подсказать, если удалить более 3 вещей.
  • псевдонимы mv и cp to mv -iand 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первый или нет, если это ничего не добавит к тому, что вы видите с помощью tab-complete. Вы можете начать с 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если вам это не нужно, чтобы заставить замолчать подсказки об удалении файлов только для чтения.

Уделите дополнительное время обдумыванию, прежде чем нажимать sudoкоманду возврата . Особенно, если у вас нет полных резервных копий, или сейчас было бы плохое время для восстановления из них.

Питер Кордес
источник
6

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

Длинная история состоит в том, что это часть настройки. По сути, здесь действуют два фактора. Одним из них является тот факт, что вы можете изменять все файлы.

Во-вторых, команда rm предлагает полезный синтаксический сахар для удаления всех файлов в папке.

Фактически это можно переформулировать как простой принцип машин Unix. Все это файл . Чтобы улучшить ситуацию, существуют средства управления доступом, но они переопределяются вашим использованием

Судо

Я думаю, вы могли бы добавить псевдоним или функцию, чтобы гарантировать, что это никогда не может быть запущено.

HaoZeke
источник
4

Если использование системного файлового пространства не является огромным (а в наши дни «огромное» означает «сотни гигабайт или более»), создайте несколько экземпляров виртуальной машины и всегда работайте внутри одного. Восстановление просто повлечет за собой использование резервной копии.

Или вы можете создать chroot-тюрьму и работать внутри нее. Вам все равно понадобится некоторое восстановление, если оно будет уничтожено, но с работающей (закрытой) системой было бы легче работать.

Лорен Розен
источник
Это, пожалуй, самый эффективный ответ, поскольку он может защитить от любого ущерба, даже сторонних скриптов. Вам нужно только беспокоиться о реальных вредоносных программах.
PyRulez
Мысль под другим углом. Стоит спросить, зачем вам делать рекурсивные удаления в первую очередь. Может быть, действительно нужны сценарии для удаления проекта и т. Д.
Лорен Розен,
«Стоит спросить, зачем вам сначала делать рекурсивные удаления». Ну, то, что нет встроенной команды, не означает, что вы все еще не можете ошибиться. Сторонние скрипты могут удалять файлы один за другим из некоторого каталога. И есть другие способы создать систему, которая касается только одного файла. Тем не менее, замена rmс safe-rmпомогает, по крайней мере.
PyRulez
Мое представление о сценарии состояло в том, что он будет иметь встроенное понятие «проект» или подобное. Возможно, у вас будет пустой файл в корневом каталоге проекта .project_rootили, если файловая система его поддерживает, атрибут самого каталога. Затем сценарий поднимался по дереву файлов в поисках корня проекта и жаловался, что текущий каталог отсутствует в проекте. Или, если все проекты живут в одном месте, сценарий может потребовать, чтобы вы назвали проект. Вы все еще можете удалить неправильный проект, но не уничтожить всю систему.
Лорен Розен
... Кроме того, вариант chrootбудет использовать что-то вроде Docker (который я думаю, на самом деле использует chrootпод прикрытием). Для других файлов, которые вам просто нужно прочитать, смонтируйте файловую систему только для чтения.
Лорен Розен
3

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

В настоящее время я люблю использовать trash(без sudo) из trash-cli . Он работает как корзина из Windows, так как вы можете легко получить случайно удаленные файлы. В Ubuntu уже есть папка «Корзина» и встроенная функция «Переместить в корзину».

Даже в этом случае вы можете ошибаться, поэтому обязательно делайте резервные копии всей вашей файловой системы.

qwr
источник