Вопрос: Как предотвратить случайный rm -rf / *?


Я просто побежал rm -rf /* случайно, но я имел в виду rm -rf ./* (обратите внимание на звезду после косой черты).

alias rm='rm -i' а также --preserve-root по умолчанию не спас меня, так есть ли какие-либо автоматические гарантии для этого?


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


О мышлении дважды и использовании мозга. Я использую это на самом деле! Но я использую его для решения сложной задачи программирования с участием 10 разных вещей. Я погружен в эту задачу достаточно глубоко, нет никакой мозговой силы для проверки флагов и путей, я даже не думаю о командах и аргументах, я думаю с точки зрения таких действий, как «пустой текущий каталог», другая часть моего мозга переводит их в команды, а иногда делает ошибки. Я хочу, чтобы компьютер исправил их, по крайней мере, опасные.


155
2017-12-02 17:09


Источник


FYI, вы также можете сделать rm -rf . /mydir вместо rm -rf ./mydir и убить любой каталог, в котором вы были. Я считаю, что это происходит чаще. - user606723
Чтобы использовать аналогию с оружием, этот вопрос говорит, пожалуйста, пистолет признает, что я нацелился на ногу и не стрелял, но я не хочу нести никакой ответственности за то, что не нацелил пистолет на мою ногу в первую очередь. Оружие и компьютеры - глупы, и если вы делаете глупое дело, вы получите эти результаты. Следуя аналогии с оружием, ничто не мешает вам болеть, кроме бдительности и практики. - slillibri
@slillibri За исключением этого rm это не пушка, это компьютерная программа, она мог достаточно умны, чтобы определить, что пользователь собирается удалить некоторые важные файлы и выпустить предупреждение (например, это действительно так, если вы попытаетесь сделать rm -rf / без звезды). - Valentin Nemcev
У пистолетов @slillibri есть сейфы. Просить, как повысить безопасность на rm команда является совершенно законным вопросом sysadmin. - Gilles
sudo rm / bin / rm не рекомендуется, но предотвратит большинство :-) - Paul


Ответы:


Один из трюков, которым я следую, - это поставить # в начале, используя rm команда.

root@localhost:~# #rm -rf /

Это предотвращает случайное выполнение rm в неправильном файле / каталоге. После проверки удалите # с начала. Этот трюк работает, потому что в Bash слово, начинающееся с # вызывает игнорирование слова и всех остальных символов в этой строке. Таким образом, команда просто игнорируется.

ИЛИ

Если вы хотите предотвратить какой-либо важный каталог, есть еще один трюк.

Создайте файл с именем -i в этом каталоге. Как создать такой нечетный файл? С помощью touch -- -i или touch ./-i

Теперь попробуйте rm -rf *:

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

Здесь * будет расширяться -i в командной строке, поэтому ваша команда в конечном итоге становится rm -rf -i, Таким образом команда выведет запрос перед удалением. Вы можете поместить этот файл в свой /, /home/, /etc/, и т.д.

ИЛИ

использование --preserve-root как вариант rm, в rm включены в новые coreutils пакетов, этот параметр является значением по умолчанию.

--preserve-root
              do not remove `/' (default)

ИЛИ

использование сейф-ет

Выдержка из веб-сайта:

Safe-rm - это инструмент безопасности, предназначенный для предотвращения случайного удаления   важных файлов, заменив / bin / rm на обертку, которая проверяет   данные аргументы против настраиваемого черного списка файлов и   которые никогда не должны удаляться.

Пользователи, которые пытаются удалить один из этих защищенных файлов или   каталоги не смогут этого сделать, и будет показано предупреждение   вместо этого:

$ rm -rf /usr
Skipping /usr

212
2017-12-02 23:36



safe-rm выглядит очень хорошо, глядя в него сейчас ... - Valentin Nemcev
safe-rm опрятен. Также это отличный трюк с -i файл. Хах. Глупый баш. - EricR
Удивительно, какая какая-то хитрость в Unix. - WernerCD
Создающий файл с именем -i - абсолютно чистый гений. Я мог бы использовать это примерно год назад, когда я случайно запустил rm -rf / etc / * на VPS ... (к счастью, я беру ночные снимки, поэтому смог восстановить менее чем за 45 минут). - David W
Это гениально. Волшебство было бы touch -- -rf - Mircea Vutcovici


Твоя проблема:

Я просто запускал rm -rf / * случайно, но я имел в виду rm -rf ./* (обратите внимание на звезду после косой черты).

Решение: Не делай этого! На практике не используйте ./ в начале пути. Слэш не добавляет значения команде и вызывает только путаницу.

./*означает то же самое, что и *, поэтому вышеприведенная команда лучше написана так:

rm -rf *

Вот связанная с этим проблема. Я часто вижу следующее выражение, где кто-то предположил, что FOO задано как-то вроде /home/puppies, Я видел это только сегодня, в документации от крупного поставщика программного обеспечения.

rm -rf $FOO/

Но если FOO не задано, это будет rm -rf /, который попытается удалить все файлы в вашей системе. Конечная косая черта не нужна, так как практика не использует ее.

Следующее будет делать то же самое и с меньшей вероятностью испортит вашу систему:

rm -rf $FOO

Я усвоил эти советы. Когда у меня была первая учетная запись суперпользователя 14 лет назад, я случайно побежал rm -rf $FOO/ изнутри скрипта оболочки и уничтожить систему. 4 других системных администратора посмотрели на это и сказали: «Да. Каждый делает это один раз. Теперь вот ваш установочный носитель (36 дискет). Пойдите, исправьте это.

Другие люди здесь рекомендуют решения, такие как --preserve-root а также safe-rm, Однако эти решения отсутствуют для всех Un * xe-varients и могут не работать на Solaris, FreeBSD и MacOSX. К тому же, safe-rm требует, чтобы вы устанавливали дополнительные пакеты на каждую используемую вами Linux-систему. Если вы полагаетесь safe-rm, что происходит, когда вы начинаете новую работу, и у них нет safe-rm установлен? Эти инструменты являются костылем, и гораздо лучше полагаться на известные дефолты и улучшать ваши рабочие привычки.


41
2017-12-02 18:58



Мой друг сказал мне, что никогда не использует rm -rf *, Он всегда сначала меняет каталог и использует конкретную цель. Причина в том, что он много использует историю оболочки, и он обеспокоен тем, что такая команда в его истории может появиться в неподходящее время. - haggai_e
@haggai_e: Хороший совет. Когда я был новичком в Unix, я побежал, однажды столкнулся с ошибкой, где rm -rf * также удалено . а также .., Я был root, и это пересекло в более низкие каталоги, как ../../.., и был довольно разрушительным. Я стараюсь быть очень осторожным с rm -rf * с тех пор. - Stefan Lasiewski
rm -rf $FOO не поможет, если вам нужно rm -rf $FOO/$BAR, cd $FOO && rm -rf $BAR поможет, хотя и дольше. - Victor Sergienko
@VictorSergienko, с bash, как насчет указания ${FOO:?}, как в rm -rf ${FOO:?}/ а также rm -rf ${FOO:?}/${BAR:?}, Это не позволит ему когда-либо трансформироваться в rm -rf /, У меня есть дополнительная информация об этом в моем ответе Вот, - A-B-B
@haggai_e: Я нахожу это одним из лучших советов по этой теме. Я сжег свой палец, используя rm -rf * в цикле for, который по ошибке изменился на неправильный каталог и в итоге удалил что-то еще. Если бы я использовал конкретную цель, у нее было бы намного меньше шансов удалить неправильную вещь. - richk


Поскольку это на «Serverfault», я хотел бы сказать следующее:

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

У вас должен быть план восстановления поврежденной службы с наименьшим возможным MTTR.


30
2017-12-02 20:42



И вы должны использовать виртуальную машину или запасную коробку для практики восстановления - выяснить, что не работает, и уточнить этот план. Мы входим в двухнедельную перезагрузку - потому что в нашем здании произошли энергетические искажения, и каждый раз это было болезненно. Сделав несколько запланированных остановок всех стоек, мы сократили его с нескольких дней работы примерно до 3 часов - каждый раз мы узнаем, какие биты для автоматизации / исправления скриптов init.d и т. Д. - Danny Staple
И попробуйте эту команду на виртуальной машине. Это интересно! Но сначала сделайте снимок. - Stefan Lasiewski


Лучшие решения включают изменение ваших привычек, которые нельзя использовать rm непосредственно.

Один из подходов - запустить echo rm -rf /stuff/with/wildcards* первый. Убедитесь, что вывод из подстановочных знаков выглядит разумным, а затем используйте историю оболочки для выполнения предыдущей команды без echo,

Другим подходом является ограничение echo команду к случаям, где ослепительно очевидно, что вы будете удалять. Вместо того, чтобы удалять все файлы в каталоге, удалите каталог и создайте новый. Хорошим методом является переименование существующего каталога в DELETE-foo, затем создайте новый каталог foo с соответствующими разрешениями и, наконец, удалить DELETE-foo, Преимущество этого метода заключается в том, что команда, введенная в вашу историю, rm -rf DELETE-foo,

cd ..
mv somedir DELETE-somedir
mkdir somedir                 # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir             # just to make sure we're deleting the right thing
rm -rf DELETE-somedir

Если вы действительно настаиваете на удалении кучи файлов, потому что вам нужно, чтобы каталог оставался (потому что он всегда должен существовать или потому, что у вас не будет разрешения на его воссоздание), переместите файлы в другой каталог и удалите этот каталог ,

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

(Нажми Alt+, ключ).

Удаление каталога изнутри было бы привлекательным, потому что rm -rf . следовательно, имеет низкий риск опечаток. К сожалению, типичные системы не позволяют делать это. Вы можете rm -rf -- "$PWD" вместо этого, с более высоким риском опечаток, но большинство из них приводят к удалению ничего. Помните, что это оставляет опасную команду в истории вашей оболочки.

Всякий раз, когда вы можете, используйте контроль версий. Вы не rm, вы cvs rm или что-то еще, и это невозможно.

У Zsh есть опции, чтобы вы предлагали перед запуском rm с аргументом, который перечисляет все файлы в каталоге: rm_star_silent (по умолчанию) перед выполнением запроса rm whatever/*, а также rm_star_wait (по умолчанию отключено) добавляет 10-секундную задержку, в течение которой вы не можете подтвердить. Это ограниченное использование, если вы намерены удалить все файлы в какой-либо директории, потому что вы будете ожидать приглашения уже. Это может помочь предотвратить опечатки, как rm foo * для rm foo*,

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


23
2017-12-02 22:33



mv -t DELETE_ME -- * является немного более надежным. - Tobu
@Giles Не использовать rm напрямую - хороший совет! Еще лучшей альтернативой является использовать find команда, - aculich
И если вам нужно, чтобы каталог оставался, вы можете сделать это довольно просто, используя find somedir -type f -delete который удалит все файлы в somedir но оставит каталог и все подкаталоги. - aculich


Вы всегда можете сделать псевдоним, как вы упомянули:

what_the_hell_am_i_thinking() {
   echo "Stop." >&2
   echo "Seriously." >&2
   echo "You almost blew up your computer." >&2
   echo 'WHAT WERE YOU THINKING!?!?!' >&2
   echo "Please provide an excuse for yourself below: " 
   read 
   echo "I'm sorry, that's a pathetic excuse. You're fired."
   sleep 2
   telnet nyancat.dakko.us
}

alias rm -fr /*="what_the_hell_am_i_thinking"

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


18
2017-12-02 17:16



+1 для telnet miku.acm.uiuc.edu - Ali
alias echo = "telnet miku.acm.uiuc.edu" - kubanczyk
Я не должен быть достаточно старой школы ... Каково значение telnet miku.acm.uiuc.edu? - Kyle Strand
Попробуйте и узнайте. Это не разрушительно. Если вы как параноик, как и должно быть, запустите на виртуальной машине. - Naftuli Kay
-1 Вы не можете использовать псевдонимы с пробелами в них, не говоря уже о / *, что является недопустимым именем - xenithorb


Да. Не работайте как root, и всегда думайте дважды, прежде чем действовать.

Кроме того, посмотрите на что-то вроде https://launchpad.net/safe-rm,


15
2018-02-26 05:50



Упоминается, как работать с правами root - Valentin Nemcev
@Valentin: o_O !! - Jonathan Rioux


Самый простой способ предотвратить случайное rm -rf /* заключается в том, чтобы избежать использования rm команда! На самом деле, я всегда испытывал искушение rm /bin/rm полностью избавиться от команды! Нет, я не шучу.

Вместо этого используйте -delete вариант find команда, но сначала перед удалением файлов я рекомендую просмотреть, какие файлы вы будете удалять:

find | less

Обратите внимание, что в современных версиях find если вы не укажете имя каталога, оно будет неявно использовать текущий каталог, поэтому приведенное выше эквивалентно:

find . | less

После того, как вы уверены, что это файлы, которые вы хотите удалить, вы можете добавить -delete опция:

find path/to/files -delete

Таким образом, не только find  более безопасный для использования, он также более выразителен, поэтому, если вы хотите удалить только определенные файлы в иерархии каталогов, которые соответствуют определенному шаблону, вы можете использовать это выражение для предварительного просмотра, а затем удалить файлы:

find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete

Существует множество веских причин для изучения и использования find кроме того, безопаснее rm, так что вы поблагодарите себя позже, если вы потратите время, чтобы научиться использовать find,


15
2017-12-03 22:44



Очень интересная дискуссия. Мне нравится ваш подход и сделанный небольшой фрагмент. Это супер неэффективно, так как он вызывает поиск не более 3 раз, но для меня это хороший старт: github.com/der-Daniel/fdel - Daniel Hitzel