这个神秘的 Bash 命令是什么意思?

这个神秘的 Bash 命令是什么意思?

我在阅读 Ubuntu 论坛关于恶意命令的警告时发现了这个有趣的宝贝:

:(){ :|:& };:

警告:上面的代码将要除非您设置了严格的 proc 限制(您可能没有),否则会导致您的机器崩溃,从而促使硬重启。

将此代码视为类似于运行sudo rm -rf /

但这是什么意思呢?即使以我的编程经验,我也从未见过如此神秘的非汇编语言命令。

答案1

正如你所说,这是一个 forkbomb。它的作用是定义一个函数,然后调用它。该函数名为:

让我们给它命名forkbomb,以便我们更好地了解发生了什么:

forkbomb(){ forkbomb|forkbomb& };forkbomb

如您所见,并且可能根据您的编程经验猜出,第一部分是函数定义(forkbomb(){ ... }),最后一部分:是函数被调用的地方(;Bash 中的分隔语句)。

现在,这个函数有什么用?如果你熟悉 Bash,你就会知道该|字符将一个命令/程序的标准输出管道化为另一个命令/程序的标准输入。所以基本上,:|:启动函数的实例(这是它“分叉”的地方)。

然后就是魔术了:将&这些命令放在后台,允许原始函数返回,而每个实例在后台分叉直到母牛回家,从而耗尽所有资源并关闭系统(除非它对其施加了限制)。

答案2

摘自维基百科文章叉子炸弹

:()      # define ':' -- whenever we say ':', do this:
{        # beginning of what to do when we say ':'
    :    # load another copy of the ':' function into memory...
    |    # ...and pipe its output to...
    :    # ...another copy of ':' function, which has to be loaded into memory
         # (therefore, ':|:' simply gets two copies of ':' loaded whenever ':' is called)
    &    # disown the functions -- if the first ':' is killed,
         #     all of the functions that it has started should NOT be auto-killed
}        # end of what to do when we say ':'
;        # Having defined ':', we should now...
:        # ...call ':', initiating a chain-reaction: each ':' will start two more.

答案3

细分如下:

: () // Define ':' as a function. When you type ':' do the following
{
    : // Call ':' 
    | // Redirect output
    : // Into ':'
    & // Push process to the background
}; // End of ':' def
: // Now do ':'

更改:bomb,则有:

bomb(){ bomb|bomb& };bomb

它确实非常优雅。

答案4

在 Javascript 中,fork 炸弹是

function :() {
  :();
  :();
}
:();

该函数:是一个 fork 炸弹,之所以这样命名是因为它必须与 bash 命令相似。原始汇编代码是:(){:|:&}:。我将其转换为 Javascript,方法是先将其转换::();:开头的 除外,因为它是声明函数的名称)并删除|&字符,然后将 转换:(){:();:();}为以下内容:

function :() {
  :();
  :();
}

最后将:末尾的 转换为:();

相关内容