El comando Bash: () {: |: &}; generará procesos para la muerte del kernel. ¿Puedes explicar la syntax?

Me encontré con esta página y no puedo entender cómo funciona esto.

Este comando “genera de manera exponencial subprocesos hasta que su caja se bloquea”.

¿Pero por qué? Lo que menos asimilo son los dos puntos.

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

Eso define una función llamada : que se llama dos veces (Código : | : . Lo hace en el fondo ( & ). Después de ; la definición de la función está hecha y la función : comienza.

Entonces cada instancia de: comienza dos nuevas: y así sucesivamente … Como un árbol binario de procesos …

Escrito en el plano C que es:

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

..define una función llamada : que se genera a sí misma (dos veces, una canalización a la otra) y los fondos mismos.

Con saltos de línea:

 :() { :|:& }; : 

Cambiar el nombre de la función : a forkbomb :

 forkbomb() { forkbomb | forkbomb & }; forkbomb 

Puede evitar dichos ataques utilizando ulimit para limitar el número de procesos por usuario:

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

De forma más permanente, puede usar /etc/security/limits.conf (en Debian y otros, al menos), por ejemplo:

 * hard nproc 50 

Por supuesto, eso significa que solo puede ejecutar 50 procesos, ¡puede boost esto dependiendo de lo que la máquina esté haciendo!