Bash命令:(){:|:&};:将生成进程到内核死亡.你能解释一下语法吗?

sil*_*iot 36 linux bash

我偶然发现了这个页面,无法理解这是如何工作的.

此命令"指数生成子进程,直到您的盒子锁定".

但为什么?我不太喜欢的是冒号.

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

dbr*_*dbr 79

:(){ :|:& };:
Run Code Online (Sandbox Code Playgroud)

..定义一个名为的函数:,它产生自身(两次,一个管道到另一个)和背景本身.

有换行符:

:()
{
    :|:&
};
:
Run Code Online (Sandbox Code Playgroud)

:函数重命名为forkbomb:

forkbomb()
{
    forkbomb | forkbomb &
};
forkbomb
Run Code Online (Sandbox Code Playgroud)

您可以通过使用ulimit限制每个用户的进程数来防止此类攻击:

$ ulimit -u 50
$ :(){ :|:& };:
-bash: fork: Resource temporarily unavailable
$
Run Code Online (Sandbox Code Playgroud)

更永久地,你可以使用/etc/security/limits.conf(至少在Debian和其他人身上),例如:

* hard nproc 50
Run Code Online (Sandbox Code Playgroud)

当然这意味着你只能运行50个进程,你可能希望根据机器的运行情况增加这些进程!

  • Upvoted - 赋予:函数一个更清晰的名称正是我如何对代码进行模糊处理. (10认同)
  • @CiroSantilli:`&&`按顺序运行命令.`|`同时运行,标准文件句柄重定向到管道. (2认同)

Joh*_*iss 64

它定义了一个:调用自身两次的函数 (代码:) : | :.它在后台(&)中完成.完成;函数定义并:启动函数后.

因此,每个实例:启动两个新的:依此类推......就像进程的二叉树一样......

用简单的C写的是:

while(1) {
    fork();
}
Run Code Online (Sandbox Code Playgroud)

  • C等价物并不完全相同(因为每个过程在理论上会产生无限量的自身,而每个bash-forkbomb过程将"仅"产生两个过程),尽管两者都具有相同的结果. (3认同)
  • 更接近的 C 版本:`while (fork() == 0 || fork() == 0);` (2认同)