Как далеко вы доберетесь с помощью команды 'rm -rf /'?

200

Я часто задавался вопросом, как далеко продвинется система, если ты побежишь rm -rf /. Я сомневаюсь, что ОС сможет стереть себя (?)

Бонусный вопрос : после того, как команда была выполнена, rmудалится сама?

Обновление: я протестировал это в нескольких основных дистрибутивах Unix с использованием VirtualBox, и ответы точно описывают, что происходит. Если заданы правильные параметры, rm удалит каждый физический бит данных на диске. Однако я столкнулся с некоторыми проблемами при использовании версии rm, отличной от GNU. Например, я считаю, что BusyBox имеет свою собственную версию, и она не позволяет вам удалить столько, сколько вы могли бы.

Этот вопрос был Супер Вопросом Пользователя Недели .
Прочитайте запись в блоге 7 июля 2011 года для получения более подробной информации или отправьте свой собственный Вопрос недели.

n0pe
источник
8
Забавно, что ты задал этот вопрос. Я просто отвечал на другой вопрос rm -f на другом форуме и начал вспоминать статью, которую я прочитал некоторое время назад. К счастью , я сохранил его в течение времени , как это: THE классического Unix страшилка Помимо того , что это интересно посмотреть , как далеко он пойдет ... Я думаю , что это очень хорошо написана статья , и это , в общем , хорошо читать!
Аксели
3
Я только что попробовал sudo rm -rf /на tinycore / microcore linux, и кажется, что ОС защищает несколько каталогов (/ sys и другие) от удаления.
n0pe
47
Я попробовал rm -f /bin/rmодин раз. К сожалению, это сработало, и я потратил следующий час, чтобы получить правильную версию rmобратно из GNU coreutils.
Белка
17
Подождите секунду, я постараюсь ...
Мартейн Курто
38
Я делаю это в магазине яблок все время
eggie5

Ответы:

188

Если вы используете rmGNU coreutils (скорее всего, это обычный дистрибутив Linux), rm -rf /встроенная защита будет отклонена (согласно manpage и Wikipedia, не пробовали этого).

Вы можете переопределить эту защиту с помощью --no-preserve-root. rmзатем удалит все, что возможно, без остановки после попытки удалить каждый отдельный файл. Конечно, он не удалит виртуальные файловые системы, такие как /procи /sys, но это не имеет значения - он удалит все на вашем диске.

После завершения команды ваш диск будет очищен, включая операционную систему. Ядро и текущие процессы будут продолжать работать из памяти, но многие процессы умрут, потому что им не удастся получить доступ к какому-либо файлу. ОС не загрузится в следующий раз.

Амброз Бижак
источник
67
Именно то, что я искал. Теперь, чтобы использовать эту силу, чтобы взять мир.
n0pe
34
+1 особенно --no-preserve-rootпотому, что это обычно не упоминается.
Матей Г.
22
@MaxMackie, стоит отметить, что хакеры очень быстро обнаружили, что это наименее полезная вещь, которую они могут сделать для пользователя. Он уничтожает любые данные, которые могут быть использованы для получения прибыли, и предотвращает дальнейшую эксплуатацию компьютера хакером. Как кошка с насекомым, вы не хотите убивать ее, вы просто хотите поиграть с ней некоторое время, потому что это весело.
zzzzBov
5
Чтобы ответить на другой вопрос ОП, да rm удалит себя. Вполне возможно изменить или удалить исполняемый файл, даже если запущен его экземпляр. Это также продолжит работать, и изменения не будут затронуты.
Томасруттер
3
Я хотел бы упомянуть "chmod -R user: user *" в /, потому что это также рекурсивная и дорогостоящая ошибка. Я сделал это однажды, и к тому моменту, когда я смог прервать лечение, прошел половину пути / домой. / bin / boot / etc / dev были собственностью. К счастью, сервер продолжал работать, пока я провел несколько часов вручную и сбрасывал права владения из справочной системы. Тем не менее, никто другой не может использовать su или sudo впоследствии. В конце концов обнаружил, что / bin / su больше не имеет установленного бита setuid. Обратите внимание на будущее: chowning / bin / su сбрасывает бит setuid!
Энди Ли Робинсон
42

Для тех, кто любит делать такие вещи визуально, слушая техно музыку.

Запуск rm-rf в Linux (видео)

Бонусные баллы, если вы можете назвать процессы, как они начинают умирать.

Xeoncross
источник
22

Настроить ВМ и попробовать в свое удовольствие?

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

Если вы отпустите его, ОС практически не восстановится, хотя вы сможете легко вернуть некоторые данные.

В любом случае, вам захочется переустановить ОС.

PriceChild
источник
7
Я даже не думал о том, чтобы попробовать это на ВМ. Собираюсь попробовать сейчас! ооо это весело.
n0pe
40
Ошибочно записывает команду в Терминал хост-системы
slhck
1
Проверьте статью, которую я отправил. "Классическая Unix Horror Story!"
Аксели
1
Я сейчас на работе, и у меня нет времени, чтобы пройти полную установку популярного дистрибутива (ubuntu / slack / suse / fedora). Если кто-то еще сможет клонировать файл на диске виртуальной машины и попробовать его для нас, это будет здорово.
n0pe
2
С Amazon EC2 должно быть быстро запустить один из их AMI, на котором уже установлен linux, и запустить его ...
David d C e Freitas
11

Что ж, попробуйте это на http://bellard.org/jslinux/ :

rm: невозможно удалить '/ dev / pts': устройство или ресурс заняты
rm: невозможно удалить '/ dev': каталог не пуст.
rm: невозможно удалить '/ proc / swaps': операция не разрешена
rm: can 't remove' / proc / kallsyms ': операция не разрешена
rm: невозможно удалить' / proc / dma ': операция не разрешена

SNIP 881 записей

rm: невозможно удалить '/ proc / 149 / oom_adj': отказано в разрешении
rm: невозможно удалить '/ proc / 149': операция не разрешена
rm: невозможно удалить '/ proc': устройство или ресурс заняты
rm: не может удалить '/ tmp': устройство или ресурс занят
rm: не может удалить '/': устройство или ресурс занят

Hello71
источник
1
Да, я тоже получаю эти ошибки / предупреждения. Вы думаете, это стандарт?
n0pe
5
/ proc, / sys, иногда / dev и любые точки монтирования являются свойствами операционной системы и не могут быть удалены.
pjc50
1
Одновременно с @ pcj50 это не просто файлы на жестком диске, поэтому их удаление не имеет смысла.
CarlF
7

Я вспоминаю, как это пережевывали alt.sysadmin.recoveryв прошлые времена, когда не было такого понятия /proc, /devкак обычный каталог, содержащий записи для множества необычных inode-ов ...

... но в некоторых вариантах Unix (я помню HP-UX, но это может быть совершенно неправильно), вы не могли удалить последнюю запись каталога для программы, которая работала. (Общие библиотеки? Что это?)

В таких системах, если вы запустили один в режиме обслуживания (так что ничего не initработало, но ваша оболочка, даже нет , и никакие вторичные файловые системы не были смонтированы) и работали exec /bin/rm -rf /, у вас осталась бы абсолютно пустая корневая файловая система, за исключением этого /binи /bin/rmбудет выжить.

Жители монастыря страшных дьяволов считали это подходящим и уместным.

zwol
источник
4

rm -rf / нельзя допускать в недавних реализациях, так как предполагалось, что это нарушает стандарт POSIX:

" rm -rf /" защита в блоге Oracle

Как бы то ни было, в конце мы изменили спецификацию, и Solaris 10 имеет (начиная со сборки 36) версию / usr / bin / rm (/ bin - это символическая ссылка на / usr / bin в Solaris) и / usr / xpg4 / bin / rm, который ведет себя так:

[28] /bin/rm -rf /
rm of / is not allowed
[29] 
jlliagre
источник
2
«указывая на то, что если кто-то попытается удалить» / »рекурсивно, то в конечном итоге он попытается удалить« .. »и«. », и все, что мы делаем, это позволяем rm предварительно определить это эвристически. Удивительно, но они купили это ! "- э, разве это не запретит удаление какого-либо каталога? Фактическая спецификация только запрещает .. и. в реальных аргументах командной строки ничего не говорится о том, что вы «в конечном итоге
пытаетесь
1
Почему бы запретить удаление любого каталога? Корневой каталог - единственное, что здесь касается, и удаление его, очевидно, подразумевает удаление "." и "..", каким бы ни был текущий каталог. Здравый смысл не запрещен в стандартной интерпретации.
Jlliagre
1
Эта линия аргументации является чистым гением.
Nate CK
Стандарт определяет, что rm не может продолжаться, если аргумент содержит строку "." или ".." в качестве компонента базового имени. Вы не можете удалить, /foo/..даже если вы не в /foo. Он не указывает, что вы не можете удалить текущий каталог (например rm -r `pwd`) или родительский каталог текущего каталога.
Random832
2
Действительно, я неправильно понял утверждение, и вы правы. Надеемся, что стандартные парни приняли более умное поведение как стандартное соответствие. Удаление больших частей, если не всей файловой системы, в любом случае быстро сделает ОС нестандартной.
Jlliagre
3

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

CarlF
источник
Это верно, потому что они загружены в память, верно?
n0pe
Я не уверен, что это безопасно предположить; ядро вполне может просто загрузить удаленный файл в память и немедленно удалить его на диск, и сохранять эту копию в памяти до тех пор, пока файл не будет открыт (например, пока не запущен rm).
Амброз Бизжак
Я не спекулирую. Если программа запущена, удаление ее не удаляет ее, по крайней мере, на моих компьютерах с Linux. (Имейте в виду, я не проверял это в течение нескольких лет.)
CarlF
4
rm будет удалить себя из фс - программа полностью загружена в память, а не файл
Warren
4
@MaxMackie: не потому, что они загружены в память, а потому, что ссылка на открытый файл имеет такую ​​же мощность, что и жесткая ссылка (т. Е. Если файл имеет хотя бы одну жесткую ссылку, он не будет удален с диска).
Ли Райан
1

За то, что попробовал один раз (на сервере, который меня бесит), вошел в систему как root, в терминале вы потеряете почти все. Единственное, что не будет стерто, будет только тот процесс, который был необходим для ОС.

Anarko_Bizounours
источник
12
«[не стирается] только тот процесс, который был необходим для ОС» - не волнуйтесь. В отличие от Windows, Linux с удовольствием удалит все, даже если файл критичен для ОС и используется. /boot, /sbin, /etc, /bin, /vmlinuz? Бэм, ушел. Удачи в загрузке без них - на самом деле, удачи в том, чтобы делать что-либо вообще после завершения удаления.
Писквор
Если я вспоминаю, что был какой-то файл, который не был удален, и я позволил моей Linux работать более 4 часов. Но все же, хорошо знать, что происходит, например, делать chmod 777 / * -fR;)
Anarko_Bizounours
3
"chmod 777 / * -fR" - это должно просто сделать систему очень небезопасной, хотя и очень удобной для пользователя.
Барт ван Хейкелом
1
@BartvanHeukelom, некоторые инструменты выполнят быструю самопроверку или будут проверены системой на предмет правильного владения и разрешений и откажутся действовать в случае неправильной настройки.
убийца
1
chmod -fR 777 /вредно, потому что отключает биты setuid и setgid.
G-Man
1

Как далеко вы можете добраться, это в основном зависит от конкретных дистрибутивов Unix / Linux.

Но чтобы ответить на ваш базовый вопрос, да - rmкоманда будет удалена вместе с ней, как и любая другая стандартная команда в /binи других папках.

Вот простой тест, который я выполнил в Linux Ubuntu 15.04 с использованием виртуальной машины.

  1. Инициализируйте виртуальную машину через vagrant:

    vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
    
  2. Затем, когда вы пытаетесь удалить все файлы стандартным способом, он не позволяет вам:

    vagrant@vagrant-ubuntu-vivid-64:~$ sudo rm -fr /
    rm: it is dangerous to operate recursively on '/'
    rm: use --no-preserve-root to override this failsafe
    
  3. Итак, давайте попробуем --no-preserve-root. Всегда дважды проверяйте, вошли ли вы в виртуальную машину (то есть vagrant@vagrant-ubuntu-vivid-64:~$), а затем запускайте (не пытайтесь сделать это дома):

    vagrant@vagrant-ubuntu-vivid-64:~$ sudo rm -vfr --no-preserve-root /
    removed directory: '/lost+found'
    removed directory: '/opt'
    removed '/bin/nc'
    removed '/bin/less'
    removed '/bin/wdctl'
    removed '/bin/nano'
    ...
    removed '/bin/rmdir'
    removed '/bin/sh'
    removed '/bin/rm'
    ...
    removed directory: '/bin'
    removed directory: '/usr/games'
    removed '/usr/bin/byobu-launcher-install'
    removed '/usr/bin/ipcmk'
    removed '/usr/bin/sum'
    removed directory: '/usr/bin'
    removed '/usr/lib/gcc/x86_64-linux-gnu/4.9.2'
    removed '/usr/lib/gcc/x86_64-linux-gnu/5.0.1'
    removed directory: '/usr/lib/gcc/x86_64-linux-gnu/5'
    removed '/usr/lib/gcc/x86_64-linux-gnu/4.9/libquadmath.so'
    removed '/usr/lib/gcc/x86_64-linux-gnu/4.9/libgomp.so'
    ...
    removed directory: '/run/initramfs'
    removed directory: '/media'
    rm: cannot remove '/proc/fb': Operation not permitted
    rm: cannot remove '/proc/fs/ext4/sda1/options': Operation not permitted
    ...
    removed '/vmlinuz'
    removed '/boot/config-3.19.0-23-generic'
    removed '/boot/grub/grubenv'
    ...
    removed directory: '/boot'
    removed '/lib64/ld-linux-x86-64.so.2'
    rm: cannot remove '/dev/hugepages': Device or resource busy
    rm: cannot remove '/dev/mqueue': Device or resource busy
    rm: cannot remove '/dev/shm': Device or resource busy
    removed '/dev/vcsa7'
    ...
    removed '/dev/mem'
    removed '/dev/rfkill'
    removed '/dev/vga_arbiter'
    ...
    rm: cannot remove '/sys/fs/ecryptfs/version': Operation not permitted
    removed directory: '/etc'
    removed directory: '/mnt'
    removed '/vagrant/.vagrant/machines/default/virtualbox/action_provision'
    removed '/vagrant/.vagrant/machines/default/virtualbox/action_set_name'
    removed '/vagrant/.vagrant/machines/default/virtualbox/creator_uid'
    removed '/vagrant/.vagrant/machines/default/virtualbox/id'
    removed '/vagrant/.vagrant/machines/default/virtualbox/index_uuid'
    removed '/vagrant/.vagrant/machines/default/virtualbox/private_key'
    removed '/vagrant/.vagrant/machines/default/virtualbox/synced_folders'
    removed directory: '/vagrant/.vagrant/machines/default/virtualbox'
    removed directory: '/vagrant/.vagrant/machines/default'
    removed directory: '/vagrant/.vagrant/machines'
    removed directory: '/vagrant/.vagrant'
    removed '/vagrant/Vagrantfile'
    rm: cannot remove '/vagrant': Device or resource busy
    

    После этого он возвращается к приглашению оболочки, как будто ничего не произошло, но вы не можете больше выполнять какие-либо команды, кроме нескольких встроенных и kill, так что вы можете закончить свою работу и завершить сеанс :)

    Например:

    $ rm
    rm: command not found
    $ kill
    kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
    $ which kill
    -bash: /usr/bin/which: No such file or directory
    $ kill -9 $$
    Connection to 127.0.0.1 closed.
    

Так что довольно удалены все, в том числе rm, lsи все другие команды, но все же вы вошли в. Существуют некоторые специальные папки, которые не были удалены, такие как некоторые устройства /dev, /procили /sysкоторые не являются обычными каталогами / файлами, но это псевдофайловая система, предоставляющая интерфейсы для обработки и данных ядра.

Если у вас нет Vagrant или Linux, вы можете поиграть с некоторыми эмуляторами Linux x86 .

Если вас интересуют возможности восстановления после такой катастрофы, проверьте:

kenorb
источник