Cosa significa questo comando criptico di Bash?


23

Stavo leggendo l'avvertimento del Forum di Ubuntu sui comandi dannosi e ho trovato questo gioiello interessante:

:(){ :|:& };:

AVVERTENZA: il codice sopra riportato si arresta in modo anomalo sul computer a meno che non siano in atto limiti di proc rigorosi (che probabilmente non è necessario) che richiedono un riavvio forzato.

Considera questo codice simile all'esecuzione sudo rm -rf /.

Ma cosa significa? Anche con la mia esperienza di programmazione non ho mai visto un comando criptico che non sia un linguaggio assembly.


16
Un ulteriore punto: questo non è in alcun modo simile a sudo rm -rf /. Quel comando cancella tutti i tuoi file; questo limita le risorse della tua macchina fino a quando diventa inutilizzabile e devi riavviare.
jtbandes,

@jtban: quindi modificalo. Entrambi i pezzi di codice sono ciò che considererei "pericoloso" da eseguire. Sì, sudo rm -rf /è più pericoloso, ma ho visto persone eseguirlo su server remoti "volevo solo vedere cosa ha fatto" in cui è difficile riavviare senza accedere a un pannello di controllo.
Josh K,

7
è un emotibomb: P
RCIX il

Nota che potrebbe essere arbitrary_name(){ arbitrary_name|arbitrary_name& };arbitrary_name. Il nome :non solo rende questo comando breve e criptico, ma trasforma anche un :builtin che non fa nulla in una funzione che fa molto . Se introduci la sua definizione :(){ :|:& }nell'ambiente di qualcun altro e lasci che rimanga lì, colpirà quando la vittima se lo aspetta di meno .
Kamil Maciorowski il

Risposte:


40

È, come hai detto, un forkbomb. Ciò che fa è definire una funzione, quindi chiamarla. La funzione è chiamata :.

Diamo il nome in forkbombmodo che possiamo vedere meglio cosa sta succedendo:

forkbomb(){ forkbomb|forkbomb& };forkbomb

Come puoi vedere, e probabilmente indovina dalla tua esperienza di programmazione, la prima parte è la definizione della funzione ( forkbomb(){ ... }), e l'ultimo :è dove viene chiamata la funzione (le ;istruzioni separate in Bash).

Ora, cosa fa questa funzione? Se hai familiarità con Bash, saprai che il |personaggio convoglia l'output standard di un comando / programma nell'input standard di un altro. Quindi, fondamentalmente, :|:avvia due istanze della funzione (è qui che "si biforca").

E poi la magia: il &mette quei comandi in background, permettendo alla funzione originale di tornare, mentre ogni istanza si biforca fino a quando le mucche tornano a casa in background, sfruttando così tutte le risorse e abbattendo il sistema (a meno che non abbia limiti imposto su di esso).


1
Bella risposta! Non avevo capito che potresti usare: come nome di una funzione. La ridenominazione aiuta. Accetterà tra 3 minuti.
TheLQ

1
+1 Cool ... Grande spiegazione. Questo è come uno stack overflow per un task switcher del sistema operativo. In realtà si arresta in modo anomalo nel kernel o consuma risorse fino a quando non diventa troppo insopportabile da usare?
Evan Plaice,

Non penso che si blocchi effettivamente il kernel, almeno non direttamente. Continua a creare in modo esponenziale più processi, ognuno dei quali occupa CPU e memoria, e con il processore che cerca di gestirli tutti diventa davvero impossibile da usare. È possibile che il kernel alla fine si blocchi in modo anomalo (non ne sono sicuro), ma sarà inutilizzabile prima di allora.
jtbandes,

3
Non dimenticare di spiegare il finale :, che in realtà esegue la funzione!
Phoshi,

@Phoshi: pensavo di sì, ma lo modificherò per chiarire!
jtbandes

9

Tratto dall'articolo di Wikipedia Forkbomb :

:()      # define ':' -- whenever we say ':', do this:
{        # beginning of what to do when we say ':'
    :    # load another copy of the ':' function into memory...
    |    # ...and pipe its output to...
    :    # ...another copy of ':' function, which has to be loaded into memory
         # (therefore, ':|:' simply gets two copies of ':' loaded whenever ':' is called)
    &    # disown the functions -- if the first ':' is killed,
         #     all of the functions that it has started should NOT be auto-killed
}        # end of what to do when we say ':'
;        # Having defined ':', we should now...
:        # ...call ':', initiating a chain-reaction: each ':' will start two more.

7

Suddiviso:

: () // Define ':' as a function. When you type ':' do the following
{
    : // Call ':' 
    | // Redirect output
    : // Into ':'
    & // Push process to the background
}; // End of ':' def
: // Now do ':'

Passa :a bombe hai:

bomb(){ bomb|bomb& };bomb

È davvero abbastanza elegante.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.