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


23

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

:(){ :|:& };:

警告:除非您有严格的proc限制(您可能没有),否则上面的代码将使您的计算机崩溃,这将提示硬重启。

考虑此代码类似于running sudo rm -rf /

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


16
另外一点:确实与完全不同sudo rm -rf /。该命令将删除所有文件;这只是阻塞了计算机的资源,直到无法使用为止,您必须重新启动。
jtbandes 2010年

@jtban:然后编辑它。这两段代码都是我认为“危险”运行的代码。是的sudo rm -rf /,这样比较危险,但是我已经看到人们在远程服务器上执行此操作,“只是想看看它做了什么”,因此您很难在不访问控制面板的情况下重新启动。
乔什(Josh K)2010年

7
其emotibomb:P
RCIX

注意可能是arbitrary_name(){ arbitrary_name|arbitrary_name& };arbitrary_name。这个名字:不仅使这个命令短而神秘,同时也把一个:内置的,做什么都不成,做一个功能一个不少。如果将其定义潜入:(){ :|:& }别人的环境中并让其停留在该环境中,那么当受害者对它期望小时,它就会起作用。
卡米尔Maciorowski

Answers:


40

正如您所说,这是一个前炸弹。它的作用是定义一个函数,然后调用它。该函数称为:

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

forkbomb(){ forkbomb|forkbomb& };forkbomb

如您所见,并可能从您的编程经验中猜到,第一部分是函数定义(forkbomb(){ ... }),最后一部分:是调用函数的位置(;在Bash中仅分隔语句)。

现在,此功能有什么作用?如果您熟悉Bash,您将知道该|字符将一个命令/程序的标准输出传递给另一个命令/程序的标准输入。因此,基本上,:|:启动该函数的两个实例(在这里它“分叉”)。

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


1
好答案!我没有意识到您可以使用:作为函数名。重命名会有所帮助。将在3分钟内接受。
TheLQ'7

1
+1酷...很好的解释。就像OS任务切换器的堆栈溢出一样。它是否实际上使内核崩溃了,还是只是吞噬了资源直到变得难以忍受而无法使用?
Evan Plaice

我认为它实际上不会使内核崩溃,至少不会直接崩溃。它只会不断创建更多的进程,每个进程都占用CPU和内存,并且随着处理器尝试处理所有这些进程,实际上将无法使用。可能内核最终会在负载下崩溃(我不确定),但是在此之前它将无法使用。
jtbandes 2010年

3
不要忘了解释final :,它实际上执行了功能!
Phoshi

@Phoshi:以为我做过,但是我会编辑以澄清!
jtbandes 2010年

9

摘自Wikipedia文章Forkbomb

:()      # 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.

7

细分:

: () // 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

真的很优雅。

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.