Perché il comando ": () {: |: &} ;:" ha rallentato il mio sistema? Ho dovuto riavviare?

271
  

PERICOLO !

     

Non eseguire questo comando per 'testarlo' a meno che non si sia pronti per un arresto anomalo e / o forzato il riavvio del sistema.

Ero nella mia Virtualbox che eseguiva il 12.04 cercando di compilare un'app, e mentre aspettavo mi capitò di imbattermi in un forum in cui un commento diceva:

  

Prova :(){ :|: & };:
  Anche divertente, e non ha bisogno di root.

Senza pensarci, l'ho eseguito nel mio terminale gnome. Ho fatto in modo che il mio 12.04 (in Virtualbox) fosse così lento che ho dovuto spegnerlo.

La mia domanda è: cosa fa questo comando?

:(){ :|: & };:
    
posta blade19899 04.07.2012 - 13:29
fonte

4 risposte

343

Questa è chiamata bomba a forcella .

:() significa che stai definendo una funzione chiamata :

{:|: &} significa eseguire la funzione : e inviare nuovamente il suo output alla funzione : ed eseguirlo in background.

Il ; è un separatore di comandi, come && .

: esegue la funzione la prima volta.

Essenzialmente stai creando una funzione che chiama se stessa due volte ogni chiamata e non ha modo di terminare se stessa. Continuerà a raddoppiare fino a esaurire le risorse di sistema.

L'esecuzione in Virtualbox era abbastanza ragionevole, altrimenti avresti dovuto riavviare il PC.

    
risposta data SuperMatt 04.07.2012 - 13:34
fonte
158

Questa è una cosiddetta bomba a forcella implementata in shell.

da 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:
    
risposta data Michał Šrajer 04.07.2012 - 13:35
fonte
70

Quel comando è una versione ben nota della bomba a forcella

Fa sì che il computer esaurisca la memoria eseguendo un processo infinitamente. Esistono alcune salvaguardie che puoi usare anche contro di esso:

  

I sistemi di tipo Unix hanno tipicamente un limite di processo, controllato da un comando shell ulimit o dal suo successore, setrlimit. I kernel di Linux impostano e impongono RLIMIT_NPROC rlimit ("limite di risorse") di un processo. Se un processo tenta di eseguire un fork e l'utente che possiede quel processo possiede già RLIMIT_NPROC processi, la fork fallisce. Inoltre, su Linux o * BSD, è possibile modificare il pam_limits file di configurazione /etc/security/limits.conf con lo stesso effetto. Tuttavia, non tutte le distribuzioni di Linux hanno il modulo pam_limits installato per impostazione predefinita.

    
risposta data Nemo 04.07.2012 - 13:37
fonte
18

Secondo questo :(){ :|: & };: è chiamato

  

Forkbomb è una specie di creatore di virus poetici

     

... Il piccolo programma subdolo gli comanda di eseguire più copie di   stesso, scatenando una reazione a catena e quindi esaurendo rapidamente il   risorse del sistema ...

Pertanto, si consiglia di non eseguire questa operazione, potrebbe causare danni all'hardware dal momento che provoca l'esecuzione in loop, potrebbe causare un riscaldamento semplice nei laptop.

Un altro link spiega attraverso schermate qui .

    
risposta data atenz 04.07.2012 - 13:35
fonte

Leggi altre domande sui tag