Я просто побежал rm -rf /*
случайно, но я имел в виду rm -rf ./*
(обратите внимание на звезду после косой черты).
alias rm='rm -i'
и --preserve-root
по умолчанию меня не спасли, так есть ли автоматические меры предосторожности для этого?
Я не был root и отменил команду немедленно, но где-то были какие-то смягченные разрешения или что-то в этом роде, потому что я заметил, что моя подсказка Bash уже сломалась. Я не хочу полагаться на разрешения и не быть пользователем root (я мог бы сделать ту же ошибку с sudo
), и я не хочу охотиться на таинственные ошибки из-за одного отсутствующего файла в системе, поэтому резервные копии и sudo
это хорошо , но я бы хотел что-то лучше для этого конкретного случая.
О размышлении дважды и использовании мозга. Я использую это на самом деле! Но я использую его для решения какой-то сложной задачи программирования, включающей 10 разных вещей. Я достаточно глубоко погружен в эту задачу, у меня не осталось мозгов для проверки флагов и путей, я даже не думаю с точки зрения команд и аргументов, я думаю с точки зрения таких действий, как «пустой текущий каталог», другая часть моего мозга переводит их в команды и иногда делает ошибки. Я хочу, чтобы компьютер их исправил, хотя бы опасные.
rm -rf . /mydir
вместоrm -rf ./mydir
и убить любой каталог, в котором вы были. Я считаю, что это происходит чаще.rm
это не пистолет, это компьютерная программа, она может быть достаточно умной, чтобы определить, что пользователь собирается удалить некоторые важные файлы и выдать предупреждение (как на самом деле, если вы пытаетесь обойтисьrm -rf /
без звездочки).rm
команды, является вполне законным вопросом сисадмина.Ответы:
Один из приемов, которым я следую, заключается в том, чтобы
#
в начале использоватьrm
команду.Это предотвращает случайное выполнение
rm
в неправильном файле / каталоге. После проверки удалите#
с начала. Этот прием работает, потому что в Bash слово, начинающееся с,#
приводит к тому, что это слово и все остальные символы в этой строке игнорируются. Так что команда просто игнорируется.ИЛИ ЖЕ
Если вы хотите предотвратить любую важную директорию, есть еще одна хитрость.
Создайте файл с именем
-i
в этом каталоге. Как создать такой странный файл? Используяtouch -- -i
илиtouch ./-i
Теперь попробуйте
rm -rf *
:Здесь он
*
будет расширен-i
до командной строки, поэтому ваша команда в конечном итоге станетrm -rf -i
. При этом команда подскажет перед удалением. Вы можете поместить этот файл в вашем/
,/home/
,/etc/
и т.д.ИЛИ ЖЕ
Используйте
--preserve-root
в качестве опцииrm
. Вrm
включенных в более новыеcoreutils
пакеты эта опция используется по умолчанию.ИЛИ ЖЕ
Используйте Safe-RM
Выдержка из веб-сайта:
источник
-i
файлом. Хах. Глупый ударtouch -- -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-переменных и могут не работать на Solaris, FreeBSD и MacOSX. Кроме того,safe-rm
требуется, чтобы вы установили дополнительные пакеты в каждой используемой вами системе Linux. Если вы полагаетесьsafe-rm
, что произойдет, когда вы начнете новую работу, и они неsafe-rm
установлены? Эти инструменты являются опорой, и гораздо лучше полагаться на известные значения по умолчанию и улучшить свои рабочие привычки.источник
rm -rf *
. Сначала он всегда меняет каталог и использует конкретную цель. Причина в том, что он часто использует историю оболочки, и его беспокоит, что такая команда в его истории может появиться в неподходящее время.rm -rf *
также удалены.
и..
. Я был root, и это перешло в нижние каталоги вроде../../..
, и было довольно разрушительным. Сrm -rf *
тех пор я стараюсь быть очень осторожным .rm -rf $FOO
не поможет , если вам нужноrm -rf $FOO/$BAR
.cd $FOO && rm -rf $BAR
поможет, хотя это намного дольше.${FOO:?}
, как вrm -rf ${FOO:?}/
иrm -rf ${FOO:?}/${BAR:?}
. Это предотвратит его когда-либо перевести наrm -rf /
. У меня есть больше информации об этом в моем ответе здесь .rm -rf *
цикл for, который по ошибке изменился на неправильный каталог и в итоге удалил что-то еще. Если бы я использовал конкретную цель, у нее был бы гораздо меньший шанс удалить не ту вещь.Так как это на «Serverfault», я хотел бы сказать следующее:
Если у вас есть десятки или несколько серверов, с довольно большой группой администраторов / пользователей, кто собирается
rm -rf
илиchown
неправильной директории.У вас должен быть план для восстановления поврежденной услуги с минимально возможным MTTR.
источник
Лучшие решения включают изменение ваших привычек, чтобы не использовать их
rm
напрямую.Один из подходов - бежать
echo rm -rf /stuff/with/wildcards*
первым. Убедитесь, что выходные данные из подстановочных знаков выглядят разумно, затем используйте историю оболочки для выполнения предыдущей команды безecho
.Другой подход - ограничить
echo
команду случаями, когда совершенно очевидно, что вы будете удалять. Вместо того, чтобы удалять все файлы в каталоге, удалите каталог и создайте новый. Хороший метод - переименовать существующий каталогDELETE-foo
, затем создать новый каталогfoo
с соответствующими разрешениями и, наконец, удалитьDELETE-foo
. Дополнительным преимуществом этого метода является то, что команда, введенная в вашу историю, являетсяrm -rf DELETE-foo
.Если вы действительно настаиваете на удалении группы файлов, потому что вам нужно, чтобы каталог оставался (потому что он должен существовать всегда, или потому что у вас не будет разрешения на его воссоздание), переместите файлы в другой каталог и удалите этот каталог. ,
(Нажмите эту кнопку 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
, ожидая подтверждения… и затем вы будете восстанавливать резервные копии.источник
mv -t DELETE_ME -- *
немного более надежныйrm
- это хороший совет! Еще лучшей альтернативой является использованиеfind
команды .find somedir -type f -delete
который удалит все файлы в нем,somedir
но оставит каталог и все подкаталоги.Вы всегда можете сделать псевдоним, как вы упомянули:
Вы также можете интегрировать его с клиентом командной строки для твиттера, чтобы предупредить своих друзей о том, что вы почти унижаете себя, стирая жесткий диск с
rm -fr /*
правами root.источник
telnet miku.acm.uiuc.edu
?Да: не работайте как root и всегда дважды подумайте, прежде чем действовать.
Кроме того, посмотрите на что-то вроде https://launchpad.net/safe-rm .
источник
Самый простой способ предотвратить случайное использование
rm -rf /*
- избегать любого использованияrm
команды! На самом деле, я всегда испытывал желание бежать,rm /bin/rm
чтобы полностью избавиться от команды! Нет, я не шучуВместо этого используйте
-delete
параметрfind
команды , но сначала перед удалением файлов я рекомендую предварительно просмотреть, какие файлы вы будете удалять:Обратите внимание, что в современных версиях,
find
если вы пропустите имя каталога, он будет неявно использовать текущий каталог, поэтому приведенное выше эквивалентно:Убедившись, что это файлы, которые вы хотите удалить, вы можете добавить
-delete
опцию:Таким образом, не только
find
безопаснее в использовании, но и более выразительным , поэтому, если вы хотите удалить только определенные файлы в иерархии каталогов, которые соответствуют определенному шаблону, вы можете использовать выражение, подобное этому, для предварительного просмотра, а затем удалить файлы:Есть много веских причин для изучения и использования,
find
кроме просто более безопасногоrm
, поэтому вы поблагодарите себя позже, если найдете время, чтобы научиться использоватьfind
.источник
В этой теме есть несколько действительно плохих советов, к счастью, большинство из них было отклонено.
Прежде всего, когда вам нужно быть пользователем root, станьте пользователем root - sudo, и различные трюки с псевдонимами сделают вас слабыми. И что еще хуже, они сделают тебя небрежным. Научитесь делать все правильно, прекратите полагаться на псевдонимы, чтобы защитить вас. Однажды вы получите root на коробке, в которой нет тренировочных колес, и что-нибудь взорвете.
Второе - когда у вас есть root, думайте о себе, как о водителе автобуса, полном школьников. Иногда вы можете услышать песню по радио, но иногда вам нужно смотреть в обе стороны, замедлять ход событий и перепроверять все свои зеркала.
В- третьих - Вы вряд ли когда - нибудь действительно нужно
rm -rf
- более вероятно , что вы хотитеmv something something.bak
илиmkdir _trash && mv something _trash/
В-четвертых - всегда
ls
ваш подстановочный знакrm
- нет ничего сумасшедшего в том, чтобы смотреть на что-то, прежде чем уничтожить это навсегда.источник
ls
.find
команды .find . -name '*~'
пример. Яls
хочу сказать, что в списке будет тот же глобус, которыйrm
будет использовать.Это стандартно для меня специально для регулярных выражений в контексте rm, но в этом случае это спасло бы вас.
Я всегда делаю в
echo foo*/[0-9]*{bar,baz}*
первую очередь, чтобы увидеть, что регулярное выражение будет соответствовать. Как только я получу вывод, я вернусь к редактированию командной строки и перейдуecho
наrm -rf
. Я никогда не используюrm -rf
регулярные выражения .источник
*
имеет очень точное определение, называемое Клини Стар, который является унарным оператором, который соответствует нулю или нескольким элементам набора, к которому он применяется (в случае регулярных выражений, символ или набор символов, предшествующий Kleene Star), в то время как в шарлатанстве*
совпадает все, что в схеме, которая следует. Они семантически сильно отличаются, даже если они имеют похожий синтаксис.Решением этой проблемы является регулярное резервное копирование. Каждый раз, когда вы производите что-то, что не хотите рисковать, поддерживайте это. Если вы обнаружите, что резервное копирование регулярно слишком болезненно, то упростите процесс, чтобы не причинять боль.
Например, если вы работаете с исходным кодом, используйте инструмент, например,
git
чтобы отразить код и сохранить историю на другом компьютере. Если вы работаете с документами, имейте скрипт, которыйrsync
отправляет ваши документы на другой компьютер.источник
Похоже, что лучший способ уменьшить этот риск - это двухэтапное удаление, как в большинстве графических интерфейсов. То есть замените rm чем-то, что перемещает вещи в каталог корзины (на том же томе). Затем очистите этот мусор после того, как пройдет достаточно времени, чтобы заметить любую ошибку.
Одной из таких утилит, трэш-кли, обсуждается на Unix StackExchange, здесь .
источник
rm
.Одним из важных ключевых факторов, позволяющих избежать подобных ошибок, является отсутствие входа в систему с использованием учетной записи root. Когда вы входите в систему, используя обычного непривилегированного пользователя, вы должны использовать
sudo
для каждой команды. Итак, вы должны быть более осторожными.источник
sudo
и резервном копировании. Посмотрите на эту страницу: forum.synology.com/wiki/index.php/… . Это говорит о создании корзины. Надеюсь это поможет!Когда я рекурсивно удаляю каталог, я помещаю
-r
, и,-f
если применимо, в конец команды, напримерrm /foo/bar -rf
. Таким образом, если я случайно нажму Enter слишком рано, еще не набрав весь путь, команда не будет рекурсивной, поэтому, скорее всего, безвредной. Если после того/foo
, как я попытаюсь набрать косую черту , я нажму Enter , я написалrm /foo
вместоrm -rf /foo
.Это хорошо работает в системах, использующих GNU coreutils, но утилиты в некоторых других Unixes не позволяют размещать опции в конце таким образом. К счастью, я не использую такие системы очень часто.
источник
Это может быть сложно, но вы можете настроить роли в SELinux так, что даже если пользователь становится пользователем root с помощью sudo su - (или обычного su), возможность удаления файлов может быть ограничена (вам необходимо войти в систему как root, чтобы удалить файлы). Если вы используете AppArmor, вы можете сделать что-то подобное .
Конечно, другим решением было бы убедиться, что у вас есть резервные копии. :)
источник
Избегайте использования потертостей . В Bash вы можете установить
noglob
. Но опять же, когда вы переходите в систему,noglob
которая не установлена, вы можете забыть об этом и действовать так, как если бы это было.Установите,
noclobber
чтобы предотвратитьmv
иcp
уничтожить файлы тоже.Используйте файловый браузер для удаления. Некоторые файловые браузеры предлагают мусорную корзину (например, Konqueror ).
Другой способ избежать тряски - это следующее. В командной строке я
echo filenamepattern >> xxx
. Затем я редактирую файл с помощью Vim или vi, чтобы проверить, какие файлы должны быть удалены (обратите внимание на символы шаблонов имен файлов в файлах.), А затем использую,%s/^/rm -f/
чтобы превратить каждую строку в команду удаления. Источник ххх. Таким образом, вы видите каждый файл, который будет удален перед этим.Переместить файлы в чердак каталог или tarball. Или используйте контроль версий (как я уже говорил).
источник
find
команды .ZSH спрашивает меня (по умолчанию) перед выполнением
rm -rf *
.источник
С
chattr
другой стороны, не так уж много гарантий того, чтобы root запускал такую команду. Вот почему правильные группы и осторожные команды важны при запуске привилегированных.В следующий раз; удалите файлы, которые вы планируете удалить - пропустите 'f'
rm -rf
или используйте ихfind
и передайтеxargs rm
источник
find
, но я рекомендую более безопасный способ использования в моем ответе . Нет необходимости использовать,xargs rm
поскольку все современные версииfind
имеют-delete
опцию . Кроме того , чтобы безопасно использоватьxargs rm
вам также нужно использоватьfind -print0
и вxargs -0 rm
противном случае вы будете иметь проблемы , когда вы сталкиваетесь вещи , как имена файлов с пробелами.find
является хорошим предложением, однако нюансыxargs
важны, если вы предлагаете использовать его, в противном случае это приводит к путанице и разочарованию при обнаружении файлов с пробелами (чего можно избежать с помощью этой-delete
опции).Некоторые псевдонимы безопасности для других команд, чтобы предотвратить подобные бедствия, найдены здесь :
Обратите внимание на верхний регистр
-I
, он отличается от-i
:источник
Я обычно использую
-v
флаг, чтобы увидеть, что удаляется, и у меня есть шанс^C
быстро, если у меня есть малейшее сомнение. На самом деле это не способ предотвратить плохоеrm
, но это может быть полезно для ограничения ущерба в случае, если что-то пойдет не так.источник
Мой процесс удаления на Unix-машинах выглядит следующим образом.
ls /path/to/intented/file_or_directory
в окне терминала, а затем нажмитеreturn
(илиTab
, по желанию), чтобы увидеть список файлов.Если все выглядит хорошо,
нажмите кнопку, чтобы
up arrow
снова извлечьls /path/to/intented/file_or_directory
из истории терминала.замените
ls
наrm
илиrm -r
илиrm -rf
, если требуется. Я лично не люблю использовать-f
флаг.Этот процесс проверки также предотвращает преждевременное выполнение
rm
команды, что произошло со мной, прежде чем я начал следовать этому процессу.источник
find
как я объясняю в своем ответе .Если у вас нет настроения приобретать новые привычки прямо сейчас,
.bashrc/.profile
это хорошее место, чтобы добавить несколько тестов, чтобы проверить, собираетесь ли вы сделать что-то глупое. Я подумал, что в функции Bash я могу найти шаблон, который может испортить мой день, и придумал следующее:Хорошо, что это всего лишь Bash.
В этой форме он явно недостаточно универсален, но я думаю, что у него есть потенциал, поэтому, пожалуйста, оставьте несколько идей или комментариев.
источник
find
команду . Кроме того, я не понимаю, почему вы говорите, что «хорошо, что это только Bash»? Рекомендуется избегать ошибок в сценариях .set -f
что эквивалентноset -o noglob
в Bash, но это все еще не объясняет ваше утверждение, что «хорошо в этом то, что это только Bash». Вместо этого вы можете устранить проблему полностью и в общем виде для любой оболочки, не используяrm
вообще, а скорее используяfind
команду . Вы действительно попробовали это предложение, чтобы увидеть, как оно сравнивается с тем, что вы предлагаете здесь?К сожалению, я не могу оставить комментарий выше из-за недостаточной кармы, но хотел предупредить других, что safe-rm не является панацеей от случайных кошмаров массового удаления.
Следующее было протестировано на виртуальной машине Linux Mint 17.1 (предупреждение для тех, кто не знаком с этими командами: НЕ ДЕЛАЙТЕ ЭТОГО! На самом деле, даже те, кто знаком с этими командами, не должны / не будут делать этого, чтобы избежать катастрофической потери данных):
Текстовая версия (сокращенно):
Версия изображения (полная):
источник
Мне нравится подход окна корзины.
Я обычно создаю каталог с именем "/ tmp / recyclebin" для всего, что мне нужно удалить:
И никогда не используйте rm -rf, я всегда использую:
Затем позже я очищаю корзину, используя скрипт или вручную.
источник
Хе-хе (непроверенный и несколько шутливый!)
А потом:
Реально, у вас должна быть умственная пауза перед выполнением такого рода операции с глобом, независимо от того, работаете ли вы от имени пользователя root, добавляете к нему «sudo» и т. Д. Вы можете запустить «ls» для того же глобуса и т. Д., но, мысленно, вам следует остановиться на секунду, убедиться, что вы набрали то, что хотели, убедитесь, что то, что вы хотите, на самом деле то, что вы хотите, и т. д. Я полагаю, что это то, чему в основном учат, разрушая что-то в первый год как Unix SA, так же, как горячая горелка - хороший учитель, который говорит вам, что что-то на плите может быть горячим.
И убедитесь, что у вас есть хорошие резервные копии!
источник
Кроме того, не как средство защиты, а как способ выяснить, какие файлы были удалены до нажатия ^ C, вы можете использовать
locate
базу данных (конечно, только если она была установлена и сохраниласьrm
)Я узнал об этом из этого поста в блоге
источник
Просто используйте ZFS для хранения файлов, которые вам нужны для предотвращения случайного удаления, и создайте демон, который:
Если файлы удалены, перезаписаны, повреждены, что угодно, просто откатите вашу файловую систему до клона последнего хорошего снимка, и все готово.
источник
не столько ответ, сколько совет, я всегда
rm (dir) -rf
неrm -rf (dir)
то есть: не становитесь ядерными до самого последнего момента.Это помогает смягчить ситуации, в которых вы набираете жирный палец таким образом, чтобы оно оставалось действительным, например скольжение и нажатие клавиши ввода.
источник
rm
, где параметры должны предшествовать именам файлов.Я думаю, что это мощный совет по предупреждению, с ярлыком расширения * в оболочке:
Во-первых, введите
rm -rf *
илиrm -rf your/path/*
, не вводитеEnter
ключ. (конечно, вы должны иметь привычку не нажимать Enter быстро / случайно при использованииrm -rf
)Затем нажмите
Alt-Shift-8
(т.е.Alt-Shift-*
), чтобы развернуть подстановочный знак «*» явно в bash. Это также позволяет избежать повторного ввода команды «rm -rf *» при навигации по истории.Наконец, после того, как проверено расширение имеет правильные файлы / каталоги, нажмите Enter.
Готово.
источник
В случае, если это помогает кому-то для их собственного случая:
1. Используйте
rmsafe
:Он перемещает файлы в «мусорную» папку, и у вас всегда есть возможность вернуть их с помощью простого
mv
:Источник: https://github.com/pendashteh/rmsafe
2. Используйте
safe
:Вы можете установить псевдоним для
rm
использования safe:Теперь, если вы запустите,
rm /*
вы получите это в ответ:и я верю, что ты не будешь печатать
y
!Источник: https://github.com/pendashteh/safe
источник