叉子炸弹如何工作?


22
  • 警告请勿尝试在生产机器上运行

在阅读有关该主题Wikipedia页面时,通常会使用以下代码来了解发生的情况:

:(){ :|:& };:

描述摘录

接下来的叉子炸弹在2002年被作为艺术品展出;56 其确切来源尚不清楚,但在2002年之前在Usenet上存在。通过将以下13个字符粘贴到UNIX shell(例如bashzsh)中来执行炸弹 。它通过定义一个称为“:”的函数进行操作,该函数两次调用自身,一次在前台,一次在后台。

但是最后一点对我来说还不是很清楚。我看到了函数定义:

:(){ ... }

但是还发生了什么?还做其他壳,例如kshcshtcsh也遭受了能够构造类似的东西同样的命运?


2
这其中经常会弹出堆栈上的交流,良好的答案就在这里:stackoverflow.com/questions/991142/...
Drav斯隆

@DravSloan-我试图在这里创建某些内容,我的问题是这样加载的(8-)。
slm

您可能需要添加强制性的命令:“为了上帝的爱,请不要在生产机器上运行它,或者如果您想继续使用在机器上运行它的机器,则!” 消息:)
Drav Sloan

1
@MartinSchröder-您了解这个问题是导致这个问题被问到的原因吗?8)。我在星期五晚上问这个问题,然后又花了一个小时或两小时问了​​另一个问题。
slm

1
@MartinSchröder-最好将它们分开放置,它们略有不同。这要求提供有关叉式炸弹工作原理的完整详细视图,而另一个人则要求提供有关系统如何在叉式炸弹内分叉的机制的细节。我知道这似乎使他们困惑,尽管它们相互关联,但是它们是不同的(IMO-显然)。我什至回答了另一个问号,并试图显示驱动分叉的引擎盖下的机制,但我没有将其标记为重复。
slm

Answers:


23

这个前叉炸弹总是让我想起AI编程老师在我参加的第一批课程中所说的话:“要了解递归,首先必须了解递归”。

本质上讲,该炸弹是递归函数。本质上,您创建了一个函数,该函数调用自身,调用自身,调用自身....,直到消耗系统资源为止。在此特定实例中,通过使用将函数传递给自身并对其进行背景处理来放大递归。

我已经在StackOverflow上看到了这个答案,并且我认为给出的示例最好地说明了这一点,只是因为一眼就能看出它的作用(从上面的链接中窃取了……)。

☃(){ ☃|☃& };☃

定义bug函数☃() { ... },其主体调用自身(bug函数),将输出传递给自身(bug函数) ☃|☃,并为结果提供背景&。然后,在定义函数后,实际调用bug函数; ☃

我注意到,至少在我的Arch VM上,不需要使进程后台具有相同的最终结果,就不需要消耗所有可用的进程空间并渲染主机。实际上,我现在已经说过,它有时似乎会终止失控过程,并且在对其进行筛选后-bash: fork: Resource temporarily unavailable将以停止Terminated(并journalctl显示bash核心转储)。

要回答有关csh / tcsh的问题,这些shell都不支持功能,您只能使用别名。因此,对于这些Shell,您必须编写一个递归调用自身的Shell脚本。

zsh似乎遭受了相同的命运(具有相同的代码),没有核心转储并导致Arch放弃Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.,但它仍然继续派生。一段时间后,它会声明Killed process 162 (systemd-logind) ...(并且仍然有分叉的zsh)。

Arch似乎没有pacmanksh版本,因此我不得不在debian上尝试。ksh将其:作为函数名,但是使用了一些东西- b()好像看起来具有期望的结果。


这些字符是什么?我知道它们是虫子,但是您是如何制造它们的?
slm

10
虽然字体很小,但看起来确实像个虫子,您会发现它实际上是一个雪人。那将是Unicode字符U + 2603,可以通过输入&#x 2603而不用空格来以html显示。
sambler

2
显然,在Linux下,相当多的Gnome相关应用程序和Firefox支持Ctrl+Shift+u+<hex>十六进制是要显示的Unicode字符的十六进制代码。可见的Unicode列表可在以下位置找到:fileformat.info/info/unicode/utf8test.htm(大多数奇怪的代码在“其他”部分中)。Windows应该检出superuser.com/questions/47420/…,我个人使用链接中提到的工具,unicodeinput.exe或者通过浏览器剪切和粘贴。您始终可以按照sambler的建议使用html序列。
Drav Sloan

1
Wiki也有一个Unicode字符列表:en.wikipedia.org/wiki/List_of_Unicode_characters
Drav Sloan

我喜欢堆雪人的错误,您在这里使用的那个错误未显示在我的系统上,,看起来像是一个带有十六进制数字的框。
terdon
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.