Función recursiva :(){ :|:& };:

Imagen de Danielito
0 puntos

Escribo para preguntar por este comando

 :(){ :|:& };:

Resulat que lo encontré en un script que me botaba el sistema, es un scrip simple que cambia un archivo de mp3 a ogg resulta que me puse a probar las lineas y la unica que no se que es lo que hace es esa, cuando la ejecuto por consola el sistema se pega y no responde!! Que sera???

Imagen de mz
+1
0
-1

es una funcion recursiva que come todos los recursos del pc hasta dejarlo practicamente inoperable.

 hay manuales para limitar los recursos por usuario y q esas funciones recursivas no afecten. 

+1
0
-1
Imagen de Beltenebros
+1
0
-1

Aquí te dejo algo que te lo explicará con humor...

http://sugus.eii.us.es/~danigm/tira/alien.png

En resumen es un bucle infinito que consume todos los recursos del sistema hasta que éste "explota"

 

Pero no me preguntes cómo o por qué... porque no tengo ni idea de cómo esos pocos caracteres pueden hacer eso... 

+1
0
-1
Imagen de kavra
+1
0
-1

Por favor leed las normas y poned títulos descriptivos, no he tirado el hilo a la papelera de milagro.

Saludos

Titulo editado: ":(){:|:& };:

______________________
Miembro del equipo de moderadores

Normas del foro

La Documentación

 

+1
0
-1

____________________
Anarquía != Desorden

Imagen de iacaca
+1
0
-1

Joder pues es verdad! Se me ha cargao el sistema de golpe

+1
0
-1

Que é un porco vestido co traxe de supermán?
Resposta --> Porcomán!!!

Imagen de sergiosan00709
+1
0
-1

 si se ejecuta eso y despues se reiniciel sistema, la maquina funciona normal??

 

 

Siempre hay opciones de poder hacer lo que uno desee hacer. Siempre y cuando uno desee hacerla.

user 54440

+1
0
-1


Viewsonic 22", 8Gb de Ram Kingston, AMD Phenom X4, 2 multiquemadoras LG, 2 Nvidia Gforce 9600GT en SLI, 2 HDD de 250GB c/u,Mainboard Gigabyte GA-M57SLI-S4, Case COSMOS de Cooler Master.

Imagen de gotxa
+1
0
-1

... tras reinicio el sistema está como nuevo, siempre y cuando eso no se ejecute en las rutinas de inicio, claro.

GoTXa
linux counter #116453

+1
0
-1

GoTXa
linux counter #116453
Klaatu barada nikto

Imagen de Danielito
+1
0
-1

Claro que te jode el sistema, yo no dije que la prueben jajajaja a todo esto, tengo mucho que hablar con el pseudo amigo que me mangó el script!!!

No creo que limite la cantidad de procesos por usuarios, si me serviría si soy un administrador de servidor o algo por el estilo, la proxima vez que véa esta linea estaré advertido. 

 

.....................................

+1
0
-1
Imagen de GameZelda
+1
0
-1

La verdad me parece un poco sospechoso que sepas que es una funcion recursiva y no sepas nada de ella y tal, pero te lo voy a explicar.

 

Es una funcion que se llama a ella misma dos veces, ocupando toda la memoria con sus procesos.

 

La forma de pararla es limitando los procesos 

+1
0
-1
Imagen de kavra
+1
0
-1

Aquí se estudia superficialmente, a quien pueda interesar...

http://www.kriptopolis.org/bombas-y-bombos 

______________________
Miembro del equipo de moderadores

Normas del foro

La Documentación

 

+1
0
-1

____________________
Anarquía != Desorden

Imagen de Danielito
+1
0
-1

Me encontré este otro

yes > yes

Resulta que este comando hace es algo así,

yes por si solo muestra por consola muchas "y" y mustras "y" hasta que lo paras, pero al agregar "> yes", haces que la salida por consola se guarde en una archivo de texto llamado yes en el direcctorio en que te encuentreas, con dos segundo corriendo me creó un archivo de 400mb. Así que ojo que te puede llenar el disco sin que te des cuenta.

 

.....................................

+1
0
-1
Imagen de Danielito
+1
0
-1

 La explicacion dice algo así

 

Crea una función llamada ":" esta no acepta el no tener argumento que son los codigos dentro de las llaves ":(){ ...} ". El código en las llamadas de función llama recurrentemente la función e instala salidas a otra invocación de la función que es esta parte ":|:". "&" pone la llamada en segundo plano, de esa manera  es que el proceso hijo no muere si el padre sale o se mata. Observese que invocando la función dos veces, usted consigue crecimiento exponencial en el número de los procesos (repugnante!).Esto ";" después del bucle acaba la definición de la función y el último ":" es la primera invocación de la función que fija la bomba.

 

Acepto comentarios con respecto a mi interpretacion. 

+1
0
-1
Imagen de Sergio Albert
+1
0
-1

: (){ :|:& };:

Esta orden en linea de comandos se descompone de la siguiente forma:

  1. : (){ :|:& }
  2. ;
  3. :

Vamos por partes:

  1. Definición de la funcion de shell :
    1. Asignación de nombre a la funcion : () Los parentesis le indican al S.O.que se trata de una función que será invocada más tarde...
    2. Cuerpo de la función, todo lo que esta entre las llaves { }
      :|:&
      1. Llamada a un comando : y que acabamos de definir al vuelo como una función, es decir llamada a si misma
      2. redirección de la salida de la función mediante un pipe | a un nuevo comando : es decir un nuevo proceso en memoria que vuelve a ejecutar el cuerpo de la función, aunque no redirijamos nada.
      3. & hace que el cuerpo de la función se ejecute en segundo plano (backgroud), de forma que el S.O. no espera a que la función termine para aceptar nuevos procesos dentro de la sesión de shell.
  2. ; Permite especificar un nuevo comando a ejecutar dentro de una sola linea de comandos, es decir, que después de definir la función : le pedimos al S.O. que ejecute otro comando...
  3. : LLamamos a la puñetera función se auto llamará indefinidamente (recursivamente).

Un saludo

+1
0
-1
Imagen de Festor
+1
0
-1

 Bueno, depues de leerme todo el post... :-/ ¿alguien sabe como limitar el numero de procesos por usuario?

****-------------------****

The Life of Nadock Blog

****-------------------****

+1
0
-1
Imagen de furtaxi
+1
0
-1

 sudo gedit /etc/security/limits.conf

Añades éstas dos líneas:

* nproc hard 512

* nproc soft 512

Pero no estoy seguro, no sé qué pintan los asteriscos iniciales de cada una. Si alguien más experto puede confirmarlo, mejor. Lo del valor, 512, parece ser que depende de la ram disponible, como tengo 1 Gb, me parecen suficientes procesos, después de ver los activos con top en una consola. Quizás convenga subirlos, también pido opinión al respecto.

 

Saludos,

Roberto.

Mi página: www.vigonews.es

Lee y cumple las Normas. Busca antes de preguntar. Sé amable, tolerante y comprensivo. Disfruta. Sonríe. Ubuntu es más que un S.O.

+1
0
-1

Mi web : www.vigovideo.es
Buscar es más rápido que esperar una respuesta.

Imagen de zirconio
+1
0
-1

Hola furtaxi,

                   un placer. El asterisco que aparece delante se refiere a una variable especial del shell que significa que guarda la cadena de argumentos entera, excluyendo el nombre del programa.

En cuanto a la manera de saber cuantos procesos tiene asignado nuestro sistema basta con hacer: ulimit -u    y mostrará la asignación.

                   Pero no sé por qué tanta preocupación por esto. Existe un número grande de funciones recursivas y son inherentes a la programación. Es la debilidad de la máquina frente al hombre. El origen: las matemáticas

Sólo que la máquina está  "desnuda"  frente a esta posibilidad, es decir, no puede predecir su propia muerte, eso lo determina el hombre, afortunadamente.

                 Es lo mismo que pasa con las partidas de ajedrez, la máquina debe de comprobar todos los procesos incluidos los obvios para nosotros, como por ejemplo mover un peón hacia atrás, lo cual había hecho hasta ahora que fuera posible ganar a la máquina, ya que la desventaja se centraba en la cantidad de memoria disponible para ejecutar el juego. Ahora esto ya no es posible.

                 Pero las funciones recursivas no son sólo patrimonio de la programación del shell. Pueden hacerse en cualquier lenguaje. Si tienes interés puedo pasarte algunos scripts en C y en Python.

En contestación a algo que preguntaban mas arriba, estas funciones no corrompen el sistema, por lo menos las escritas en un shell . Pueden ser una molestia, con fácil solución pero dudo mucho que alguien escriba alguna por error. 

              Saludos

Z.
 

 

 

Linux User Reg. #441216

Machine Reg #348016

+1
0
-1

Linux User Reg. #441216

Machine Reg     #348016

Imagen de Festor
+1
0
-1

 Bueno gracias por las respuestas, pero acabo de encontrar un articulo que parece muy completo:

http://www.vicente-navarro.com/blog/index.php/2007/05/04/fork-bombs-ulimit-y-limitsconf 

****-------------------****

The Life of Nadock Blog

****-------------------****

+1
0
-1
Imagen de furtaxi
+1
0
-1

No hace falta que pongas más ejemplos, con un simple:

10 goto 20

20 goto 10

Se queda ahí indefinidamente, pero que si le añadimos

15 print "A";

Nos llenará la pantalla de AAAAAAAAAAAAAAA....

Sólo hace falta cambiar print A" por algo más molesto, y ya tenemos problemas más serios, como una instrucción que escriba cosas en el HDD, te lo llenaría en poco tiempo... 

Pero lo que puse, no funciona, acabo de escibir ulimit -u, y me ha dado unlimited... Y eso que reinicié el ordenador. Habrá que investigarlo, aunque sólo sea por curiosidad.

 

Saludos,

Roberto.

Mi página: www.vigonews.es

Lee y cumple las Normas. Busca antes de preguntar. Sé amable, tolerante y comprensivo. Disfruta. Sonríe. Ubuntu es más que un S.O.

+1
0
-1

Mi web : www.vigovideo.es
Buscar es más rápido que esperar una respuesta.

Imagen de Festor
+1
0
-1

 Lo que introduzcas en el comando solo funciona hasta que reinicies el ordenador, una vez hecho se restaura el valor original, es decir, ilimitado

****-------------------****

The Life of Nadock Blog

****-------------------****

+1
0
-1
Imagen de slap
+1
0
-1

Lo que se debe poner en /etc/security/limits.conf es:

* hard nproc 512

o el número que quieras.

El soft no es necesario.

Cuando reinicies podrás comprobar con ulimit -u el límite impuesto.

En cuanto al número de procesos a limitar depende del uso que le des al ordenador, es decir, del número de procesos simultáneos de usuario que necesitas que se ejecuten. Se trata de probar. Yo lo tengo en 1000.

Saludos.
slap

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de MarianoC
+1
0
-1

$ sudo ulimit -u 512

y con $ sudo ulimit -a
ves si funciono.

Es raro que ubuntu no tenga un numero razonable como predeterminado. Si bien depende mucho de cada maquina (algunas con 512 se cuelgan y otras con 1000 siguen funcionando) seria bueno poner algun numero por defecto.

Saludos!!

+1
0
-1