rm -rf

Материал из Викиреальностя
Перейти к: навигация, поиск

()

Выполнение команды 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 относится к темам: