題 使用'rm -rf /'命令你能得到多少?


我經常想知道如果你跑的話系統會有多遠 rm -rf /。我懷疑操作系統是否能夠擦除自己(?)

獎金問題:執行命令後,將會 rm 已經刪除了自己?

更新: 我已經使用VirtualBox在幾個主要的unix發行版中對此進行了測試,答案描述了究竟發生了什麼。如果給出正確的參數,rm將刪除光盤上的每個物理位數據。但是,當使用除GNU之外的rm版本時,我遇到了一些問題。例如,我相信BusyBox有自己的版本,它不會讓你盡可能多地刪除。

這個問題是一個 本週超級用戶問題
  閱讀2011年7月7日 博客文章 了解更多詳情或 提交你自己的 本週的問題。


199
2017-07-20 13:48


起源


你問這個問題很有意思。我剛剛在另一個論壇上回答了另一個rm -f問題,並開始記起我前一段時間讀過的一篇文章。幸運的是我保存了這樣的時間: THE 經典的Unix恐怖故事 除了有趣的是看到它會走多遠...我認為這是一篇寫得很好的文章,並且通常很好讀! - akseli
我剛試過 sudo rm -rf / 在tinycore / microcore linux上,似乎操作系統保護幾個目錄(/ sys和其他目錄)不被刪除。 - n0pe
我試過了 rm -f /bin/rm 一旦。不幸的是,它奏效了,我花了一個小時才得到正確的版本 rm 從GNU coreutils回來。 - squircle
等一下,我會試試...... - Martijn Courteaux
我一直在蘋果商店這樣做 - eggie5


答案:


如果你有 rm 來自GNU coreutils(最有可能的是它是一個普通的Linux發行版), rm -rf / 將被內置保護拒絕(根據手冊和維基百科,沒有嘗試過)。

您可以使用覆蓋此保護 --no-preserve-rootrm 然後會刪除所有可能的內容,而不會在嘗試刪除每個文件後停止。當然它不會刪除像這樣的虛擬文件系統 /proc 和 /sys,但這是無關緊要的 - 它將刪除磁盤上的所有內容。

命令完成後,您的磁盤將被清空,包括操作系統。內核和當前進程將繼續從內存運行,但許多進程將因為無法訪問某些文件而死亡。操作系統下次無法啟動。


188
2017-07-20 14:36



正是我在尋找什麼。現在用這種力量來戰勝世界。 - n0pe
+1特別適合 --no-preserve-root 因為那通常沒有提到。 - Matěj G.
@MaxMackie,值得注意的是,黑客很快就發現了這一點 最小 他們可以對用戶做的有用的事情。它會破壞任何可用於現金收益的數據,並阻止黑客進一步利用機器。就像一隻有昆蟲的貓,你不想殺牠,你只想玩它一段時間,因為它很有趣。 - zzzzBov
要回答OP的另一個問題,是的,rm會自行刪除。即使存在可執行文件的實例,也完全可以修改或刪除可執行文件。它也將繼續運行,並且不會受到變化的影響。 - thomasrutter
我想在/中提到“chmod -R user:user *”,因為它也是一個遞歸且代價高昂的錯誤。我曾經做過一次,在我可以中止的時候已經到了家中途。 / bin / boot / etc / dev是擁有的。幸運的是,當我花費接下來的幾個小時手動並重置參考系統的所有權時,服務器一直在運行。但是,之後沒有其他人可以使用su或sudo。最終發現/ bin / su不再設置其setuid位。請注意以後:chowning / bin / su重置其setuid位! - Andy Lee Robinson


對於那些喜歡在聽電子音樂的同時在視覺上做這樣的事情的人。

在Linux上運行rm-rf(視頻)

如果您可以在流程開始死亡時命名流程,則可以獲得獎勵積分。


41
2017-07-20 23:23





設置一個虛擬機,試著玩得開心嗎?

它會走得很遠......如果你使用的是gui,你可能會注意到事情會更明顯地降低。 (菜單上的圖標停止加載等)

如果你放手,雖然你可以輕鬆地獲得一些數據,但操作系統幾乎無法恢復。

無論哪種方式,您都希望重新安裝操作系統。


22
2017-07-20 13:52



我甚至沒想過在虛擬機中嘗試它。現在去試試吧!噢,這很有趣。 - n0pe
錯誤地將命令寫入主機系統的終端 - slhck
看看我發布的文章。 “經典的Unix恐怖故事!” - akseli
我現在正在工作,沒有時間完成一個流行的發行版(ubuntu / slack / suse / fedora)的完整安裝。如果其他人可以克隆VM磁盤文件並為我們嘗試,那將是非常棒的。 - n0pe
使用亞馬遜EC2,它應該能夠快速啟動已經安裝了Linux的AMI之一併開火...... - David d C e Freitas


好吧,嘗試一下 http://bellard.org/jslinux/ 生產:

rm:無法刪除'/ dev / pts':設備或資源繁忙
  rm:無法刪除'/ dev':目錄不為空
  rm:無法刪除'/ proc / swaps':不允許操作
  rm:無法刪除'/ proc / kallsyms':不允許操作
  rm:無法刪除'/ proc / dma':不允許操作

SNIP 881條目

rm:無法刪除'/ proc / 149 / oom_adj':權限被拒絕
  rm:無法刪除'/ proc / 149':不允許操作
  rm:無法刪除'/ proc':設備或資源繁忙
  rm:無法刪除'/ tmp':設備或資源繁忙
  rm:無法刪除'/':設備或資源繁忙


11
2017-07-20 14:23



是的,我也得到了那些錯誤/警告。你認為這是標準嗎? - n0pe
/ proc,/ sys,有時/ dev,並且任何掛載點都是操作系統的屬性,無法刪除。 - pjc50
與@ pcj50一致,那些不是硬盤上的字面文件,因此“刪除”它們沒有意義。 - CarlF


我記得這被咀嚼了 alt.sysadmin.recovery 在昔日的日子裡,當沒有這樣的事情 /proc,和 /dev 只是一個包含一堆不尋常的inode條目的常規目錄...

...但是,在Unix的某些變體上(我的回憶是HP-UX,但這可能完全錯誤),你可以  刪除正在運行的程序的最後一個目錄條目。 (共享庫?那些是什麼?)

在這樣的系統上,如果你在維護模式下啟動了一個(所以什麼都沒有運行,但你的shell,甚至沒有 init,並沒有安裝輔助文件系統)並做到了 exec /bin/rm -rf /,你將留下一個完全空的根文件系統 除了 那 /bin 和 /bin/rm 會倖存下來

可怕的魔鬼修道院的居民認為這是合適的。


7
2017-07-21 00:06





rm -rf / 最近的實現不應該被允許,因為它被認為違反了POSIX標準:

rm -rf /“保護Oracle博客

無論如何,最後,我們修改了規範,Solaris 10(從構建36開始)有/ usr / bin / rm版本(/ bin是Solaris上/ usr / bin的sym-link)和/ usr / xpg4 / bin / rm的行為如下:

[28] /bin/rm -rf /
rm of / is not allowed
[29] 

4
2017-07-20 15:58



“指出如果一個人試圖遞歸刪除”/“,最終會嘗試刪除”..“和”。“,而我們所做的就是允許rm以啟發的方式預先確定這一點。令人驚訝的是,他們買了那個! - 呃,不會不允許刪除 任何 目錄?實際的規格只允許..和。在實際的命令行參數中,它沒有說明你“最終試圖刪除”的內容 - Random832
為什麼不允許刪除任何目錄?根目錄是唯一關注的,刪除它顯然意味著刪除“。”和“..”,無論當前目錄是什麼。標準解釋中不禁止常識。 - jlliagre
這一系列論證純粹是天才。 - Nate C-K
該標準規定不允許rm繼續 如果參數有字符串“。”或“..”作為basename組件。 你不能刪除 /foo/.. 即使你不在 /foo。確實如此 不 指定您不允許刪除當前目錄(例如 rm -r `pwd`)或當前目錄的父級。 - Random832
實際上,我誤解了這個陳述,你是對的。希望標准人員接受更聰明的行為是符合標準的。如果不是所有文件系統都刪除大部件將很快使OS非標準兼容。 - jlliagre


有一點我沒有看到其他任何人:當前打開的文件(例如rm本身),即使被刪除,也不會在驅動器關閉之前消失。


3
2017-07-20 17:12



那是對的,因為它們在內存中加載了嗎? - n0pe
我不確定這是否安全;內核可以很好地將刪除的文件加載到內存中並立即將其刪除,並保留內存中的副本,直到文件打開(例如直到rm運行)。 - Ambroz Bizjak
我不是在猜測。如果一個程序正在運行,刪除它不會至少在我的Linux機器上刪除它。 (請注意,我沒有測試過這個,哦,幾年。) - CarlF
rm  將 從fs中刪除自己 - 程序 是完全加載在內存中,而不是 文件 - warren
@MaxMackie:不是因為它們被加載到內存中,而是因為開放文件引用具有與硬鏈接相同的能力(即,如果文件至少有一個硬鏈接,則不會從磁盤中刪除它)。 - Lie Ryan


因為曾經嘗試過一次(在服務器上讓我感到煩惱),以root用戶身份登錄終端,你幾乎失去了一切。唯一不會被刪除的只是對操作系統至關重要的過程。


1
2017-07-20 13:55



“[沒有刪除]只有對操作系統至關重要的過程” - 哦,別擔心。與Windows不同,Linux會很樂意刪除任何內容,即使該文件對操作系統至關重要 和 正在使用。 /boot, /sbin, /etc, /bin, /vmlinuz?巴姆,走了。沒有那些好運開機 - 事實上,祝你好運 什麼 刪除完成後一點都沒有。 - Piskvor
如果我記得有一些文件沒有刪除,我讓我的linux運行超過4個小時。但是,知道發生了什麼很好,比如做一個chmod 777 / * -fR;) - Anarko_Bizounours
“chmod 777 / * -fR” - 這應該只是讓系統非常不安全,儘管用戶友好。 - Bart van Heukelom
@BartvanHeukelom,一些工具將執行快速自檢,或者由系統進行測試以獲得適當的所有權和權限,並且如果配置錯誤則拒絕採取行動。 - killermist
chmod -fR 777 / 是有害的,因為它關閉setuid和setgid位。 - G-Man


你能走多遠,它基本上取決於特定的Unix / Linux發行版。

但要回答你的基本問題,是的 - rm 命令將被刪除,以及任何其他標準命令 /bin 和其他文件夾。

這是我使用VM在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
    

    之後它會回到shell提示符,就像剛剛發生的事情一樣,但除了內置的少數內容之外,你不能執行任何命令 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.
    

所以它刪除了一切,包括 rmls 和所有其他命令,但你仍然登錄。有些特殊文件夾沒有被刪除,例如某些設備 /dev/proc 要么 /sys 它們不是常規目錄/文件,但它是偽文件系統,提供進程和內核數據的接口。

如果你沒有Vagrant或Linux,你可以玩一些 JavaScript Linux x86模擬器

如果您對從災難中恢復的可能性感興趣,請檢查:


1
2017-09-27 15:17