¿Por qué el comando “: () {: |: &} ;:” hizo que mi sistema se retrasara tanto que tuve que reiniciar?

286

¡PELIGRO!

No ejecute este comando para 'probarlo' a menos que esté preparado para un bloqueo y / o reinicio forzado de su sistema.

Estaba en mi Virtualbox ejecutando 12.04 tratando de compilar una aplicación, y mientras esperaba me topé con un foro donde un comentario decía:

Prueba :(){ :|: & };:
Fun, también, y no necesita root.

Sin pensarlo, lo ejecuté en mi terminal de gnomos. Hizo que mi 12.04 (en Virtualbox) se retrasara tanto que tuve que cerrarlo.

Mi pregunta es, ¿qué hace este comando?

: () {: |: &} ;:

cuchilla19899
fuente
36
relacionado Cómo proteger Ubuntu de la bomba tenedor
Sathyajith Bhat
1
También vea un hilo antiguo: ubuntuforums.org/showthread.php?t=1392511
Paddy Landau
posible duplicado entre sitios de: stackoverflow.com/questions/515844/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 六四
99
"Retrasarse tanto" es bastante optimista.
pstadler

Respuestas:

372

Esto se llama una bomba tenedor .

:() significa que estás definiendo una función llamada :

{:|: &}significa ejecutar la función :y enviar su salida a la :función nuevamente y ejecutarla en segundo plano.

El ;es un separador de comandos.

: ejecuta la función la primera vez.

Esencialmente, está creando una función que se llama a sí misma dos veces en cada llamada y no tiene ninguna forma de terminar. Se seguirá duplicando hasta que se quede sin recursos del sistema.

Ejecutar en Virtualbox fue bastante sensato, de lo contrario habría tenido que reiniciar su PC.

SuperMatt
fuente
27
Esta respuesta parece sugerir que reiniciar es el único recurso. Pero, de hecho, esta bomba tenedor se puede matar sin reiniciar, y de hecho he observado que de todos modos no funciona correctamente en algunos sistemas (porque su límite de generación se establece de manera sensata).
Konrad Rudolph el
27
En realidad, para una explicación completa, esto probablemente debería mencionar que ;es un separador de comandos. La { ... }parte es simplemente el contenido de la función.
un CVn
@ MichaelKjörling +1 Ni siquiera entendí la sintaxis hasta que tomé en cuenta sus comentarios.
jumpnett
1
@SuperMatt No sé si esta pregunta aún está activa, pero de todos modos quería saber qué hace |y qué hace &. Entiendo que ha proporcionado el funcionamiento de la función, pero quería saber qué hacen estos dos
Noober
1
@Noober si todavía te estás preguntando (como estoy en este agujero negro de documentación concisa y críptica que es Linux) ¡Lo sé! El | es una tubería que se coloca después de un comando para enviar la salida de esos comandos como la entrada al comando que sigue. & es una bifurcación, crea un nuevo subproceso para el comando anterior, dejando que el subproceso actual continúe ejecutando más comandos
flurbius
179

Esta es una llamada bomba de horquilla implementada en shell.

de wikipedia:

:(){ :|:& };:
\_/| |||| ||\- ... the function ':', initiating a chain-reaction: each ':' will start    two more.
 | | |||| |\- Definition ends now, to be able to run ...
 | | |||| \- End of function-block
 | | |||\- disown the functions (make them a background process), so that the children    of a parent
 | | |||   will not be killed when the parent gets auto-killed
 | | ||\- ... another copy of the ':'-function, which has to be loaded into memory.
 | | ||   So, ':|:' simply loads two copies of the function, whenever ':' is called
 | | |\- ... and pipe its output to ...
 | | \- Load a copy of the function ':' into memory ...
 | \- Begin of function-definition
 \- Define the function ':' without any parameters '()' as follows:
Michał Šrajer
fuente
3
Si bien es un punto tangencial y el término 'desconocer' puede estar sobrecargado, técnicamente, un proceso que se pone en segundo plano no se rechaza y siempre se puede poner en primer plano con el comando 'fg', y los procesos finalizarán si el usuario cierra sesión (si todavía hay recursos disponibles para realizar un cierre de sesión) ... a menos y hasta que uno ejecute 'renegado' en el proceso o jobid. Después de eso, se repudia: el cierre de sesión no terminará y fg no tiene ningún efecto.
Rondo
1
Aunque es solo un punto menor, los paréntesis no significan que no haya parámetros en los shells tipo bash, solo son decoraciones sobrantes de los lenguajes de estilo C.
Charlie Harding
75

Ese comando es una versión bien conocida de la bomba tenedor

foto de bomba tenedor de wikipedia

Hace que su computadora se quede sin memoria al bifurcar un proceso infinitamente. Existen algunas salvaguardas que también puedes usar contra él:

Los sistemas de tipo Unix suelen tener un límite de proceso, controlado por un comando de shell ulimit o su sucesor, setrlimit. Los núcleos de Linux establecen y aplican el límite RLIMIT_NPROC ("límite de recursos") de un proceso. Si un proceso intenta realizar una bifurcación y el usuario que posee ese proceso ya posee los RLIMIT_NPROCprocesos, entonces la bifurcación falla. Además, en Linux o * BSD, se puede editar el pam_limitsarchivo de configuración /etc/security/limits.confcon el mismo efecto. Sin embargo, no todas las distribuciones de Linux tienen el pam_limitsmódulo instalado de manera predeterminada.

Nemo
fuente
18

De acuerdo a esto :(){ :|: & };: se llama

Forkbomb es una especie de creador de virus poético

... El pequeño y tortuoso programa le ordena que haga varias copias de sí mismo, desencadenando una reacción en cadena y agotando rápidamente los recursos del sistema ...

Por lo tanto, se recomienda no ejecutar esto, podría causar daños en el hardware, ya que provoca la ejecución en bucle, puede causar calentamiento fácilmente en las computadoras portátiles.

Otro enlace explica a través de capturas de pantalla aquí .

atenz
fuente
59
Si una bomba tenedor causa daños en el hardware , entonces tienes un problema mucho más grande y profundo.
un CVn el
38
¿Tal vez estaba hablando de una bomba con forma de tenedor que puede explotar cerca de su PC?
dysoco el
2
El enlace para la captura de pantalla está roto.
IMustBeSomeone
0

Se llama una " bomba tenedor ", como se explicó anteriormente, y otra forma de hacerlo sería utilizar la ejecución en segundo plano en lugar de la tubería:

:(){ :&:;};:
karlsebal
fuente