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

Везде, где Вам нравится и где это имеет большую часть смысла для Вас. Я видел бесчисленные варианты.

Самостоятельно, я обычно монтирую их в /data0, /data1 или подкаталоги ниже /data и помещенные символьные ссылки на соответствующие места (как /home).

8
21.12.2014, 05:08
7 ответов

Избегать ошибочного 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 изменить определенные каталоги.
14
27.01.2020, 20:08
  • 1
    Да резервное копирование является самым удивительным решением, но я думал о чем-то как --no-preserve-root опция, для другой важной папки.. И это, по-видимому, не существует, как раз когда практика... –  amyassin 22.01.2013, 11:41
  • 2
    я отредактировал вопрос указать на то, что я хочу больше... –  amyassin 22.01.2013, 22:28
  • 3
    @amyassin, я боюсь, что нет ничего больше (по крайней мере, не на Linux). rm -rf уже означает, “удаляют это, да я уверен, что знаю то, что я делаю”. Если Вы хотите больше, замену rm сценарием, который отказывается удалять определенные каталоги. –  Gilles 'SO- stop being evil' 22.01.2013, 22:32
  • 4
    Отредактируйте последний комментарий к вопросу, поскольку я думаю, что он отвечает на вопрос хорошо... –  amyassin 22.01.2013, 22:38
  • 5
    @amyassin На самом деле, я забираю это. Нет ничего больше на традиционном Linux, но можно установить Apparmor/SELinux / … правила, которые предотвращают rm от доступа к определенным каталогам. Кроме того, так как Ваш вопрос не только о Linux, я должен был упомянуть OSX, которая имеет что-то немного как то, что Вы хотите. –  Gilles 'SO- stop being evil' 23.01.2013, 00:17

Если Вы используете 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), ничего не происходит. Иначе все файлы будут удалены.

4
27.01.2020, 20:08

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

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

chattr +i /some/important/file

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

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

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

2
27.01.2020, 20:08
  • 1
    , я отредактировал вопрос указать на то, что я хочу больше... –  amyassin 22.01.2013, 22:29

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

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

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

2
27.01.2020, 20:08
  • 1
    , я отредактировал вопрос указать на то, что я хочу больше... –  amyassin 22.01.2013, 22:28

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

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

1
27.01.2020, 20:08
  • 1
    , мне нравится имя, но не f полная противоположность i опция?? Я попробовал его и работал хотя... –  amyassin 22.01.2013, 16:24
  • 2
    @amyassin Да это. Для некоторого странного вида вида я думал, что только имел r там. Просто зафиксированный это. –  NlightNFotis 22.01.2013, 18:09
  • 3
    , я отредактировал вопрос указать на то, что я хочу больше... –  amyassin 22.01.2013, 22:30

Мне нравится помещать имя каталога сначала как это:

$ rm /directoryname -rf
-1
27.01.2020, 20:08
  • 1
    это нарушает инструкции POSIX. –  gelraen 22.01.2013, 11:59
  • 2
    , я отредактировал вопрос указать на то, что я хочу больше... –  amyassin 22.01.2013, 22:30

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

2
27.01.2020, 20:08

Теги

Похожие вопросы