- 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 tenedor se presentó como arte en 2002;5 56 su origen exacto es desconocido, pero existía en Usenet antes de 2002. La bomba se ejecuta pegando los siguientes 13 caracteres en un shell de UNIX como bash o zsh . Funciona definiendo una función llamada ':', que se llama a sí misma dos veces, una en primer plano y otra en segundo plano.
Sin embargo, la última parte no está del todo clara para mí. Veo la definición de la función:
:(){ ... }
¿Pero qué más está pasando? ¿También otros proyectiles como ksh
, csh
y tcsh
también sufren el mismo destino de poder construir algo similar?
bash
shell-script
zsh
fork
slm
fuente
fuente
Respuestas:
Esta bomba tenedor siempre me recuerda lo que dijo un profesor de programación de IA en una de las primeras lecciones a las que asistí "Para comprender la recursividad, primero debes comprender la recursividad".
En esencia, esta bomba es una función recursiva . En esencia, crea 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 recursión se amplifica mediante el uso de canalizar la función hacia sí misma Y trasladarla 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 ...)
Defina 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 trasfondo del resultado&
. Entonces, después de definir la función, en realidad llamar a la función 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 se bloquee. En realidad, ahora he dicho que a veces parece terminar el proceso de fuga y después de una pantalla completa
-bash: fork: Resource temporarily unavailable
se detendrá con unTerminated
(yjournalctl
muestra bash core dump).Para responder a su pregunta sobre csh / tcsh, ninguno de esos shells admite funciones, solo puede usar 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 volca el núcleo y hace que Arch ceda
Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.
, pero aún continúa bifurcando. Después de un tiempo, luego declaraKilled process 162 (systemd-logind) ...
(y aún continúa teniendo una bifurcación zsh).Arch no parece tener una
pacman
versión de ksh, así que tuve que probarlo en Debian. ksh se opone a:
como un nombre de función, pero usando algo, digamos, enb()
cambio, parece tener el resultado deseado.fuente
Ctrl+Shift+u+<hex>
dónde hexadecimal es el código hexadecimal del carácter unicode que desea mostrar. Puede encontrar una lista de Unicode visible en: fileformat.info/info/unicode/utf8test.htm (la mayoría de los impares se encuentran en las secciones "misceláneas"). Windows debería pagar superuser.com/questions/47420/… , y yo personalmente uso la herramienta mencionada en el enlaceunicodeinput.exe
o cortar y pegar a través de mi navegador. Siempre puede usar secuencias html como lo sugiere sambler.