2009-02-05 30 views
34

Me encontré con this page y no puedo entender cómo funciona esto.El comando Bash:() {: |: & };: generará procesos para la muerte del kernel. ¿Puedes explicar la sintaxis?

Este comando "genera de forma exponencial subprocesos hasta que la caja se bloquea".

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

[email protected]$ :(){ :|:& };:

+0

Estoy seguro de que este es un duplicado exacto, pero no puedo encontrar la pregunta original en este momento. – SpoonMeiser

+0

@SpoonMeiser quizás esto es ?: http://askubuntu.com/questions/159491/why-did-the-command-make-my-system-lag-so-badly-i-had-to-reboot – tox123

Respuesta

61

que define una función llamada : que se llama dos veces (Código: : | :). Lo hace en segundo plano (&). Después del ;, se realiza la definición de la función y se inicia la función :.

Así que cada instancia de: comienza dos nuevos: y así sucesivamente ... Al igual que un árbol binario de los procesos ...

Escrito en C plano que es:

while(1) { 
    fork(); 
} 
+3

The C equivalente no es exactamente el mismo (ya que cada proceso generará teóricamente cantidades infinitas de sí mismo, mientras que cada proceso de bash-forkbomb generará "solo" dos procesos), aunque ambos tienen el mismo resultado. – dbr

+1

dbr, sí, eso es correcto. Pensé en eso al momento de escribir, pero ese código C es más limpio y simple. El bash uno es como un árbol binario, el C es como un árbol n-ario. –

+0

Versión C más cercana: 'while (fork() == 0 || fork() == 0);' –

76
:(){ :|:& };: 

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

con saltos de línea:

:() 
{ 
    :|:& 
}; 
: 

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

forkbomb() 
{ 
    forkbomb | forkbomb & 
}; 
forkbomb 

Puede evitar este tipo de ataques mediante el uso de ulimit para limitar el número de procesos por usuario:

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

Más permanentemente, puede utilizar /etc/security/limits.conf (en Debian y otros, por lo menos), por ejemplo:

* hard nproc 50 

Por supuesto que significa que sólo puede ejecutar 50 procesos, es posible que desee aumentar este dependiendo de lo que la máquina está haciendo!

+10

Upvoted - dando a la función: un nombre más claro es exactamente cómo habría desenfusionado el código. – slim

+0

¿Por qué la tubería '|'?Golfing ('&&' ¿podría usarse?) O ¿hay una función? –

+2

@CiroSantilli: '&&' ejecuta los comandos secuencialmente. '|' ejecuta ambos simultáneamente, con manejadores de archivos estándar redirigidos a un conducto. –

1

He tenido diversos efectos al intentar esto. Dependiendo (creo) del límite superior configurado para la cantidad de procesos y la potencia de la CPU, causó apenas un bache en algunos sistemas mientras que otros se congelaron por completo.

Cuestiones relacionadas