危险!
除非您已准备好崩溃和/或强制重新启动系统,否则请不要运行此命令以对其进行“测试”。
我在Virtualbox中正在运行12.04尝试编译应用程序,而在等待期间,我偶然在一个论坛上偶然遇到一条评论说:
尝试
:(){ :|: & };:
也很有趣,并且不需要root。 >
不经意间,我在自己的gnome终端中运行了它。它使我的12.04(在Virtualbox中)的延迟非常严重,我不得不将其关闭。
我的问题是该命令的作用是什么?
:(){:|:&}; :
#1 楼
这称为叉子炸弹。:()
意味着您正在定义一个名为:
的函数{:|: &}
意味着运行该函数:
并将其输出再次发送到:
函数并运行;
是命令分隔符。:
首次运行该函数。本质上来说,您正在创建一个函数每次呼叫都会自叫两次,并且无法终止自身。在您耗尽系统资源之前,它会一直加倍。
在Virtualbox中运行非常明智,否则您将不得不重新启动PC。
评论
这个答案似乎表明重启是唯一的办法。但实际上,这种叉子炸弹无需重新启动即可杀死,并且我实际上观察到它在某些系统上仍然无法正常工作(因为它们的生成限制是合理设置的)。
–康拉德·鲁道夫(Konrad Rudolph)
2012年7月4日14:07
实际上,要进行完整的解释,可能应该提到;是命令分隔符。 {...}部分只是函数的内容。
–用户
2012年7月4日在14:08
@SuperMatt我不知道这个问题是否仍然有效,但是无论如何我想知道和做。我了解您已经提供了该功能的功能,但我想知道这两个功能
– Noober
2015年9月26日上午8:31
@Noober,如果您仍然想知道(我是Linux的这个简短而神秘的文档的黑洞),我知道! |是一个放置在命令之后的管道,用于将命令输出作为输入发送到随后的命令。 &是一个分叉,它为前面的命令创建一个新线程,使当前线程继续执行更多命令
– Flurbius
16 Mar 24 '16 at 6:41
基于@flurbius的响应,并且在答案中提到:&&是一个同步命令,它在执行以下代码之前等待上一个命令完成。例如mkdir new_directory && cd new_directory将创建一个新目录,完成后将执行cd new_directory;如果要执行mkdir new_directory和cd new_directory,则会从cd程序中得到一个错误(但该目录是由mkdir创建的,但在mkdir退出其进程之前执行了cd)。
– Sgnl
17年1月12日在2:35
#2 楼
这是在外壳中实现的所谓的前叉炸弹。维基百科:
:(){ :|:& };:
\_/| |||| ||\- ... the function ':', initiating a chain-reaction: each ':' will start two more.
| | |||| |\- Definition ends now, to be able to run ...
| | |||| \- End of function-block
| | |||\- disown the functions (make them a background process), so that the children of a parent
| | ||| will not be killed when the parent gets auto-killed
| | ||\- ... another copy of the ':'-function, which has to be loaded into memory.
| | || So, ':|:' simply loads two copies of the function, whenever ':' is called
| | |\- ... and pipe its output to ...
| | \- Load a copy of the function ':' into memory ...
| \- Begin of function-definition
\- Define the function ':' without any parameters '()' as follows:
评论
尽管这是一个切点,并且可能会重载“ disown”一词,但从技术上讲,不会抛弃置于后台的进程,并且始终可以使用“ fg”命令将其置于前台,并且如果出现以下情况,该进程将终止用户注销(如果仍有资源可用于完成注销)....除非并且直到用户在进程或Jobid上运行“取消”。在那之后,它确实被取消了:注销将不会终止,并且fg无效。
– Rondo
17年1月29日在4:28
尽管这只是一个小问题,但括号并不意味着在bash状的shell中没有任何参数,它们只是C风格语言留下的修饰。
–查理·哈丁(Charlie Harding)
18年7月8日在20:15
#3 楼
该命令是fork炸弹的知名版本。它会无限次派生一个进程,从而导致计算机用尽内存。您还可以使用一些保护措施来防止它:
Unix类型的系统通常具有进程限制,由ulimit shell命令或其后继程序setrlimit控制。 Linux内核设置并强制执行进程的RLIMIT_NPROC rlimit(“资源限制”)。如果某个进程尝试执行派生,而拥有该进程的用户已经拥有
RLIMIT_NPROC
进程,则该派生失败。此外,在Linux或* BSD上,可以将pam_limits
配置文件/etc/security/limits.conf
编辑为相同的效果。但是,并非所有Linux发行版都默认安装了pam_limits
模块。#4 楼
根据这个:(){ :|: & };:
被称为Forkbomb是一种诗意的病毒创建者
...这个狡猾的小程序命令它制作多个副本
/>本身,会引起连锁反应,从而迅速耗尽
系统的资源...
,因此建议不要运行此操作,否则可能导致硬件损坏循环执行可能会导致笔记本电脑容易发热。
此处的另一个链接介绍了屏幕截图。
评论
如果叉式炸弹造成硬件损坏,那么您将面临更大更深的问题。
–用户
2012年7月4日在14:15
也许他说的是叉子附近会爆炸的叉状炸弹?
– dsocolobsky
2012年7月4日在18:02
屏幕截图的链接已损坏。
– IMustBeSomeone
17年12月3日在21:58
如果它造成硬件损坏,则意味着它暴露了已经存在的硬件问题。就像笔记本电脑的散热风扇或空气通道堵塞。它只是使机器长时间以100%的负载运行。 (CPU,主内存和硬盘(假设虚拟内存)在高负载下运行,其中之一是限制部分以100%运行)。这可能在完全良性的情况下发生,例如多种模拟软件。
– Volker Siegel
20年1月24日在14:07
#5 楼
如上所述,它被称为“叉子炸弹”,而另一种实现方式是使用后台执行而不是管道::(){ :&:;};:
评论
相关的如何保护Ubuntu免受叉子炸弹的攻击另请参见旧线程:ubuntuforums.org/showthread.php?t=1392511
相关:叉炸弹如何工作?并且fork()上的fork()在哪里:(){:|:&};:??
“如此严重的滞后”是相当乐观的。
相关:Bash命令:(){:|:&} ;:将产生进程,使内核死亡。你能解释一下语法吗?在SO