Как предотвратить ошибочный rm -rf для определенных папок?

8

Я думаю, что многие люди по ошибке ошиблись в rm -rf«неправильном каталоге», и, надеюсь, это не нанесло огромного ущерба. Есть ли способ помешать пользователям делать подобную историю ужасов Unix ?? Кто-то упомянул (в разделе комментариев предыдущей ссылки ), что

... Я уверен, что теперь каждый курс Unix или компания, использующая unix, устанавливает rm -fr, чтобы отключить учетные записи людей, пытающихся запустить его, или помешать им запустить его ...

Есть ли реализация этого в каком-либо текущем дистрибутиве Unix или Linux? И какова общая практика предотвращения этой ошибки даже от системного администратора (с доступом с правами root)?

Похоже, что была некоторая защита корневого каталога ( /) в Solaris (с 2005 года) и GNU (с 2006 года). Есть ли способ реализовать такой же способ защиты для других папок?

Чтобы прояснить ситуацию, я не спрашивал об общих советах по rmиспользованию (и я обновил заголовок, чтобы указать на это больше), я хочу что-то более похожее на защиту корневой папки: для того, чтобы rm -rf /вам пришлось передать определенный параметр: rm -rf --no-preserve-root /.. Существуют ли похожие реализации для настраиваемого набора каталогов? Или я могу указать файлы помимо того, что они /должны быть защищены опцией preserve-root ?

amyassin
источник
11
1) Управление изменениями 2) Резервное копирование.
2013 года
6
вероятно, единственный способ - заменить rmкоманду на ту, у которой нет этой функции.
Кит
2
safe-rm возможно
sr_
2
большинство дистрибутивов делают `alias rm = 'rm -i', что заставляет rm спросить вас, уверены ли вы. кроме того: знай, что ты делаешь. стать пользователем root только при необходимости. для любого пользователя с привилегиями root безопасность любого вида должна быть реализована пользователем. нанять кого-нибудь, если вы не можете сделать это самостоятельно. Со временем любая контрмера становится эквивалентной строке псевдонима выше, если вы не можете решить проблему самостоятельно.
Bananguin
1
@amyassin using rm -rfможет быть событием, генерирующим резюме. Проверка и тройная проверка перед ее выполнением
midnightsteel

Ответы:

15

Чтобы не ошибиться rm -rf, не печатайтеrm -rf .

Если вам нужно удалить дерево каталогов, я рекомендую следующий рабочий процесс:

  • При необходимости измените на родительский каталог каталога, который вы хотите удалить.
  • mv directory-to-delete DELETE
  • Исследуйте DELETEи проверьте, что это действительно то, что вы хотели удалить
  • rm -rf DELETE

Никогда не звоните rm -rfс аргументом, кроме DELETE. Выполнение удаления в несколько этапов дает вам возможность убедиться, что вы не удаляете неправильную вещь, либо из-за опечатки (как rm -rf /foo /barвместо rm -rf /foo/bar), либо из-за брейно (упс, нет, я хотел удалить foo.oldи сохранить foo.new) ,

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


Всегда делайте резервные копии .

Периодически проверяйте, что ваши резервные копии работают и обновлены.

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


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

Некоторые варианты Unix предлагают больше возможностей.

  • В OSX вы можете установить список контроля доступа в каталоге, предотвращающем удаление файлов и подкаталогов внутри него, не предотвращая создание новых записей или изменение существующих записей: chmod +a 'group:everyone deny delete_child' somedir(это не препятствует удалению файлов в подкаталогах: если Вы хотите, установите ACL в подкаталоге).
  • В Linux вы можете устанавливать правила в SELinux, AppArmor или других структурах безопасности, которые запрещают rmизменять определенные каталоги.
Жиль "ТАК - перестань быть злым"
источник
Да, резервное копирование - самое удивительное решение, но я думал о чем-то вроде --no-preserve-rootварианта, для другой важной папки ... И этого, очевидно, не существует даже в качестве практики ...
amyassin
Я отредактировал вопрос, чтобы указать, чего я хочу больше ...
amyassin
1
@ amyassin Боюсь, больше ничего нет (по крайней мере, в Linux). rm -rfуже означает «удалить это, да, я уверен, что я знаю, что я делаю». Если вы хотите больше, замените rmего сценарием, который отказывается удалять определенные каталоги.
Жиль "ТАК - перестань быть злым"
Пожалуйста, отредактируйте последний комментарий к вопросу, поскольку я думаю, что он хорошо отвечает на вопрос ...
amyassin
2
@amyassin На самом деле, я забираю это. В традиционном Linux больше ничего нет, но вы можете установить правила Apparmor / SELinux /…, которые запрещают rmдоступ к определенным каталогам. Кроме того, поскольку ваш вопрос касается не только Linux, я должен был упомянуть OSX, в которой есть что-то вроде того, что вы хотите.
Жиль "ТАК - перестань быть злым"
4

Если вы используете rm *и Zsh, вы можете установить опцию rmstarwait:

setopt rmstarwait

Теперь оболочка предупреждает, когда вы используете *:

> zsh -f
> setopt rmstarwait
> touch a b c
> rm *
zsh: sure you want to delete all the files in /home/unixuser [yn]? _

Когда вы отклоняете это ( n), ничего не происходит. В противном случае все файлы будут удалены.

QBi
источник
Для чего zsh -fиспользуется?
Джеймс
3

Чтобы защититься от случайного попадания rm -rf *в каталог, создайте файл с именем «-i» (вы можете сделать это с помощью emacs или другой программы) в этом каталоге. Оболочка попытается интерпретировать -i и перевести ее в интерактивный режим.

Например: у вас есть каталог rmtestс именем файла -iвнутри. Если вы попробуете rmвсе внутри каталога, rmсначала перейдете -iк нему и перейдете в интерактивный режим. Если вы поместите такой файл в каталоги, на которые вы хотите установить защиту, это может помочь.

Обратите внимание, что это неэффективно против rm -rf rmtest.

Silverrocker
источник
Я отредактировал вопрос, чтобы указать, чего я хочу больше ...
amyassin
Удивительный трюк! Файл легко создается с помощью> -i
capitano666
2

РЕДАКТИРОВАТЬ как предложено комментарием:

Вы можете изменить атрибут на неизменяемый файл или каталог, и тогда он не может быть удален даже пользователем root, пока атрибут не будет удален.

chattr +i /some/important/file

Это также означает, что файл не может быть записан или изменен в любом случае, даже root . Другим атрибутом, который, по всей видимости, доступен, но я не использовал его самостоятельно, является атрибутом добавления ( chattr +a /some/important/fileтогда файл можно открыть только в режиме добавления, то есть без удаления, но вы можете добавить к нему (например, файл журнала). Это означает, что вы vimнапример, вы не сможете его редактировать , но вы можете это сделать echo 'this adds a line' >> /some/important/file. Использование >вместо >>не удастся.

Эти атрибуты могут быть сброшены с помощью знака минус, т.е. chattr -i file

В противном случае, если это не подходит, я всегда ls /some/dirсначала практикую , а затем вместо повторного ввода команды нажимаю стрелку вверх CTL-A, затем удаляю lsи введите my, rm -rfесли мне это нужно. Не идеально, но, посмотрев на результаты ls, вы заранее знаете, действительно ли это то, что вы хотели.

Дрейк Кларрис
источник
Я отредактировал вопрос, чтобы указать, чего я хочу больше ...
amyassin
2

Если вы понимаете язык программирования C, я думаю, что можно переписать исходный код rm и сделать небольшой патч для ядра. Я видел это на одном сервере, и было невозможно удалить некоторые важные каталоги, и когда вы набираете «rm -rf / direcotyr», он отправляет электронное письмо sysadmin.

ValeriRangelov
источник
1

Одним из возможных вариантов является прекращение использования rm -rfи начало использования rm -ri. Дополнительный iпараметр позволяет убедиться, что он спрашивает, действительно ли вы хотите удалить файл.

Вероятно, ваша лучшая ставка на это было бы сделать псевдоним rm -riчем-то запоминающимся kill_it_with_fire. Таким образом, когда вам захочется что-то удалить, продолжайте и убивайте это огнем.

NlightNFotis
источник
1
Мне нравится название, но разве fэто не полная противоположность iварианту? Я попробовал это и работал, хотя ...
amyassin
@amyassin Да, это так. Для какой-то странной моды, я думал, что только rтам. Просто исправил это.
NlightNFotis
Я отредактировал вопрос, чтобы указать, чего я хочу больше ...
amyassin
-1

Мне нравится сначала указывать имя каталога следующим образом:

$ rm /directoryname -rf
kieranwild
источник
5
это нарушает правила POSIX.
Gelraen
Я отредактировал вопрос, чтобы указать, чего я хочу больше ...
amyassin