Як далеко ви дістанетеся з командою '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.