- Вопрос или проблема
- 1. Используйте rmsafe:
- 2. Используйте safe:
- Ответ или решение
- Как предотвратить случайное выполнение команды rm -rf /*?
- 1. Используйте безопасные альтернативы команды rm
- 2. Настройка алиасов и функций
- 3. Используйте командные предостережения
- 4. Правильное использование переменных окружения
- 5. Обратитесь к системным настройкам
- 6. Измените свои привычки
- Заключение
Вопрос или проблема
Я случайно выполнил rm -rf /*
, но хотел ввести rm -rf ./*
(заметьте звезду после косой черты).
alias rm='rm -i'
и --preserve-root
по умолчанию не спасли меня, так что существуют ли какие-либо автоматические меры предосторожности для этого?
Я не был root и сразу отменил команду, но где-то были какие-то послабления в разрешениях или что-то подобное, потому что я заметил, что мой Bash приглашение уже сломалось. Я не хочу полагаться на разрешения и на то, что я не root (я мог бы совершить ту же ошибку с sudo
), и я не хочу искать загадочные ошибки из-за одного отсутствующего файла где-то в системе, так что резервное копирование и sudo
хороши, но я хотел бы что-то лучшее для этого конкретного случая.
О том, чтобы дважды подумать и использовать мозг. Я на самом деле его использую! Но я использую его для решения некоторой сложной программной задачи, которая включает 10 различных вещей. Я погружен в эту задачу достаточно глубоко, у меня не осталось умственных ресурсов для проверки флагов и путей, я даже не думаю в терминах команд и аргументов, я думаю в терминах действий, таких как ‘очистить текущий каталог’, другая часть моего мозга переводит их в команды, и иногда он ошибается. Я хочу, чтобы компьютер их исправлял, по крайней мере опасные.
Одним из трюков, которые я использую, является добавление #
в начало при использовании команды 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: удалить обычный пустой файл `1`? n
rm: удалить регулярный пустой файл `2`?
Здесь *
развернется в -i
в командной строке, так что ваша команда в конечном итоге станет rm -rf -i
. Таким образом, команда запросит подтверждение перед удалением. Вы можете поместить этот файл в свой /
, /home/
, /etc/
и т. д.
ИЛИ
Используйте --preserve-root
как опцию для rm
. В rm
, входящем в более новые пакеты coreutils
, эта опция является значением по умолчанию.
--preserve-root
не удалять `/' (по умолчанию)
ИЛИ
Используйте safe-rm
Цитата с веб-сайта:
Safe-rm — это инструмент безопасности, предназначенный для предотвращения случайного удаления
важных файлов, заменяя /bin/rm на обертку, которая проверяет
указанные аргументы на предмет соответствия настраиваемому черному списку файлов и
каталогов, которые никогда не должны быть удалены.Пользователи, пытающиеся удалить один из этих защищенных файлов или
каталогов, не смогут этого сделать и вместо этого получат предупреждающее
сообщение:$ rm -rf /usr Пропуск /usr
Ваша проблема:
Я случайно выполнил 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
. Однако эти решения не присутствуют для всех дистрибутивов Unix и могут не работать на Solaris, FreeBSD и MacOSX. Кроме того, safe-rm
требует установки дополнительных пакетов на каждой системе Linux, которую вы используете. Если вы полагаетесь на safe-rm
, что произойдет, когда вы начнете новую работу, и у них не установлен safe-rm
? Эти инструменты являются костылем, и гораздо лучше полагаться на известные значения по умолчанию и улучшать свои привычки работы.
Поскольку это на “Serverfault”, мне хотелось бы сказать следующее:
Если у вас есть десятки или более серверов, с большой командой администраторов/пользователей, кто-то собирается выполнить rm -rf
или chown
на неправильном каталоге.
У вас должен быть план по восстановлению затронутого сервиса с минимальным временем восстановления.
Лучшие решения связаны с изменением ваших привычек, чтобы не использовать 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 # или rsync -dgop DELETE-somedir somedir для сохранения разрешений
ls DELETE-somedir # просто чтобы убедиться, что мы удаляем нужное
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
, находясь в уверенности в получении подтверждения… и в следующую минуту вам придется восстанавливать резервные копии.
Вы всегда можете создать псевдоним, как вы упомянули:
what_the_hell_am_i_thinking() {
echo "Стоп." >&2
echo "Серьезно." >&2
echo "Ты почти взорвал свой компьютер." >&2
echo 'ЧТО ТЫ ДУМАЛ?!?!!' >&2
echo "Пожалуйста, предоставьте оправдание ниже: "
read
echo "Извините, это жалкое оправдание. Вы уволены."
sleep 2
telnet nyancat.dakko.us
}
alias rm -fr /*="what_the_hell_am_i_thinking"
Вы также можете интегрировать это с клиентом командной строки Twitter, чтобы оповестить своих друзей о том, как вы чуть не унизили себя, очистив диск с помощью rm -fr /*
в качестве root.
Самый простой способ предотвратить случайное 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
.
В этой теме есть действительно плохие советы, к счастью, большинство из них было проголосовано против.
Прежде всего, когда вам нужно быть root, становитесь root – sudo
и различные псевдонимы сделают вас слабыми. И еще хуже, они сделают вас неосторожными. Учитесь делать все правильно, прекратите полагаться на псевдонимы, чтобы защищать вас. Однажды вы получите root на машине, которая не имеет ваших обучающих колес и сломаете что-то.
Во-вторых, когда у вас есть root, представляйте себя водителем автобуса, полным школьников. Иногда вы можете наслаждаться песней на радио, но в другие времена вам нужно смотреть по сторонам, замедлить движение и перепроверить все зеркала.
В-третьих, вы редко действительно должны rm -rf
– скорее вы хотите mv что-то что-то.bak
или mkdir _trash && mv что-то _trash/
В-четвертых, всегда ls
свою подстановку перед rm
– Ничего странного в том, чтобы посмотреть на что-то перед тем, как навсегда уничтожить это.
Да: Не работайте как root и всегда дважды думайте перед действием.
Также взгляните на что-то вроде https://launchpad.net/safe-rm.
Это моя стандартная мера предосторожности, касающаяся регулярных выражений в контексте rm, но она бы вас спасла в этом случае.
Я всегда сначала выполняю echo foo*/[0-9]*{bar,baz}*
, чтобы увидеть, на что регулярное выражение будет совпадать. Как только я получаю вывод, я возвращаюсь к редактированию командной строки и изменяю echo
на rm -rf
. Я никогда, никогда не использую rm -rf
на непроверенном регулярном выражении.
Решение этой проблемы — регулярно создавать резервные копии. Каждый раз, когда вы создаете что-то, что не хотите рисковать потерять, создавайте резервную копию. Если вы обнаружите, что регулярно делать резервные копии слишком болезненно, упростите процесс, чтобы он не был слишком болезненным.
Например, если вы работаете с исходным кодом, используйте инструмент, такой как git
, чтобы создать зеркальное отражение кода и сохранить историю на другой машине. Если вы работаете с документами, создайте скрипт, который будет rsync
ваших документов на другую машину.
Похоже, что лучший способ снизить этот риск — это реализовать двухступенчатое удаление, как в большинстве графических интерфейсов. То есть, заменить rm чем-то, что перемещает вещи в каталог ‘мусор’ (на том же томе). Затем очищать этот мусор после того, как прошло достаточно времени, чтобы заметить любую ошибку.
Одним из таких инструментов, trash-cli, обсуждается на Unix StackExchange.
Одним из важных факторов, чтобы избежать таких ошибок, является не входить в систему, используя учетную запись root. Когда вы входите как обычный пользователь без привилегий, вам нужно использовать sudo
для каждой команды. Так что вы должны быть более осторожными.
Когда я удаляю каталог рекурсивно, я ставлю -r
, и -f
, если это уместно, в конце команды, например, rm /foo/bar -rf
. Таким образом, если я случайно нажму Enter слишком рано, не завершив ввод всего пути, команда будет не рекурсивной, так что она, скорее всего, будет безвредной. Если я притяну Enter, пытаясь написать косую черту после /foo
, я написал rm /foo
, а не rm -rf /foo
.
Это хорошо работает на системах, использующих GNU coreutils, но утилиты на некоторых других Unix-системах не позволяют помещать опции таким образом в конце. К счастью, я не очень часто использую такие системы.
Мне нравится подход Windows с корзиной.
Обычно я создаю каталог с именем “/tmp/recyclebin” для всего, что мне нужно удалить:
mkdir /tmp/recyclebin
И никогда не использую rm -rf, я всегда использую:
mv целевой_каталог /tmp/recyclebin
Затем позже я очищаю корзину с помощью скрипта или вручную.
Это может быть сложно, но вы можете настроить роли в рамках SELinux так, чтобы даже если пользователь становится root через sudo su – (или просто su), возможность удаления файлов может быть ограничена (вам нужно войти в систему как root, чтобы удалить файлы). Если вы используете AppArmor, вы можете сделать что-то похожее.
Конечно, другое решение — это убедиться, что у вас есть резервные копии. 🙂
Мой процесс удаления на Unix-ориентированных системах таков.
- Введите
ls /path/to/intented/file_or_directory
в терминальном окне, затем нажмитеreturn
(илиTab
, как пожелаете), чтобы увидеть список файлов.
Если все выглядит хорошо,
-
Нажмите клавишу
вверх
, чтобы снова получитьls /path/to/intented/file_or_directory
из истории терминала. -
Замените
ls
наrm
илиrm -r
илиrm -rf
, в зависимости от необходимости. Лично я не люблю использовать флаг-f
.
Этот процесс проверки также предотвращает преждевременное выполнение команды rm
, что раньше случалось со мной, прежде чем я начал следовать этому процессу.
Избегайте использования глоббинга. В Bash вы можете установить noglob
. Но опять же, когда вы переходите на систему, где noglob
не установлен, вы можете забыть об этом и действовать так, как будто он установлен.
Установите noclobber
, чтобы предотвратить уничтожение файлов при использовании mv
и cp
.
Используйте файловый браузер для удаления. Некоторые файловые браузеры предлагают корзину (например, Konqueror).
Другой способ избежать глоббинга таков. В командной строке я echo filenamepattern >> xxx
. Затем я редактирую файл с помощью Vim или vi, чтобы проверить, какие файлы будут удалены (следите за символами шаблона имени файла), а затем использую %s/^/rm -f/
, чтобы превратить каждую строку в команду удаления. Исходный xxx. Таким образом, вы увидите каждый файл, который будет удален, перед его удалением.
Переместите файлы в каталог ‘чердак’ или архив. Или используйте систему контроля версий (как уже говорилось раньше).
ZSH спрашивает меня (по умолчанию) перед выполнением rm -rf *
.
Кроме того, ZSH также предоставляет плагин (zsh-safe-rm), чтобы добавить функциональность safe-rm
, так что rm
будет помещать файлы в корзину вашей ОС вместо того, чтобы навсегда их удалять.
Кроме chattr
, не так много мер предосторожности, чтобы не позволить root выполнять такую команду. Вот почему важны правильные группы и осторожные команды при выполнении привилегированных действий.
В следующий раз оцените файлы, которые вы собираетесь удалить — опустите ‘f’ из rm -rf
, или используйте find
и передайте это в xargs rm
Некоторые безопасные псевдонимы для других команд, чтобы предотвратить аналогичные несчастья, найдены здесь:
# функции безопасности
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -I' # 'rm -i' запрашивает подтверждение для каждого файла
alias ln='ln -i'
alias chown='chown --preserve-root'
alias chmod='chmod --preserve-root'
alias chgrp='chgrp --preserve-root'
Обратите внимание на заглавную букву -I
, она отличается от -i
:
запрашивает подтверждение перед удалением более чем трех файлов или при рекурсивном удалении. Менее навязчиво, чем -i, одновременно обеспечивая защиту от большинства ошибок
Просто используйте ZFS для хранения файлов, которые вам нужно защитить от случайного удаления, и имейте демон, который:
- регулярно создает снимки этой файловой системы
- удаляет более старые/ненужные снимки.
Если файлы удаляются, перезаписываются, повреждаются и так далее, просто откатите свою файловую систему на клонированный последний хороший снимок, и все.
Если у вас нет настроения приобретать новые привычки прямо сейчас, .bashrc/.profile
— это хорошее место, чтобы добавить некоторые проверки, чтобы узнать, собираетесь ли вы сделать что-то глупое.
Я придумал в функции Bash, как я мог бы grep на шаблон, который может испортить мой день, и вот что вышло:
alias rm='set -f; myrm' #set -f отключает расширение подстановок, это нужно сделать вне
#функции, чтобы получить "сырое" значение.
myrm() {
ARGV="$*"
set +f #противоположно set -f
if echo "$ARGV" | grep -e '-rf /*' \
-e 'другой страшный шаблон'
then
echo "Не управляйте тяжелой техникой под воздействием этого лекарства"
return 1
else
/bin/rm $@
fi
}
Хорошо то, что это работает только в Bash.
Это явно не настолько универсально в такой форме, но я думаю, что с ним есть потенциал, так что, пожалуйста, публикуйте идеи или комментарии.
К сожалению, я не могу оставить комментарий выше из-за недостатка кармы, но хотел бы предостеречь других, что safe-rm не является панацеей от кошмаров случайного массового удаления.
Следующее было протестировано на виртуальной машине Linux Mint 17.1 (предупреждение для тех, кто незнаком с этими командами: НЕ ДЕЛАЙТЕ ЭТО! На самом деле, даже те, кто знаком с этими командами, вероятно, никогда не сделают этого, чтобы избежать катастрофической потери данных):
Текстовая версия (сжато):
$ cd /
$ sudo safe-rm -rf *
$ ls
bash: /bin/ls: Нет такого файла или каталога
Изображение (полная версия):
Я думаю, что это мощный совет по предотвращению, связанный с расширением подстановки в оболочке:
Сначала введите rm -rf *
или rm -rf your/path/*
, НИ В КОЕМ СЛУЧАЕ не нажимайте клавишу Enter
. (Конечно, вы должны иметь привычку не нажимать Enter слишком быстро/случайно при использовании rm -rf
)
Затем нажмите Alt-Shift-8
(т.е. Alt-Shift-*
), чтобы явно развернуть подстановочный символ “*” в bash. Это также предотвратит повторный ввод команды “rm -rf *” при навигации по истории.
Наконец, после проверки, что развертывание содержит правильные файлы/каталоги, нажмите Enter.
Готово.
На случай, если это поможет кому-то в их ситуации:
1. Используйте rmsafe
:
Он перемещает файлы в папку “корзина”, и у вас всегда есть возможность вернуть их с помощью простого mv
:
$ rmsafe /path/to/important/files
Источник: https://github.com/pendashteh/rmsafe
2. Используйте safe
:
Вы можете установить псевдоним для rm
с использованием safe:
$ alias rm="safe rm"
Теперь, если вы запустите rm /*
, вы получите такой ответ:
$ rm /*
Вы уверены, что хотите 'rm /bin /boot /data /dev /etc /home /initrd.img /lib /lib64 /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var'? [y/n]
И я уверен, что вы не введете y
!
Источник: https://github.com/pendashteh/safe
В дополнение ко всем другим решениям здесь, при выполнении большого rm
обычно используйте флаг -v
, чтобы видеть, что удаляется, и иметь возможность быстро нажать ^C
, если у меня возникнет хоть малейшее сомнение. Это не совсем способ предотвратить плохие rm
, но это может быть полезно, чтобы ограничить ущерб в случае, если что-то пойдет не так.
Хе-хе (не протестировано и несколько шутливо!):
$ cat /usr/local/bin/saferm
#! /bin/bash
/bin/ls -- "$@"
echo "Это файлы, которые вы собираетесь удалить."
echo "Вы хотите продолжить (y/N)?"
read userresponse
if [ "$userresponse" -eq "y" ]; then
echo "Выполняю...."
/bin/rm -- "$@"
fi
А затем:
alias rm="/usr/local/bin/saferm"
На самом деле вы должны сделать паузу в мыслях перед выполнением подобной операции с использованием глобальных символов, независимо от того, запускаете ли вы от имени root, добавляете “sudo” и т.д. Вы можете выполнить “ls” на такой же подстановке и т.д., но, мысленно, вы должны остановиться на секунду, убедиться, что вы ввели то, что хотели, и убедиться, что то, что вы хотите, действительно то, что вы хотите, и так далее. Я полагаю, что это вещь, которую в основном учат, разрушив что-то в первый год как системный администратор Unix, таким образом, что горячая плита — хороший учитель в том, что может быть горячо.
И убедитесь, что у вас есть хорошие резервные копии!
Кроме того, не как мера предосторожности, а как способ узнать, какие файлы были удалены до того, как вы нажали ^C, вы можете использовать базу данных locate
(конечно, только если она была установлена и выжила после rm
)
Я узнал об этом из этого блог-поста
не столько ответ, сколько совет: я всегда ввожу rm (dir) -rf
, а не rm -rf (dir)
, т.е.: не идите на уничтожение до последнего возможного момента.
Это помогает смягчить ситуации, в которых вы случайно вводите имя каталога таким образом, что оно все еще является допустимым для удаления, например, случайно нажав клавишу enter.
Я просто создал свой собственный скрипт, который может просто предупреждать и запрашивать подтверждение для каждой ситуации, как хотите.
#!/bin/sh
# просто переместите /usr/bin/rm в /usr/bin/rm-original
path=${!#}
color_yel="\x1b[1;33m"
color_rst="\x1b[0m"
function get_yn() {
read i
if [ "$i" != "y" ]; then echo "отменено."; exit 1; fi
}
if [ -d ${path} ]; then
echo -e "${color_yel}Вы удаляете папку, это потенциально опасно. Вы уверены (y/n)?${color_rst}"
get_yn
/usr/bin/rm-original $@
fi
Дальнейшая идея по улучшению:
- проверить определенные флаги и пути
- переместить в папку для мусора и затем удалить
- периодически очищать старые вещи в мусоре после некоторого времени
Таким образом, простой настраиваемый скрипт позволяет иметь любое особое поведение и избежать установки дополнительных пакетов.
С некоторыми знаниями Bash вы можете уничтожить только определенные виды вещей.
Ответ или решение
Как предотвратить случайное выполнение команды rm -rf /*
?
Случайное выполнение команды rm -rf /*
— это одна из самых серьезных ошибок, которую можно совершить в Unix-подобных системах. Даже если вы не являетесь пользователем root, важные файлы могут быть безвозвратно удалены, что приведет к сбоям в работе системы. Вот несколько методов, которые помогут вам избежать подобной ситуации.
1. Используйте безопасные альтернативы команды rm
-
safe-rm
: Это утилита, которая заменяет/bin/rm
на обертку, проверяющую аргументы по согласованному черному списку файлов и директорий, которые не должны быть удалены. Чтобы установитьsafe-rm
, используйте пакетный менеджер вашей системы (например,apt
,yum
). -
trash-cli
: Эта утилита позволяет перемещать файлы в «Корзину» вместо их немедленного удаления. Вы сможете восстановить файлы, если удалите их по ошибке.
2. Настройка алиасов и функций
-
Алиасы: Добавьте в свой файл конфигурации оболочки (например,
~/.bashrc
) следующие строки:alias rm='rm -I' # Запрашивать подтверждение перед удалением более чем 3 файлов alias mv='mv -i' # Запрашивать подтверждение перед перезаписью существующих файлов alias cp='cp -i' # Запрашивать подтверждение перед перезаписью существующих файлов
-
Функция выдачи предупреждений: Создайте функцию в вашем
.bashrc
, которая будет предупреждать о выполнении команд сrm
. Например:myrm() { echo "Вы собираетесь удалить: $*" read -p "Продолжить (y/n)? " -n 1 -r echo # Печатает новую строку if [[ $REPLY =~ ^[Yy]$ ]]; then command rm "$@" else echo "Удаление отменено." fi } alias rm='myrm'
3. Используйте командные предостережения
-
Предварительный просмотр команд: Прежде чем выполнять
rm
, используйте командуecho
для проверки:echo rm -rf *
Это позволит вам увидеть, какие файлы будут удалены перед фактическим выполнением команды.
-
Использование команды
find
: Вместоrm
, используйтеfind
с параметром-delete
после просмотра файлов:find . -name "*.tmp" -print # Просмотр файлов find . -name "*.tmp" -delete # Удаление файлов
4. Правильное использование переменных окружения
Будьте осторожны с использованием переменных, содержащих пути. Например, выражение:
rm -rf $FOO/
Если $FOO
не задан, команда обработается как rm -rf /
, что может привести к катастрофическим последствиям. Лучше использовать:
rm -rf "$FOO"
5. Обратитесь к системным настройкам
- Настройте SELinux или AppArmor: Оба инструмента могут помочь ограничить права, когда дело касается удаления файлов. Настройте их так, чтобы запретить удаление важных директорий.
6. Измените свои привычки
-
Избегайте использования
rm -rf
напрямую, где это возможно. Вместо этого перемещайте файлы в специальную "корзину":mv /path/to/file /path/to/trash/
-
Используйте инструменты управления версиями, такие как
git
, для архивирования важной информации. -
Регулярно делайте резервные копии: Это основополагающее правило, которое поможет восстановить данные в случае удаления.
Заключение
Применяя эти рекомендации и изменения в поведении, вы сможете значительно снизить риск случайного удаления важных файлов и сделать работу с командной строкой более безопасной. Важно помнить, что хорошая практика бэкапа, осторожность при выполнении команд удаления и использование специализированных инструментов могут помочь избежать катастрофических ситуаций в будущем.