GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo funciona una bomba de horquilla?

  • ADVERTENCIA NO INTENTE EJECUTAR ESTO EN UNA MÁQUINA DE PRODUCCIÓN

Al leer la página de Wikipedia sobre el tema, generalmente sigo lo que sucede con el siguiente código:

:(){ :|:& };:

extracto de la descripción

La siguiente bomba de horquilla se presentó como arte en 2002;56
se desconoce su origen exacto, pero existía en Usenet antes de 2002.
La bomba se ejecuta pegando los siguientes 13 caracteres en una
shell UNIX como bash o zsh. Opera definiendo
una función llamada ':', que se llama a sí misma dos veces, una en el
primer plano y otra en el fondo.

Sin embargo, lo último no me queda del todo claro. Veo la definición de la función:

:(){ ... }

Pero, ¿qué más está pasando? También haga otros shells como ksh , csh y tcsh también correría la misma suerte de poder construir algo similar?

Respuesta aceptada:

Esta bomba de bifurcación siempre me recuerda algo que dijo un profesor de programación de IA en una de las primeras lecciones a las que asistí "Para entender la recursividad, primero debes entender la recursividad".

En esencia, esta bomba es una función recursiva. En esencia, creas una función, que se llama a sí misma, que se llama a sí misma, que se llama a sí misma... hasta que se consuman los recursos del sistema. En este caso específico, la recurrencia se amplifica mediante el uso de canalización de la función a sí misma Y ponerla en segundo plano.

He visto esto respondido en StackOverflow, y creo que el ejemplo dado allí lo ilustra mejor, solo porque es más fácil ver lo que hace de un vistazo (robado del enlace de arriba...)

☃(){ ☃|☃& };☃

Definir la función de error ☃() { ... } , cuyo cuerpo se llama a sí mismo (la función de error), canalizando la salida a sí mismo (la función de error) ☃|☃ y en segundo plano el resultado & . Luego, después de definir la función, llame a la función de error, ; ☃ .

Observo que, al menos en mi Arch VM, la necesidad de poner en segundo plano el proceso no es un requisito para tener el mismo resultado final, para consumir todo el espacio de proceso disponible y hacer que el host funcione. En realidad, ahora he dicho que a veces parece terminar el proceso de ejecución y después de una pantalla llena de -bash: fork: Resource temporarily unavailable se detendrá con un Terminated (y journalctl muestra bash core volcado).

Relacionado:¿Cómo hacer que vim funcione correctamente con tmux?

Para responder a su pregunta sobre csh/tcsh, ninguno de esos shells admite funciones, solo puede alias. Entonces, para esos shells, tendría que escribir un script de shell que se llame a sí mismo de forma recursiva.

zsh parece sufrir el mismo destino (con el mismo código), no realiza un volcado del núcleo y hace que Arch proporcione Out of memory: Kill process 216 (zsh) score 0 or sacrifice child. , pero aún continúa bifurcándose. Después de un tiempo, dice Killed process 162 (systemd-logind) ... (y aún sigue teniendo un zsh bifurcado).

Arch no parece tener un pacman versión de ksh, así que tuve que probarlo en Debian. ksh objetos a : como nombre de función, pero usando algo, digamos b() en cambio, parece tener el resultado deseado.


Linux
  1. ¿Qué es NGINX? ¿Como funciona?

  2. ¿Cómo funciona Awk '!a[$0]++'?

  3. ¿Cómo funciona la punta adhesiva?

  4. Ssh:¿cómo funciona TCP-keepalive en Ssh?

  5. ¿Qué es el DNS y cómo funciona?

¿Cómo funciona Git?

¿Cómo funciona SFTP?

Ssh:¿cómo funciona el túnel Ssh inverso?

Linux:¿cómo funciona la pantalla de Linux?

¿Cómo funciona el intercambio de memoria en Linux?

¿Cómo funciona la pantalla de Linux?