Як далеко ви дістанетеся з командою 'rm -rf /'?


200

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

Запитання про бонус : Після виконання команди команда rmвидалить себе?

Оновлення: Я перевірив це в кількох основних дистрибутивах Unix за допомогою VirtualBox, і відповіді описують, що саме відбувається. Якщо задано правильні параметри, rm видалить кожен фізичний біт даних на диску. Однак я зіткнувся з деякими проблемами під час використання іншої версії rm, відмінної від GNU. Наприклад, я вважаю, що у BusyBox є своя версія, і вона не дозволяє вам видалити стільки, скільки ви потенційно могли.

Це питання було питанням суперкористувача тижня .
Прочитайте запис в блозі 7 липня 2011 року, щоб отримати детальнішу інформацію або подайте власне запитання тижня.


8
Смішно, що ви задали це питання. Я тільки відповідав на інше питання rm -f на іншому форумі і почав згадувати статтю, яку я прочитав деякий час назад. На щастя , я зберіг його в протягом часу , як це: THE класичного Unix страшилка Крім того , що це цікаво подивитися , як далеко він піде ... Я думаю , що це дуже добре написана стаття , і це , в загальному , добре читати!
akseli

3
Я щойно спробував sudo rm -rf /на tinycore / microcore linux і, схоже, ОС захищає від видалення декілька каталогів (/ sys та інших).
n0pe

47
Я спробував rm -f /bin/rmодин раз. На жаль, це спрацювало, і я витратив наступну годину, отримуючи правильну версію rmназад від GNU coreutils.
білочка

17
Почекайте секунду, я спробую ...
Martijn Courteaux

38
Я роблю це в магазині яблук весь час
eggie5

Відповіді:


188

Якщо у вас є rmGNU coreutils (швидше за все, якщо це звичайний дистрибутив Linux), rm -rf /вбудований захист буде відмовлено (згідно manpage та Wikipedia, цього не пробували).

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

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


67
Саме те, що я шукав. Тепер використати цю силу для ВИКОНАННЯ СВІТУ.
n0pe

34
+1 спеціально для --no-preserve-rootтого, що зазвичай не згадується.
Matěj G.

22
@MaxMackie, варто зазначити, що хакери дуже швидко виявили, що це найменш корисна річ, яку вони могли зробити користувачеві. Це знищує будь-які дані, які могли бути використані для отримання грошових прибутків, і заважає хакеру в подальшій експлуатації машини. Як кішка з комахою, ти не хочеш її вбивати, ти просто хочеш пограти з нею деякий час, тому що це весело.
zzzzBov

5
Щоб відповісти на інше питання ОП, так, rm видалить себе. Цілком можливо змінити або видалити виконуваний файл, навіть коли є екземпляр його запущеного. Він також буде продовжувати працювати, і зміна не вплине на них.
thomasrutter

3
Я хотів би зазначити "chmod -R user: user *" at /, тому що це також рекурсивна і дорога помилка. Я робив це один раз, і до часу, коли я міг робити аборт, я пройшов на півдорозі / додому. / bin / boot / etc / dev були власником. На щастя, сервер продовжував працювати, поки я проводив наступні години вручну і скидав права власності на референтну систему. Однак ніхто більше не зможе використовувати су-судо після цього. Врешті-решт виявив, що / bin / su більше не встановлений встановлений біт. Зверніть увагу на майбутнє: chowning / bin / su скидає налаштування свого біта!
Енді Лі Робінсон


22

Налаштувати VM та спробувати розваги?

Це піде досить далеко ... якщо ви використовуєте gui, ви можете розважитися, помітивши, що речі помітніше погіршуються. (піктограми в меню зупиняють завантаження тощо)

Якщо ви відпустите це, ОС майже не зможе відновитись, хоча ви зможете легко повернути деякі дані.

У будь-якому випадку, ви хочете зробити перевстановлення ОС.


7
Я навіть не думав про те, щоб спробувати це у ВМ. Перейдемо спробувати зараз! ооо це весело.
n0pe

40
Помилково пише команду в термінал приймаючої системи
slhck

1
Перегляньте статтю, яку я розмістив. "Класична історія жахів Unix!"
akseli

1
Я зараз на роботі і не встигаю пройти повну установку популярного дистрибутива (ubuntu / slack / suse / fedora). Якщо хто-небудь ще може клонувати файл диска VM і спробувати його для нас, це було б дивним.
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: не можна видалити '/': Пристрій або ресурс зайнятий


1
Так, я теж отримую ці помилки / попередження. Це ти думаєш?
n0pe

5
/ proc, / sys, іноді / dev та будь-які точки монтажу є властивостями операційної системи і їх неможливо видалити.
pjc50

1
У поєднанні з @ pcj50 це не буквально файли на жорсткому диску, тому "видалення" їх не має сенсу.
CarlF

7

Я пригадую, що це пережовувалося alt.sysadmin.recoveryще в часи, коли такого не було /proc, а це /devбув просто звичайний каталог, що містить записи для купки незвичних вкладень ...

... але, в деяких варіантах Unix (мій спогад - HP-UX, але це може бути абсолютно неправильно), ви не змогли видалити останній запис каталогу для запущеної програми. (Спільні бібліотеки? Що це?)

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

Жителі монастиря страшного диявола вважали це придатним і правильним.


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] 

2
"вказуючи, що якщо спробувати видалити" / "рекурсивно, то в кінцевому рахунку спробуємо видалити" .. "і". ", і що все, що ми робимо, дозволяє rm заздалегідь визначити це евристично. Дивно, вони купили це ! "- Е, чи не заборонить це видалити будь-який каталог? Фактична специфікація лише відключає .. і. у фактичних аргументах командного рядка він нічого не говорить про те, що ви "в кінцевому рахунку намагаєтесь видалити"
Random832

1
Чому б заборонити видаляти будь-який каталог? Кореневий каталог є єдиним, що стосується тут, і його видалення, очевидно, означає "". і "..", незалежно від поточного каталогу. Здоровий глузд не заборонений у стандартній інтерпретації.
jlliagre

1
Ця лінія аргументації є чистою геніальністю.
Nate CK

Стандарт визначає, що rm не може продовжуватися, якщо аргумент містить рядок ". або ".." як компонент базового імені. Ви не можете видалити, /foo/..навіть якщо ви не входите /foo. Він не вказує, що вам заборонено видаляти поточний каталог (наприклад rm -r `pwd`) або батьківський код поточного каталогу.
Випадково832

2
Дійсно, я неправильно зрозумів твердження, і ви правильні. Сподіваємось, стандартні хлопці сприйняли розумнішу поведінку як стандартну. Видалення великих частин, якщо не вся файлова система, швидше зробить ОС нестандартною сумісною.
jlliagre

3

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


Це правильно, тому що вони завантажені в пам'ять, правда?
n0pe

Я не впевнений, чи можна це припустити; ядро могло б просто завантажити видалений файл у пам'ять та негайно видалити його на диск, і зберегти цю копію в пам'яті, поки файл не відкриється (наприклад, до запуску rm).
Амброз Біжак

Я не спекулюю. Якщо програма запущена, видалення її не прибирає, як мінімум, на моїх скриньках Linux. (Зверніть увагу, я не перевіряв цього протягом декількох років.)
CarlF

4
rm буде видалити себе з ФС - програма повністю завантажена в пам'ять, а НЕ файл
Warren

4
@MaxMackie: не тому, що вони завантажені в пам'ять, а тому, що посилання на відкритий файл має таку ж потужність, як і жорстке посилання (тобто, якщо файл має хоча б одне тверде посилання, він не буде видалений з диска).
Лежи Райан

1

За те, що спробувавши один раз (на сервері, що те, що мене дратує), увійшов як root, в терміналі ви втратите майже все. Єдине, що не буде стерто, - це лише той процес, який був необхідний для ОС.


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 /шкідливо, оскільки вимикає встановлені та встановлені жорсткі біти.
G-Man

1

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

Але щоб відповісти на ваше основне питання, так - rmкоманда буде видалена разом з нею, як і будь-яка інша стандартна команда в /binінших папках.

Ось простий тест, який я виконував у Linux Ubuntu 15.04 за допомогою VM.

  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, ви можете грати з деякими емуляторами JavaScript Linux x86 .

Якщо вас цікавлять можливості відновлення після такої катастрофи, перевірте:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.