7

Нам всем известна разрушительная сила следующей команды, выполняемой от имени root:

rm -rf /

Смежные вопросы:

Я не вижу, когда эта конкретная комбинация параметров будет полезна, поскольку она разрушает всю систему, и для этого есть более эффективные способы. Команда rm может проверять эти конкретные параметры и реализовывать какие-то меры безопасности - по крайней мере, запрашивать подтверждение, несмотря на параметр -f .

Почему такой команды нет в команде rm ?

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

2 ответа2

25

Почему такой команды нет в команде rm?

Есть уже три гарантии:

  • -r , без которого каталог нельзя удалить.
  • -i , который подтверждает, что вы действительно хотите удалить то, что просили удалить. Привязка rm к rm -i включает эту защиту, если только вы не добавили ключ -f чтобы выключить ее.
  • Владение файлами, которое не позволяет всем пользователям, кроме root удалять корневой каталог.

Набор инструментов Unix похож на бензопилу: он был разработан, чтобы делать очень мощные вещи и использоваться людьми, которые понимают, что они делают. Те, кто ступают небрежно, могут в конечном итоге травмировать себя. Это не означает, что опытные не делают ошибок, и, очевидно, Sun и другие считают, что пользователи с root должны быть защищены от себя.

Однако не должен ли этот конкретный случай быть исключением из этого правила?

Люди спрашивают , почему мы не можем поставить защитный кожух над rm бензопилой, по крайней мере , в 1980 - й год. (Возможно, дольше, но моя история с Unix не идет дальше.) Вы должны задать себе больше вопросов:

  • Поскольку мы добавляем исключения, что еще следует считать священным? Должны ли мы предотвратить рекурсивное удаление чего-либо в корневом каталоге, чтобы избежать столь же разрушительных ошибок, как rm -rf /*? А как насчет домашнего каталога пользователя? Как насчет /lib или /bin? Нужна ли нам специальная версия rm для предотвращения этих ошибок в системах с нетрадиционной разметкой файловой системы?

  • Куда мы положим исполнение этих запретов? Просто в rm или мы даем ядру эту работу? Поскольку rm самом деле ничего не удаляет (он делает много вызовов unlink(2) и rmdir(2) на основе аргументов), у ядра не будет возможности обнаружить, что rm действительно стрелял для / до момента на самом деле пришел, чтобы удалить его. Поскольку единственный вызов rmdir(2) , который когда-либо будет успешным, - это когда целевой каталог пуст, достижение этой точки с помощью / означает, что система уже выполнила.

17

Это зависит от распределения. Более старый Linux, на котором я сейчас работаю, позволяет это (я думаю, что не проверял это хотя :-)) и заявляет в man rm :

   --no-preserve-root do not treat '/' specially (the default)

   --preserve-root
          fail to operate recursively on '/'

Во многих последних дистрибутивах вам необходимо явно добавить --no-preserve-root чтобы отключить защиту. В противном случае он не будет выполнен.

Что касается Ubuntu, посмотрите эту проблему, где обсуждается это поведение.


История этой защиты согласно Википедии:

Sun Microsystems представила rm -rf / protection в Solaris 10, впервые выпущенном в 2005 году. После выполнения команды система теперь сообщает, что удаление / не разрешено. Вскоре после этого такая же функциональность была введена во FreeBSD-версию утилиты rm . GNU rm отказывается выполнять rm -rf / если задана опция --preserve-root , которая используется по умолчанию с момента выпуска версии 6.4 GNU Core Utilities в 2006 году.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .