GNU/Linux >> Linux Esercitazione >  >> Linux

Come funziona una bomba a forcella?

  • AVVERTENZA NON TENTARE DI ESEGUIRE QUESTO SU UNA MACCHINA DI PRODUZIONE

Nella lettura della pagina di Wikipedia sull'argomento seguo generalmente quello che sta succedendo con il seguente codice:

:(){ :|:& };:

estratto della descrizione

La seguente bomba fork è stata presentata come arte nel 2002;56
la sua origine esatta è sconosciuta, ma esisteva su Usenet prima del 2002.
La bomba viene eseguita incollando i seguenti 13 caratteri in un
shell UNIX come bash o zsh. Opera definendo
una funzione chiamata ‘:’, che si richiama due volte, una in
in primo piano e una in background.

Tuttavia l'ultimo pezzo non mi è del tutto chiaro. Vedo la definizione della funzione:

:(){ ... }

Ma cos'altro sta succedendo? Esegui anche altre shell come ksh , csh e tcsh subire anche la stessa sorte di riuscire a costruire qualcosa di simile?

Risposta accettata:

Questa bomba a forcella mi ricorda sempre qualcosa che un insegnante di programmazione AI ha detto in una delle prime lezioni che ho frequentato "Per capire la ricorsione, prima devi capire la ricorsione".

Al suo interno, questa bomba è una funzione ricorsiva. In sostanza, crei una funzione, che chiama se stessa, che chiama se stessa, che chiama se stessa…. fino al consumo delle risorse di sistema. In questo caso specifico, la ricorsione è amplificata dall'uso del piping della funzione su se stessa E del background.

Ho visto questa risposta su StackOverflow e penso che l'esempio fornito lo illustri meglio, solo perché è più facile vedere cosa fa a colpo d'occhio (rubato dal link sopra...)

☃(){ ☃|☃& };☃

Definisci la funzione bug ☃() { ... } , il cui corpo chiama se stesso (la funzione bug), reindirizzando l'output a se stesso (la funzione bug) ☃|☃ e sullo sfondo il risultato & . Quindi, dopo che la funzione è stata definita, chiama effettivamente la funzione bug, ; ☃ .

Prendo atto che almeno sulla mia Arch VM, la necessità di eseguire il background del processo non è un requisito per avere lo stesso risultato finale, per consumare tutto lo spazio di processo disponibile e rendere l'host bloccato. In realtà ora ho detto che a volte sembra terminare il processo di fuga e dopo una schermata di -bash: fork: Resource temporarily unavailable si fermerà con un Terminated (e journalctl mostra bash core dumping).

Correlati:come far funzionare correttamente vim con tmux?

Per rispondere alla tua domanda su csh/tcsh, nessuna di queste shell supporta funzioni, puoi solo alias. Quindi per quelle shell dovresti scrivere uno script di shell che si chiama ricorsivamente.

zsh sembra subire la stessa sorte (con lo stesso codice), non esegue il core dump e fa sì che Arch fornisca Out of memory: Kill process 216 (zsh) score 0 or sacrifice child. , ma continua ancora a biforcare. Dopo un po' viene visualizzato Killed process 162 (systemd-logind) ... (e continua ancora ad avere un fork zsh).

Arch non sembra avere un pacman versione di ksh, quindi ho dovuto provarlo invece su debian. ksh oggetti a : come nome di una funzione, ma usando qualcosa – diciamo b() invece sembra avere il risultato sperato.


Linux
  1. Cos'è NGINX? Come funziona?

  2. Che cos'è un server Web e come funziona un server Web?

  3. Ssh – Come funziona Tcp-keepalive in Ssh?

  4. Come funziona rm? Cosa fa rm?

  5. Come funziona effettivamente sig_atomic_t?

Come funziona Git?

Come funziona SFTP?

Ssh:come funziona il tunneling Ssh inverso?

Linux:come funziona il display di Linux?

Come funziona la memoria di scambio in Linux?

Come funziona il display di Linux?