Я думаю, что многие люди по ошибке ошиблись в rm -rf
«неправильном каталоге», и, надеюсь, это не нанесло огромного ущерба. Есть ли способ помешать пользователям делать подобную историю ужасов Unix ?? Кто-то упомянул (в разделе комментариев предыдущей ссылки ), что
... Я уверен, что теперь каждый курс Unix или компания, использующая unix, устанавливает rm -fr, чтобы отключить учетные записи людей, пытающихся запустить его, или помешать им запустить его ...
Есть ли реализация этого в каком-либо текущем дистрибутиве Unix или Linux? И какова общая практика предотвращения этой ошибки даже от системного администратора (с доступом с правами root)?
Похоже, что была некоторая защита корневого каталога ( /
) в Solaris (с 2005 года) и GNU (с 2006 года). Есть ли способ реализовать такой же способ защиты для других папок?
Чтобы прояснить ситуацию, я не спрашивал об общих советах по rm
использованию (и я обновил заголовок, чтобы указать на это больше), я хочу что-то более похожее на защиту корневой папки: для того, чтобы rm -rf /
вам пришлось передать определенный параметр: rm -rf --no-preserve-root /
.. Существуют ли похожие реализации для настраиваемого набора каталогов? Или я могу указать файлы помимо того, что они /
должны быть защищены опцией preserve-root ?
источник
rm
команду на ту, у которой нет этой функции.rm -rf
может быть событием, генерирующим резюме. Проверка и тройная проверка перед ее выполнениемОтветы:
Чтобы не ошибиться
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 предлагают больше возможностей.
chmod +a 'group:everyone deny delete_child' somedir
(это не препятствует удалению файлов в подкаталогах: если Вы хотите, установите ACL в подкаталоге).rm
изменять определенные каталоги.источник
--no-preserve-root
варианта, для другой важной папки ... И этого, очевидно, не существует даже в качестве практики ...rm -rf
уже означает «удалить это, да, я уверен, что я знаю, что я делаю». Если вы хотите больше, заменитеrm
его сценарием, который отказывается удалять определенные каталоги.rm
доступ к определенным каталогам. Кроме того, поскольку ваш вопрос касается не только Linux, я должен был упомянуть OSX, в которой есть что-то вроде того, что вы хотите.Если вы используете
rm *
и Zsh, вы можете установить опциюrmstarwait
:Теперь оболочка предупреждает, когда вы используете
*
:Когда вы отклоняете это (
n
), ничего не происходит. В противном случае все файлы будут удалены.источник
zsh -f
используется?Чтобы защититься от случайного попадания
rm -rf *
в каталог, создайте файл с именем «-i» (вы можете сделать это с помощью emacs или другой программы) в этом каталоге. Оболочка попытается интерпретировать -i и перевести ее в интерактивный режим.Например: у вас есть каталог
rmtest
с именем файла-i
внутри. Если вы попробуетеrm
все внутри каталога,rm
сначала перейдете-i
к нему и перейдете в интерактивный режим. Если вы поместите такой файл в каталоги, на которые вы хотите установить защиту, это может помочь.Обратите внимание, что это неэффективно против
rm -rf rmtest
.источник
> -i
РЕДАКТИРОВАТЬ как предложено комментарием:
Вы можете изменить атрибут на неизменяемый файл или каталог, и тогда он не может быть удален даже пользователем 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, вы заранее знаете, действительно ли это то, что вы хотели.источник
Если вы понимаете язык программирования C, я думаю, что можно переписать исходный код rm и сделать небольшой патч для ядра. Я видел это на одном сервере, и было невозможно удалить некоторые важные каталоги, и когда вы набираете «rm -rf / direcotyr», он отправляет электронное письмо sysadmin.
источник
Одним из возможных вариантов является прекращение использования
rm -rf
и начало использованияrm -ri
. Дополнительныйi
параметр позволяет убедиться, что он спрашивает, действительно ли вы хотите удалить файл.Вероятно, ваша лучшая ставка на это было бы сделать псевдоним
rm -ri
чем-то запоминающимсяkill_it_with_fire
. Таким образом, когда вам захочется что-то удалить, продолжайте и убивайте это огнем.источник
f
это не полная противоположностьi
варианту? Я попробовал это и работал, хотя ...r
там. Просто исправил это.Мне нравится сначала указывать имя каталога следующим образом:
источник