使用rm -rf /命令可以获得多远的距离?


200

我经常想知道如果您运行该系统实际上能走多远rm -rf /。我怀疑操作系统是否可以擦除自身(?)

奖励问题:执行命令后,rm是否将自身删除?

更新: 我已经使用VirtualBox在几个主要的unix发行版中对此进行了测试,答案准确地描述了会发生什么。如果给出正确的参数,rm将删除光盘上的每个物理数据位。但是,当使用rm而不是GNU版本时,我遇到了一些问题。例如,我相信BusyBox有其自己的版本,它不允许您尽可能多地删除它。

这个问题是本周超级用户问题
阅读2011年7月7日的博客条目以了解更多详细信息,或提交自己的“本周问题”。


8
您问这个问题很有趣。我只是在另一个论坛上回答另一个rm -f问题,开始想起我前一段时间读过的一篇文章。幸运的是,我保存了这样的时间经典的Unix恐怖故事除了有趣的是,它看起来还有多远……我认为这是一篇写得很好的文章,通常读起来不错!
akseli 2011年

3
我刚刚sudo rm -rf /在tinycore / microcore linux上尝试过,看来该操作系统可以保护多个目录(/ sys和其他目录)不被删除。
n0pe 2011年

47
我试过rm -f /bin/rm一次 不幸的是,它奏效了,我花了一个小时才rm从GNU coreutils 获得了正确的版本。
squircle

17
请稍等,我会尝试...
Martijn Courteaux 2011年

38
我一直在苹果商店里这样做
eggie5'7

Answers:


188

如果您使用的rm是GNU coreutils(很可能是常规的Linux发行版),rm -rf /它将被内置的保护功能拒绝(根据联机帮助页和Wikipedia,请不要尝试过)。

您可以使用来覆盖此保护--no-preserve-rootrm然后将删除所有可能的内容,而在尝试删除每个文件后不会停止。当然,它不会删除像/proc/sys这样的虚拟文件系统,但这无关紧要-它会删除磁盘上的所有内容。

命令完成后,您的磁盘将被清空,包括操作系统在内。内核和当前进程将继续从内存中运行,但是许多进程将死亡,因为它们将无法访问某些文件。操作系统下次无法启动。


67
正是我想要的。现在,利用这种力量来占领世界。
n0pe 2011年

34
+1,尤其是--no-preserve-root因为通常没有提到。
马捷G.

22
@MaxMackie,值得注意的是,黑客很快发现这是他们对用户可能没有的有用的操作。它会破坏可用于赚钱的任何数据,并防止黑客进一步利用该计算机。就像带昆虫的猫一样,您不想杀死它,只想玩一会儿,因为它很有趣。
zzzzBov 2011年

5
要回答OP的其他问题,是的,rm将删除自己。即使有可执行文件正在运行,也完全可以修改或删除该可执行文件。它也将继续运行,并且不受更改的影响。
thomasrutter

3
我想在/提及“ chmod -R user:user *”,因为它也是一个递归且代价高昂的错误。我做了一次,到我可能中止的时候已经到达了/ home的一半。/ bin / boot / etc / dev拥有。幸运的是,当我手动花费接下来的几个小时并从参考系统重置所有权时,服务器一直保持运行状态。但是,之后没有其他人可以使用su或sudo。最终发现/ bin / su不再设置其setuid位。请注意未来:锁定/ bin / su将重置其setuid位!
安迪·李·罗宾逊


22

设置虚拟机并尝试娱乐吗?

它会走得很远...如果您使用的是gui,您可能会发现有趣的是,它会明显降低性能。(菜单上的图标停止加载等)

如果您放手,尽管您可以轻松取回一些数据,但该操作系统几乎无法恢复。

无论哪种方式,您都需要重新安装操作系统。


7
我什至没有想到要在VM中尝试它。现在要尝试!哦,这很有趣。
n0pe 2011年

40
错误地将命令写到主机系统的终端
slhck

1
查看我发布的文章。“经典的Unix恐怖故事!”
akseli 2011年

1
我现在正在工作,没有时间完整安装一个流行发行版(ubuntu / slack / suse / fedora)。如果其他任何人都可以克隆VM磁盘文件并为我们尝试,那就太好了。
n0pe 2011年

2
使用Amazon EC2,应该可以迅速启动其已经安装了Linux的AMI,然后将其开除...
David d C e Freitas

11

好吧,在http://bellard.org/jslinux/上尝试它会产生:

rm:无法删除“ / dev / pts”:设备或资源繁忙
rm:无法删除“ / dev”:目录不为空
rm:无法删除“ / proc / swaps”:不允许的操作
rm:可以't remove'/ proc / kallsyms':不允许操作
rm:无法删除'/ proc / dma':不允许操作

SNIP 881条目

rm:无法删除“ / proc / 149 / oom_adj”:权限被拒绝
rm:无法删除“ / proc / 149”:不允许的操作
rm:无法删除“ / proc”:设备或资源繁忙
rm:无法删除'/ tmp':设备或资源繁忙
rm:无法删除'/':设备或资源繁忙


1
是的,我也收到这些错误/警告。您认为这个标准吗?
n0pe 2011年

5
/ proc,/ sys(有时是/ dev)以及任何安装点是操作系统的属性,不能删除。
pjc50 2011年

1
与@ pcj50相同,这些文件实际上不是硬盘上的文件,因此“删除”它们没有意义。
Carf 2011年

7

我记得这是在过去的alt.sysadmin.recovery日子里被反复咀嚼的,当时没有诸如之类的东西/proc,而/dev只是一个包含大量异常inode条目的常规目录...

...但是,在Unix的某些变体上(我的记忆是HP-UX,但这可能是完全错误的),您无法删除正在运行的程序的最后目录条目。(共享库?这些是什么?)

在这样的系统中,如果你开始一起来维护模式(因此没有运行,但你的shell,甚至没有init,并安装任何辅助文件系统)并没有exec /bin/rm -rf /,你会留下一个完全空的根文件系统的不同之处在于/bin/bin/rm会生存。

可怕的恶魔修道院的居民认为这是适当的。


4

rm -rf / 在最近的实现中不应被允许,因为已经建议它违反了POSIX标准:

rm -rf /在Oracle博客”保护

无论如何,最后,我们对规范进行了修改,并且Solaris 10具有(自内部版本36起)/ usr / bin / rm(/ bin是Solaris上/ usr / bin的符号链接)和/ usr /的版本。 xpg4 / bin / rm的行为如下:

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

2
“指出如果一个人递归地删除“ /”,一个人最终将试图删除“ ..”和“。”,而我们所做的就是允许rm启发式地预先确定这一点。 !“-嗯,那会不会不允许删除任何目录?实际规格仅不允许..和。在实际的命令行参数中,它并没有说明您“最终尝试删除”的内容
Random832

1
为什么不允许删除任何目录?根目录是这里唯一关心的问题,删除它显然意味着删除了“。” 和“ ..”,无论当前目录是什么。标准解释中不禁止常识。
jlliagre 2011年

1
那条论点纯属天才。
Nate CK

该标准规定,如果参数具有字符串“。”,则不允许rm继续或“ ..”作为基本名称组件。/foo/..即使您不在,也无法删除/foo。它没有指定不允许您删除当前目录(例如rm -r `pwd`)或当前目录的父目录。
2011年

2
的确,我误解了该声明,您是正确的。希望标准人员接受更聪明的行为,使其符合标准。删除大部分文件系统(如果不是全部)将很快使OS不符合标准。
jlliagre

3

我没有看到其他人提出的一点:当前打开的文件(例如rm本身),即使已删除,也不会真正从驱动器中消失,直到关闭。


是的,因为它们已加载到内存中了吗?
n0pe 2011年

我不确定这是否安全;内核很可能只需将已删除的文件加载到内存中,然后立即将其删除到磁盘上,并保留此内存副本,直到打开文件为止(例如,直到rm运行)。
2011年

我没有猜测。如果程序正在运行,至少在我的Linux机器上删除它不会将其删除。(请记住,我已经好几年没有对此进行测试了。)
Carf 2011年

4
rm 会将自己从fs中删除- 程序已完全加载到内存中,而不是文件中
沃伦

4
@MaxMackie:不是因为它们已加载到内存中,而是因为打开的文件引用具有与硬链接相同的功能(即,如果文件具有至少一个硬链接,则不会从磁盘上将其删除)。
Lie Ryan

1

在终端中以root用户身份登录过一次(在让我生气的服务器上)尝试过,您几乎会丢失所有内容。唯一不会被删除的仅仅是操作系统必需的过程。


12
“ [不删除]仅是操作系统必需的过程”-哦,不用担心。与Windows不同,即使文件对操作系统很重要正在使用中,Linux也会愉快地擦除所有内容。/boot/sbin/etc/bin/vmlinuz?爸,走了 没有那些好运气启动-事实上,运气好的话做任何事情,一旦删除完成的。
Piskvor 2011年

如果我记得有一些未被删除的文件,我让我的Linux运行了4个小时以上。但是,仍然很高兴知道发生了什么,例如执行chmod 777 / * -fR;)
Anarko_Bizounours

3
“ chmod 777 / * -fR”-这将使系统非常不安全,尽管非常易于使用。
Bart van Heukelom

1
@BartvanHeukelom,某些工具将执行快速的自检,或者由系统测试是否拥有适当的所有权和权限,并且如果配置错误,则拒绝采取措施。
killermist 2012年

1
chmod -fR 777 /这是有害的,因为它会关闭setuid和setgid位。
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
    

    之后,它像没有发生任何事情一样返回到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模拟器

如果您对从此类灾难中恢复的可能性感兴趣,请检查:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.