2009-06-13 12 views
113

Secondo Wikipedia, il seguente è un molto elegante bomba bash forcella:Come funziona questa bomba a forcella bash?

:(){ :|:& };: 

Come funziona?

+50

:() {: |: & };: non significa che UNIX è oscuro. Solo perché ti permette di scrivere cose oscure non significa che sia oscuro se usato correttamente. Potrei scrivere alcune frasi maledette in inglese, ma posso scrivere anche alcune semplici da capire. – c4757p

+9

@ c4757p caso in questione: "Bufalo bufalo Bufalo bufalo bufalo Bufalo bufalo" è una frase grammaticalmente corretta in inglese americano (http://en.wikipedia.org/wiki/Buffalo_buffalo_Buffalo_buffalo_buffalo_buffalo_Buffalo_buffalo) – tomfumb

+0

C'è una buona spiegazione qui di come la forcella bomba funziona: [http://www.cyberciti.biz/faq/understanding-bash-fork-bomb/](http://www.cyberciti.biz/faq/understanding-bash-fork-bomb/) Sfortunatamente, è disseminato di faccine, lo ho caricato qui in testo semplice anche: [http://pbin.oogly.co.uk/listings/viewlistingdetail/7e9399079ac13111492326d01ed16d](http://pbin.oogly.co.uk/listings/ viewlistingdetail/7e9399079ac13111492326d01ed16d) Divertiti, è una buona lettura. – Jon

risposta

157

rottura verso il basso, ci sono tre grandi pezzi:

:()  # Defines a function, ":". It takes no arguments. 
{ ... }; # The body of the function. 
:  # Invoke the function ":" that was just defined. 

All'interno del corpo, la funzione viene richiamata due volte e la conduttura è in background; ogni successiva chiamata ai processi genera ancora più chiamate a ":". Ciò porta rapidamente a un consumo esplosivo nelle risorse di sistema, bloccando le cose.

Nota che invocarlo una volta, ricorsivamente all'infinito, non sarebbe abbastanza buono, dal momento che ciò comporterebbe solo un overflow dello stack sul processo originale, che è disordinato ma può essere affrontato.

Una versione più human-friendly si presenta così:

kablammo() {    # Declaration 
    kablammo | kablammo& # The problematic body. 
}; kablammo    # End function definition; invoke function. 

Edit: Commento di William sotto era una migliore formulazione di ciò che ho detto sopra, così ho modificato per incorporare quel suggerimento.

+9

... e, kablammo! –

+2

Assicurati di stare lontano dallo scoppio quando il tuo sistema va in fumo! –

+8

Nit minore: "la funzione è invocata due volte e un'istanza è in background" non è proprio corretta. La funzione viene invocata due volte in una pipeline e la pipe è in background, quindi entrambe le istanze vengono eseguite in background. Anche se questo è un dettaglio semantico come nella realtà è probabile che solo uno sia mai tentato, e la sua ricorsione ferma il sistema prima che l'altro abbia inizio. –

9

Risposta breve:

I due punti (":") diventa una funzione, quindi si esegue la funzione convogliato alla funzione e la messa in backgroun che significa che per ogni chiamata della funzione di 2 copie del la funzione è invocata. La ricorsione prende piede.