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

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

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


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


评论

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

我刚刚在tinycore / microcore linux上尝试了sudo rm -rf /,看来该操作系统可以保护多个目录(/ sys和其他目录)免遭删除。

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

请稍等,我会尝试...

我一直在苹果商店做这件事

#1 楼

如果您有来自GNU coreutils的rm(很可能是常规Linux发行版),则内置保护会拒绝rm -rf /(根据联机帮助页和Wikipedia,请不要尝试这样做)。

您可以使用--no-preserve-root覆盖此保护。然后,rm将删除所有可能的内容,而在尝试删除每个文件之后不会停止。当然,它不会删除/proc/sys之类的虚拟文件系统,但这无关紧要–它将删除磁盘上的所有内容。命令完成后,磁盘将被清空,包括操作系统。内核和当前进程将继续从内存中运行,但是许多进程将死亡,因为它们将无法访问某些文件。操作系统下次无法启动。

评论


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

–n0pe
2011年7月20日15:55

+1特别适用于--no-preserve-root,因为通常不会提到。

– Matjij G.
2011年7月20日在18:29

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

–zzzzBov
2011年7月20日在21:55

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

–胸骨
2011年7月21日在4:44



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

–安迪·李·罗宾逊(Andy Lee Robinson)
2011年7月24日在20:37

#2 楼

对于那些喜欢在听技术音乐的同时直观地做这些事情的人。

在Linux上运行rm- rf(视频)

如果您可以将进程命名为,则奖励点他们开始死亡。

#3 楼

设置VM并尝试娱乐吗?

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

如果放手,即使您可以轻松取回一些数据,操作系统也几乎无法恢复。

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

评论


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

–n0pe
11年7月20日在13:53

错误地将命令写入主机系统的终端

–slhck
11年7月20日在13:58

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

– akseli
2011年7月20日的14:00

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

–n0pe
11年7月20日在14:08

使用Amazon EC2,应该可以迅速启动其已经安装了Linux的AMI,然后启动...

– David d C e Freitas
2011年7月22日在19:35

#4 楼

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

rm:无法删除'/ dev / pts':设备或资源繁忙
rm:可以' t删除'/ 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:无法删除'/':设备或资源正忙


评论


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

–n0pe
11年7月20日在14:28

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

– pjc50
2011年7月20日15:35

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

– CarlF
2011年7月20日在17:11

#5 楼

我记得这是在过去的日子里在alt.sysadmin.recovery上被咀嚼的,当时没有/proc这样的东西,而/dev只是一个常规目录,包含一堆不寻常的inode的条目...

。 ..但是,在Unix的某些变体上(我的记忆是HP-UX,但这可能是完全错误的),您无法删除正在运行的程序的最后一个目录条目。 (共享库?这是什么?)在这种系统上,如果您以维护模式启动了一个库(那么什么也没有在运行,但是您的shell甚至init都没有运行,并且没有安装辅助文件系统)并执行exec /bin/rm -rf /,则将剩下一个完全空的根文件系统,但/bin/bin/rm可以生存。

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

#6 楼

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] 



评论


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

–Random832
2011年7月20日在16:22



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

– jlliagre
2011年7月20日在20:57



那条论点纯属天才。

–内特C-K
2011年7月20日在22:09

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

–Random832
2011年7月20日在22:30



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

– jlliagre
2011年7月20日在22:44



#7 楼

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

评论


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

–n0pe
11年7月20日在17:15

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

– Ambroz Bizjak
2011年7月20日在17:25

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

– CarlF
11年7月20日在19:25

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

–沃伦
11年7月20日在19:25

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

– Lie Ryan
2011年7月20日在19:49

#8 楼

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

评论


“ [不删除]仅是操作系统必不可少的过程”-哦,不用担心。与Windows不同,即使文件对于操作系统至关重要且正在使用中,Linux也会愉快地擦除所有内容。 / boot,/ sbin,/ etc,/ bin,/ vmlinuz?爸,走了如果没有这些,祝您好运-实际上,一旦删除完成,祝您好运。

– Piskvor离开了建筑物
2011年7月20日在16:26



如果我记得有一些未被删除的文件,我让我的linux运行了4个小时以上。但是,还是知道发生了什么还是很好的,就像执行chmod 777 / * -fR;)

– Anarko_Bizounours
2011年7月21日在7:25

“ chmod 777 / * -fR”-尽管非常易于使用,但这应该只会使系统非常不安全。

–巴特·范·休克洛姆(Bart van Heukelom)
2011年7月26日在18:41

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

– Killermist
2012年7月27日在12:40

chmod -fR 777 /是有害的,因为它会关闭setuid和setgid位。

– G-Man说“恢复莫妮卡”
15年6月17日在20:47

#9 楼

您可以获得多远的距离,基本上取决于特定的Unix / Linux发行版。

但是要回答您的基本问题,是的-rm命令以及/bin中的任何其他标准命令都将被删除和其他文件夹。

这是我在Linux Ubuntu 15.04上使用VM进行的简单测试。



通过vagrant初始化虚拟机:

vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh



然后,当您尝试以标准方式删除所有文件时,它不会让您:

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



所以尝试--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模拟器。

如果您有兴趣从这种灾难中恢复,请检查:


星期一早上的错误:sudo rm -rf --no-preserve-root /