После совершения печально известной ошибки, заключающейся в удалении всей моей файловой системы sudo rm -rf /*
, восстановлении после ужасного ущерба, который я нанес, и справлении с тем фактом, что я потерял 6 лет своей жизни, я начал задаваться вопросом, почему это вообще возможно сделать, и что можно сделать, чтобы предотвратить эту ошибку.
Одно из предложенных мной решений - отмена корневого доступа из моей учетной записи, но это неудобно, потому что для многих команд требуется root-доступ, и когда вам приходится выполнять несколько десятков команд каждый день, это раздражает.
Резервное копирование вашей системы - очевидный путь. Но восстановление резервной копии также требует некоторого времени простоя, и в зависимости от вашей системы время простоя может составлять дни или недели, что в некоторых случаях может быть неприемлемым.
Мой вопрос: почему бы не реализовать подтверждение, когда пользователь пытается удалить свою файловую систему? Так что, когда вы действительно хотите это сделать, вы просто нажимаете Y или вводите, и если вы по крайней мере не делаете этого, вы не теряете все.
источник
/
которые было бы почти так же плохо удалить (/etc/
например). Это просто не задачаrm
решить, какие каталоги могут или не могут быть легко удалены.Ответы:
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) будет сложной задачей, а также будет подвержен незначительным ошибкам. Стандартный linuxrm
имеет стандартную защиту от разрушения системы, отказываясь удалить/
без--no-preserve-root
опции.По умолчанию существует три способа защиты вашей системы:
Чтобы удалить все содержимое папки, а не запустить
rm /path/to/folder/*
, выполнитеrm -rf /path/to/folder
, затем, такmkdir /path/to/folder
как это активирует--preserve-root
защиту, а также удалит все точечные файлы в папке.источник
/
, потребовало бы множества комбинаций и соображений, поэтому это не практично. И если вернуться к идее стандартов, добавление таких проверок нарушит последовательное поведениеsafe-rm
это оберткаrm
: таким образом он может проверять каждый отдельный аргумент (вместо всей случайной командной строки), проверять, что его нет в настраиваемом черном списке, и только затем вызыватьrm
с проверенными аргументами. Это не очень сложно и не подвержено ошибкам.Встречайте
safe-rm
, «обертка вокругrm
команды для предотвращения случайного удаления»:Если ссылка для установки выше не работает для вас, просто используйте
sudo apt install safe-rm
вместо этого. Конфигурация по умолчанию уже содержит системные каталоги, давайте попробуем,rm /*
например:Как вы видите, это не позволит вам удалить
/home
, где, как я полагаю, хранятся ваши личные файлы. Тем не менее, это не мешает вам удалить~
или любой из его подкаталогов, если вы попытаетесь удалить их напрямую. Чтобы добавить~/precious_photos
каталог, просто добавьте его абсолютный путь с разрешением тильды вsafe-rm
файл конфигурации/etc/safe-rm.conf
, например:Для тех случаев , когда вы бежите
rm
безsudo
1 и-f
флага это идея хорошо добавьтеalias
для оболочки , что маркаrm
«ы-i
флаг по умолчанию. Этот способrm
запрашивает каждый файл перед его удалением:Аналогичный полезный флаг заключается в том
-I
, что он только предупреждает «один раз перед удалением более трех файлов или при рекурсивном удалении», который «менее навязчив, чем-i
, но при этом обеспечивает защиту от большинства ошибок»:Общая опасность этих псевдонимов заключается в том, что вы легко привыкли полагаться на них, чтобы спасти вас, что может иметь неприятные последствия при использовании другой среды.
1:
sudo
игнорирует псевдонимы , можно обойти это, определив,alias sudo='sudo '
хотяисточник
Подтверждение уже есть, проблема
-f
в команде, то есть--force
; Когда пользователь форсирует операцию, предполагается, что он знает, что он делает (очевидно, ошибка всегда может добавляться).Пример:
Это отличается от
--force
варианта: я не получу никакого подтверждения, и файлы будут удалены.Проблема заключается в том, чтобы узнать команду и ее параметры, перейти к более подробным сведениям
man
о команде (также, если команда найдена в учебном пособии) для примеров: в первый раз, когда я увидел команду,tar xzf some.tar.gz
я спрашиваю себя: «Что этоxzf
значит? "Затем я прочитал man-страницу tar и обнаружил ее.
источник
-f
нужно удалять папки. Я даже открыл приглашение подтвердить и пожаловаться, но узнал, что это просто-r
необходимо. Я полагаю, чтоrm -rf
это стало нормой, поскольку это очень полезно в сценарии (вы не хотите, чтобы сценарий не выполнялся, просто потому что вы пытаетесь удалить вещи, которые не существуют), поэтому вы часто это видите, но я полагаю, что нам нужно проявлять бдительность в том, чтобы просто использоватьrm -r
«по умолчанию» в оболочке (понятно, что не должно быть допущений «по умолчанию», которые вы не понимаете, особенно с sudo, но люди будут людьми, и, по крайней мере, это безопаснее).rm
по умолчанию не запрашивает подтверждения, он запрашивает только каталоги и файлы, защищенные от записи. Если вы запустили эту команду на своем компьютере, вы, вероятно, удалили много своих файлов. Если вам нужноrm
запросить подтверждение, вам нужно передать-i
параметр. Например:rm -ir ./*
Запуск без резервных копий означает, что вы должны быть очень осторожны, чтобы никогда не делать ошибок. И надеюсь, что ваше оборудование никогда не выйдет из строя. (Даже RAID не может спасти вас от повреждения файловой системы, вызванного неисправным ОЗУ.) Так что это ваша первая проблема. (Что, я полагаю, вы уже поняли и будете делать резервные копии в будущем.)
Но есть вещи, которые вы можете сделать, чтобы уменьшить вероятность таких ошибок:
rm='rm -I'
чтобы подсказать, если удалить более 3 вещей.mv -i
andcp -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
наrm
control-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
команду возврата . Особенно, если у вас нет полных резервных копий, или сейчас было бы плохое время для восстановления из них.источник
Ну краткий ответ - не запускать такую команду.
Длинная история состоит в том, что это часть настройки. По сути, здесь действуют два фактора. Одним из них является тот факт, что вы можете изменять все файлы.
Во-вторых, команда rm предлагает полезный синтаксический сахар для удаления всех файлов в папке.
Фактически это можно переформулировать как простой принцип машин Unix. Все это файл . Чтобы улучшить ситуацию, существуют средства управления доступом, но они переопределяются вашим использованием
Я думаю, вы могли бы добавить псевдоним или функцию, чтобы гарантировать, что это никогда не может быть запущено.
источник
Если использование системного файлового пространства не является огромным (а в наши дни «огромное» означает «сотни гигабайт или более»), создайте несколько экземпляров виртуальной машины и всегда работайте внутри одного. Восстановление просто повлечет за собой использование резервной копии.
Или вы можете создать chroot-тюрьму и работать внутри нее. Вам все равно понадобится некоторое восстановление, если оно будет уничтожено, но с работающей (закрытой) системой было бы легче работать.
источник
rm
сsafe-rm
помогает, по крайней мере..project_root
или, если файловая система его поддерживает, атрибут самого каталога. Затем сценарий поднимался по дереву файлов в поисках корня проекта и жаловался, что текущий каталог отсутствует в проекте. Или, если все проекты живут в одном месте, сценарий может потребовать, чтобы вы назвали проект. Вы все еще можете удалить неправильный проект, но не уничтожить всю систему.chroot
будет использовать что-то вроде Docker (который я думаю, на самом деле используетchroot
под прикрытием). Для других файлов, которые вам просто нужно прочитать, смонтируйте файловую систему только для чтения.rm
Это очень старая команда Unix, и, вероятно, она не была разработана с учетом удобства использования. Он пытается сделать именно то, о чем его просят, когда у него есть разрешения. Подводный камень для многих новых пользователей заключается в том, что они часто видят кодsudo
и не особо задумываются об его использовании. Функции , которые непосредственно изменяют файлы , такие какrm
,dd
,chroot
и т.д. требуют крайней осторожности в использовании.В настоящее время я люблю использовать
trash
(без sudo) из trash-cli . Он работает как корзина из Windows, так как вы можете легко получить случайно удаленные файлы. В Ubuntu уже есть папка «Корзина» и встроенная функция «Переместить в корзину».Даже в этом случае вы можете ошибаться, поэтому обязательно делайте резервные копии всей вашей файловой системы.
источник