Bash命令:(){:|:&} ;:会产生内核死亡的进程。 你能解释一下这个语法吗?

我偶然发现这个网页 ,并不明白这是如何工作的。

这个命令“以指数forms产生子过程,直到你的盒子locking”。

但为什么? 我less掉的是冒号。

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

该函数定义了一个名为的函数:它自己调用两次(代码: | : 。 它在后台( & )中这样做。 之后 函数定义完成,函数启动。

因此,每个实例:启动两个新的:等等…就像一个进程的二叉树…

用普通的C写的是:

 while(1) { fork(); } 
 :(){ :|:& };: 

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

换行符:

 :() { :|:& }; : 

将函数重命名为forkbomb

 forkbomb() { forkbomb | forkbomb & }; forkbomb 

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

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

更为永久的是,您可以使用/etc/security/limits.conf (至less在Debian和其他版本上),例如:

 * hard nproc 50 

当然,这意味着你只能运行50个进程,你可能想要增加这个取决于机器在做什么!

尝试这个时,我有不同的效果。 根据(我相信)已经configuration的进程数量和CPU功率的上限,它在某些系统上几乎没有出现波动,而完全冻结了其他系统。