Perché il comando “: () {: |: &} ;:” ha causato un ritardo del sistema così grave che ho dovuto riavviare?


286

PERICOLO!

Non eseguire questo comando per "testarlo" a meno che non si sia preparati a un arresto anomalo e / o al riavvio forzato del sistema.

Ero nella mia Virtualbox in esecuzione 12.04 cercando di compilare un'app e, mentre aspettavo, mi è capitato di imbattermi in un forum in cui un commento diceva:

Prova anche :(){ :|: & };:
Fun e non ha bisogno di root.

Senza pensarci, l'ho fatto funzionare nel mio terminale gnomo. Ha reso il mio ritardo 12.04 (in Virtualbox) così gravemente che ho dovuto spegnerlo.

La mia domanda è: cosa fa questo comando?

: () {: |: &} ;:



1
Vedi anche una vecchia discussione: ubuntuforums.org/showthread.php?t=1392511
Paddy Landau,



9
"ritardo così gravemente" è piuttosto ottimista.
pstadler,

Risposte:


372

Questo si chiama bomba a forcella .

:() significa che stai definendo una funzione chiamata :

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

La ;è un separatore di comandi.

: esegue la funzione la prima volta.

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

L'esecuzione in Virtualbox è stata piuttosto sensata, altrimenti sarebbe stato necessario riavviare il PC.


27
Questa risposta sembra suggerire che il riavvio è l' unica risorsa. Ma in realtà questa bomba a forchetta può essere uccisa senza riavviare, e in realtà ho notato che non funziona comunque correttamente su alcuni sistemi (perché il loro limite di spawn è impostato in modo ragionevole).
Konrad Rudolph,

27
In realtà, per una spiegazione completa questo dovrebbe probabilmente menzionare che ;è un separatore di comandi. La { ... }parte è semplicemente il contenuto della funzione.
un CVn

@ MichaelKjörling +1 Non ho nemmeno capito la sintassi finché non ho preso in considerazione i tuoi commenti.
jumpnett,

1
@SuperMatt Non so se questa domanda è ancora attiva, ma comunque volevo sapere cosa fa |e cosa fa &. Capisco che hai fornito il funzionamento della funzione, ma volevo sapere cosa fanno questi due
Noober,

1
@Noober se ti stai ancora chiedendo (come sono in questo buco nero di documentazione concisa e criptica che è Linux) lo so! | è una pipe che viene inserita dopo un comando per inviare l'output dei comandi come input al comando che segue. ed è un fork crea un nuovo thread per il comando precedente lasciando il thread corrente per continuare ad eseguire altri comandi
flurbius

179

Questa è una cosiddetta bomba a forcella implementata nella 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:

3
Sebbene sia un punto tangenziale e il termine 'disconoscimento' potrebbe essere sovraccarico, tecnicamente, un processo messo in background non è rinnegato e può sempre essere portato in primo piano con il comando 'fg', e il processo terminerà se l'utente si disconnette (se ci sono ancora risorse disponibili per eseguire un logout) .... a meno che e fino a quando non si esegue 'disown' sul processo o jobid. Dopodiché viene davvero rinnegato: il logout non termina e fg non ha alcun effetto.
Rondo,

1
Sebbene sia solo un punto minore, le parentesi non significano che non ci sono parametri nelle shell simili a bash, ma sono solo decorazioni rimaste dai linguaggi in stile C.
Charlie Harding,

75

Quel comando è una versione ben nota della bomba a forcella

foto della bomba a forcella da Wikipedia

Fa sì che il tuo computer esaurisca la memoria eseguendo un processo all'infinito. Esistono alcune garanzie che puoi usare anche contro di esso:

I sistemi di tipo Unix in genere hanno un limite di processo, controllato da un comando shell ulimit o dal suo successore, setrlimit. I kernel Linux impostano e applicano il limite RLIMIT_NPROC ("limite delle risorse") di un processo. Se un processo tenta di eseguire un fork e l'utente proprietario di tale processo possiede già i RLIMIT_NPROCprocessi, il fork ha esito negativo. Inoltre, su Linux o * BSD, è possibile modificare il pam_limitsfile di configurazione /etc/security/limits.confcon lo stesso effetto. Tuttavia, non tutte le distribuzioni di Linux hanno il pam_limitsmodulo installato per impostazione predefinita.


18

Secondo questo :(){ :|: & };: si chiama

Forkbomb è una specie di creatore di virus poetici

... Il subdolo programma gli ordina di fare più copie di se stesso, innescando una reazione a catena e quindi esaurendo rapidamente le risorse del sistema ...

Pertanto, si consiglia di non eseguire questo, potrebbe causare danni all'hardware poiché causa l'esecuzione ad anello, può causare facilmente il riscaldamento nei laptop.

Un altro link spiega attraverso schermate qui .


59
Se una bomba a forcella provoca danni all'hardware , allora hai un problema molto più grande e più profondo.
un CVn

38
Forse stava parlando di una bomba a forma di forcella che può esplodere vicino al tuo PC?
dysoco,

2
Il collegamento per lo screenshot è interrotto.
IMustBeSomeone

0

Si chiama " fork-bomb ", come spiegato sopra, e un altro modo per farlo sarebbe usare l'esecuzione in background piuttosto che le tubazioni:

:(){ :&:;};:
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.