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


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 in esecuzione 12.04 cercando di compilare un'app e, mentre aspettavo, mi è capitato di imbattermi in un forum in cui un commento diceva:

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

:(){ :|: & };:

272
2017-07-04 11:29


origine


relazionato Come proteggere Ubuntu dalla bomba a forcella - Sathya
Vedi anche un thread precedente: ubuntuforums.org/showthread.php?t=1392511 - Paddy Landau
Relazionato: Come funziona una bomba a forcella? e Dov'è la forchetta () sul fork bomb: () {: |: &};:? - terdon♦
possibile duplicato cross site di: stackoverflow.com/questions/515844/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
"lag male" è piuttosto ottimista. - pstadler


risposte:


Questo è chiamato a bomba a forcella.

:() significa che stai definendo una funzione chiamata :

{:|: &} significa eseguire la funzione : e inviare la sua uscita al : funzione di nuovo ed esegui quello in background.

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

: esegue la funzione la prima volta.

Essenzialmente si sta 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 del sistema.

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


345
2017-07-04 11:34



Questa risposta sembra suggerire che il riavvio è il solo ricorso. Ma in realtà questa bomba a forcella può essere uccisa senza riavvio, e in realtà ho osservato che non funziona correttamente su alcuni sistemi (perché il loro limite di spawn è impostato in modo ragionevole). - Konrad Rudolph
In realtà, per una spiegazione completa questo dovrebbe probabilmente dirlo ; è un separatore di comandi. Il { ... } parte è semplicemente il contenuto della funzione. - Michael Kjörling
@ MichaelKjling +1 Non ho nemmeno capito la sintassi finché non ho preso in considerazione i tuoi commenti. - jumpnett
@ SuperMatt Non so se questa domanda è ancora attiva, ma in ogni caso volevo sapere cosa fa | e & fare. Capisco che tu abbia fornito il funzionamento della funzione ma volevo sapere cosa fanno questi due - Noober
@Noober se ti stai ancora chiedendo (come sono io in questo buco nero di documentazione tersa e criptica che è linux) lo so! | è una pipe che viene inserita dopo un comando per inviare i comandi in uscita come input al comando che segue. & è una fork crea un nuovo thread per il comando precedente lasciando il thread corrente per continuare ad eseguire più comandi - flurbius


Questo è un cosiddetto bomba a forcella implementato 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:

161
2017-07-04 11:35



Anche se è un punto tangenziale e il termine 'disown' può essere sovraccaricato, tecnicamente, un processo messo in background non è rinnegato e può sempre essere portato in primo piano con il comando 'fg', e il processo (i) terminerà se l'utente si disconnette (se ci sono ancora risorse disponibili per completare un logout) .... salvo che e fino a quando uno esegue 'disown' sul processo o sul jobid. Dopodiché è davvero rinnegato: il logout non termina e fg non ha alcun effetto. - Rondo
Sebbene sia solo un punto minore, le parentesi non significano che non ci sono parametri nelle shell di tipo bash, sono solo delle decorazioni lasciate da linguaggi in stile C. - Charlie Harding


Quel comando è una versione ben nota del bomba a forcella

fork bomb pic from wikipedia

Provoca l'esaurimento della memoria del computer eseguendo un processo infinito. 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 lo possiede già RLIMIT_NPROC processi, quindi la forcella fallisce. Inoltre, su Linux o * BSD, è possibile modificare il file pam_limits file di configurazione /etc/security/limits.conf allo stesso effetto. Tuttavia, non tutte le distribuzioni di Linux hanno il pam_limits modulo installato di default.


70
2017-07-04 11:37





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 poiché provoca l'esecuzione in loop, potrebbe causare un riscaldamento semplice nei laptop.

Un altro link spiega attraverso schermate Qui.


18
2017-07-04 11:35



Se causa una bomba a forcella danno hardware, quindi hai un problema molto più grande e più profondo. - Michael Kjörling
Forse stava parlando di una bomba a forma di forcella che può esplodere vicino al tuo PC? - dysoco
Il link per lo screenshot è rotto. - IMustBeSomeone