The Bash command :(){ :|:& };: will spawn processe

2019-01-04 00:51发布

I stumbled upon this page and can't understand how this works.

This command "exponentially spawns subprocesses until your box locks up".

But why? What I grok less are the colons.

user@host$ :(){ :|:& };:

标签: linux bash
2条回答
等我变得足够好
2楼-- · 2019-01-04 01:15
:(){ :|:& };:

..defines a function named :, which spawns itself (twice, one pipes into the other), and backgrounds itself.

With line breaks:

:()
{
    :|:&
};
:

Renaming the : function to forkbomb:

forkbomb()
{
    forkbomb | forkbomb &
};
forkbomb

You can prevent such attacks by using ulimit to limit the number of processes-per-user:

$ ulimit -u 50
$ :(){ :|:& };:
-bash: fork: Resource temporarily unavailable
$

More permanently, you can use /etc/security/limits.conf (on Debian and others, at least), for example:

* hard nproc 50

Of course that means you can only run 50 processes, you may want to increase this depending on what the machine is doing!

查看更多
劫难
3楼-- · 2019-01-04 01:19

That defines a function called : which calls itself twice (Code: : | :). It does that in the background (&). After the ; the function definition is done and the function : gets started.

So every instance of : starts two new : and so on... Like a binary tree of processes...

Written in plain C that is:

while(1) {
    fork();
}
查看更多
登录 后发表回答