危险!
除非您已准备好崩溃和/或强制重新启动系统,否则请不要运行此命令以对其进行“测试”。

我在Virtualbox中正在运行12.04尝试编译应用程序,而在等待期间,我偶然在一个论坛上偶然遇到一条评论说:

尝试:(){ :|: & };:
也很有趣,并且不需要root。 >
不经意间,我在自己的gnome终端中运行了它。它使我的12.04(在Virtualbox中)的延迟非常严重,我不得不将其关闭。
我的问题是该命令的作用是什么?

:(){:|:&}; :


评论

相关的如何保护Ubuntu免受叉子炸弹的攻击

另请参见旧线程:ubuntuforums.org/showthread.php?t=1392511

相关:叉炸弹如何工作?并且fork()上的fork()在哪里:(){:|:&};:??

“如此严重的滞后”是相当乐观的。

相关:Bash命令:(){:|:&} ;:将产生进程,使内核死亡。你能解释一下语法吗?在SO

#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 楼

如上所述,它被称为“叉子炸弹”,而另一种实现方式是使用后台执行而不是管道:

:(){ :&:;};: