rm -rf
rm -rf — легендарная текстовая команда UNIX-подобных систем, выполняющая рекурсивное (r) удаление без подтверждения (f).
Содержание |
[править] Немного матчасти
Команда rm (англ. remove — удалить) используется в UNIX-подобных системах с текстовым интерфейсом (или в терминале (командная строка)), когда необходимо удалить файл или каталог. В случае если удаляемый файл является простым файлом (не каталогом), то команда сработает и без параметров и файл будет удалён. Однако если пользователь имеет дело с каталогом, будет выдано сообщение об ошибке «каталог не пуст» (даже если он пуст). В этом случае необходимо применять дополнительные параметры (ключи):
- -r — обрабатывать все вложенные подкаталоги (от англ. recursively — рекурсивно); без этого ключа будет выводиться вышеупомянутое сообщение об ошибке, а пустой каталог не будет удалён
- -i — выводить запрос на подтверждение каждой операции удаления (от англ. inform — информировать); этот ключ необходим, если нужно проверить каждый файл в каталоге и сохранить действительно нужные файлы от случайного удаления; данный ключ почти всегда по умолчанию прописан в .bashrc для команды rm как
alias rm='rm -i'
- -f — не возвращать код ошибочного завершения, если ошибки были вызваны несуществующими файлами, и не запрашивать подтверждения операций (отмена предыдущего ключа), форсированно (англ. force) довести операцию до конца.
Согласно традициям UNIX, можно объединять ключи, посему сочетание ключей -r -f
эквивалентно двойному ключу -rf
. Фактически этот ключ эквивалентен фразе «всё, сразу, без предупреждений и уточнений».
Ну, и наконец, надо задать название удаляемого каталога в виде /$path
, например /usr/desktop/folder1
.
Теперь матчасть известна и можно переходить к самому главному…
[править] Суть
Часто в качестве пути фигурирует /
— корневой каталог UNIX-подобной OS (аналог диска C:/
в Windows). В случае запуска команды rm -rf /
(на старых OS, на новых нужно сделать ещё минимум одно действие, но об этом ниже) система начнёт без подтверждения удалять всё содержимое файловой системы. В итоге пользователь, допустивший запуск этой команды, получает на выходе компьютер без OS и данных, хранившихся на FS, а не на подключаемых ЖД.
В Windows эта команда автоматически преобразовывается в rmdir /s /q C:\
(или, если более кратко, rd /s /q C:\
), где /s — аналог -r, а /q — аналог -f. При этом удаляется только содержимое диска C:
из-за отличий в файловой системе. Для более полного удаления нужно использовать команду deltree /y e: d: c:
(сначала удаляет данные с жёстких дисков, и только потом чистит диск C:). Также предлагался «универсальный ключ реестра для избавления от шароварности программ», который записывал сию команду в Run, а заодно отключал мышь и клавиатуру. При следующей загрузке — даже если пользователь и догадывался о причине странного жужжания винта — спасти мог только быстрый, решительный Reset (но пользователь загипнотизированно смотрел на зависший мышекурсор и вспоминал о кнопке, когда было уже поздно).
[править] Защита
Для защиты от такой опасной багофичи компания Sun Microsystems реализовала защиту от «rm -rf /» в Solaris 10, выпущенном в 2005 году[1]. При выполнении команды пользователем без права root
система теперь сообщает, что удаление / не разрешено. Для выполнения команды требуется загрузка под пользователем root или использование команды sudo.
Вскоре после этого такая же функциональность была реализована в команде rm, поставляемой с FreeBSD.
GNU rm не выполняет команду «rm -rf /», если не указан параметр --no-preserve-root[2]. Такое поведение было реализовано в версии GNU Core Utilities версии 6.4, выпущенных в 2006.
Обе защиты впоследствии были реализованы в других UNIX-подобных системах. Однако они обходятся легко, если набрать код в виде sudo rm -rf / --no-preserve-root
или sudo rm -rf /*
[править] Примеры применения
Обычно такой приём, как применение такого опасного для компьютера кода, применяется против неопытных пользователей, которые работают под учётной записью root в Интернете.
- UNIX-нубы обычно получают предложение выполнить команду
sudo rm -rf /
в ответ на вопросы о простых проблемах, вроде установки пакета для работы какого-нибудь AmaroK’а. - Более опытным пользователям скармливается более громоздкая, но идентичная по результату строчка, состоящая из вывода сообщения и кода на perl:
cat "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
[3]
[править] Bumblebee
Эпичный пример случайного применения данной команды был предоставлен летом 2011 года в проекте Bumblebee, представляющем собой костыль для поддержки технологии NVidia Optimus в ноутбуках с двумя видеокартами. Файл install.sh в исходниках данного проекта содержал безобидную строчку:rm -rf /usr /lib/nvidia-current/xorg/xorg
По идее данная строчка должна была вычистить из системного каталога пользователя папку с хвостом предыдущей установки. Но при составлении кода программист случайно поставил пробел не в том месте, в результате чего программа игнорировала оторванный кусок пути и начинала удалять всю папку usr со всеми пользовательскими данными (библиотеки, бинарники, и всё остальное). Баг был быстро пойман и устранён, но форум ГитХаба стал местом долгих разборок в стиле Форчана[4].
[править] Патч Бармина
В Фидо данный код назвали «Патчем Бармина» в честь UNIX-админа Владимира Бармина. Последний, в релкомовской группе новостей, на вопросы вида «как починить <…> в SCO Unix?» несколько раз ответил «универсальным патчем: rm -rf / от рута».
[править] Русская рулетка
На основе данного патча была разработана комбинация, получившая название Русской Рулетки.
# [ $[ $RANDOM % 6 ] == 0 ] && rm -rf /* || echo "Жив"
Играть в Русскую Рулетку имеют право только администраторы (root), желательно на сервере, имеющем свыше 3000 посещений в день. Как было выяснено админами Ниеншанца (на практике), данная комбинация успешно работает в Linux и FreeBSD в последних версиях coreutils.
Версия Русской Рулетки под Windows:
set /a R=0+(6*%random%)/%random% & if !R! == 0 (rd /s /q .\) else (echo alive!)
[править] См. также
[править] Примечания
[править] Ссылки
- Пост про rm -rf /, 23 февраля 1996
- Бармин о SCO, 3 октября 1996
- Копия письма выше и упоминание патча
- «Универсальное решение — rm», 16 октября 1996
- А. Лисовский подробно рассказывает о назначении патча, 02 февраля 1996
- Настоящий Владимир Бармин и его патч для шлимыла, 06 августа 1998
- Порт патча под винду? конец 1997 года
- Типичное использование, 2007 год
- Просьба о помощи Perl-программисту на LOR’е
- Format в Абсурдопедии на Викии
- Патч Бармина в Циклопедии
Rm -rf относится к темам: |