slm*_*slm 22 bash zsh shell-script fork
在阅读有关该主题的维基百科页面时,我通常遵循以下代码的内容:
:(){ :|:& };:
Run Code Online (Sandbox Code Playgroud)
描述摘录
以下叉形炸弹在 2002 年作为艺术呈现;56 它的确切来源未知,但它在 2002 年之前就存在于 Usenet 上。该炸弹通过将以下 13 个字符粘贴到bash或zsh等UNIX shell 中来执行 。它通过定义一个名为“:”的函数来运行,该函数调用自己两次,一次在前台,一次在后台。
然而,最后一点对我来说并不完全清楚。我看到函数定义:
:(){ ... }
Run Code Online (Sandbox Code Playgroud)
但是还有什么事情发生呢?还做其他壳,例如ksh
,csh
和tcsh
也遭受了能够构造类似的东西同样的命运?
Dra*_*oan 24
这个叉子炸弹总是让我想起一位人工智能编程老师在我参加的第一堂课上说过的话“要了解递归,首先你必须了解递归”。
这个炸弹的核心是一个递归函数。本质上,您创建一个函数,它调用自身,调用自身,调用自身......直到消耗系统资源。在这个特定的例子中,通过使用管道将函数传递给它自身并将其作为背景来放大递归。
我已经在StackOverflow上看到了这个答案,我认为那里给出的例子最能说明它,只是因为它更容易一目了然地看到它的作用(从上面的链接中窃取......)
?(){ ?|?& };?
Run Code Online (Sandbox Code Playgroud)
定义 bug 函数?() { ... }
,它的主体调用自身(bug 函数),将输出传送到自身(bug 函数) ?|?
,并将结果作为背景&
。然后,定义函数后,实际调用bug函数,; ?
。
我注意到,至少在我的 Arch VM 上,需要后台进程并不是获得相同最终结果、消耗所有可用进程空间并渲染主机 b0rked 的要求。实际上,现在我已经说过,它似乎有时会终止失控的进程,并且经过一屏之后-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 似乎没有pacman
ksh 版本,所以我不得不在 debian 上尝试它。ksh 对象 to:
作为函数名,但使用某些东西 - sayb()
似乎有想要的结果。