GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie funktioniert eine Gabelbombe?

  • WARNUNG VERSUCHEN SIE NICHT, DIES AUF EINER PRODUKTIONSMASCHINE AUSZUFÜHREN

Beim Lesen der Wikipedia-Seite zu diesem Thema verfolge ich im Allgemeinen, was mit dem folgenden Code passiert:

:(){ :|:& };:

Auszug aus Beschreibung

Die folgende Gabelbombe wurde 2002 als Kunst präsentiert;56
ihre genaue Herkunft ist unbekannt, aber sie existierte im Usenet vor 2002.
Die Bombe wird ausgeführt, indem die folgenden 13 Zeichen in eine
UNIX-Shell wie bash oder zsh. Es arbeitet, indem es
eine Funktion namens ‘:’ definiert, die sich selbst zweimal aufruft, einmal im
Vordergrund und einmal im Hintergrund.

Allerdings ist mir das letzte Stück nicht ganz klar. Ich sehe die Funktionsdefinition:

:(){ ... }

Aber was ist sonst los? Machen Sie auch andere Shells wie ksh , csh , und tcsh auch das gleiche Schicksal erleiden, etwas Ähnliches konstruieren zu können?

Akzeptierte Antwort:

Diese Gabelbombe erinnert mich immer an das, was ein Lehrer für KI-Programmierung in einer der ersten Lektionen, die ich besuchte, gesagt hat:„Um Rekursion zu verstehen, müssen Sie zuerst Rekursion verstehen.“

Im Kern ist diese Bombe eine rekursive Funktion. Im Wesentlichen erstellen Sie eine Funktion, die sich selbst aufruft, die sich selbst aufruft, die sich selbst aufruft…. bis Systemressourcen verbraucht sind. In diesem speziellen Fall wird die Rekursion verstärkt, indem die Funktion an sich selbst weitergeleitet UND in den Hintergrund gestellt wird.

Ich habe gesehen, dass dies auf StackOverflow beantwortet wurde, und ich denke, das dort angegebene Beispiel veranschaulicht es am besten, nur weil es einfacher ist, auf einen Blick zu sehen, was es tut (von dem Link oben gestohlen …)

☃(){ ☃|☃& };☃

Definieren Sie die Fehlerfunktion ☃() { ... } , dessen Hauptteil sich selbst aufruft (die Fehlerfunktion) und die Ausgabe an sich selbst weiterleitet (die Fehlerfunktion) ☃|☃ , und hinterlegen Sie das Ergebnis & . Rufen Sie dann, nachdem die Funktion definiert ist, tatsächlich die Fehlerfunktion ; ☃ .

Ich stelle fest, dass zumindest auf meiner Arch-VM die Notwendigkeit, den Prozess in den Hintergrund zu stellen, keine Voraussetzung ist, um das gleiche Endergebnis zu erzielen, den gesamten verfügbaren Prozessraum zu verbrauchen und den Host b0rked zu rendern. Eigentlich habe ich jetzt gesagt, dass es manchmal den Runaway-Prozess zu beenden scheint und nach einem Bildschirm voller -bash: fork: Resource temporarily unavailable es wird mit einem Terminated beendet (und journalctl zeigt bash core dumping).

Verwandt:Wie bringt man vim dazu, mit tmux richtig zu arbeiten?

Um Ihre Frage zu csh/tcsh zu beantworten, unterstützt keine dieser Shells Funktionen, Sie können nur Aliasnamen verwenden. Für diese Shells müssten Sie also ein Shell-Skript schreiben, das sich selbst rekursiv aufruft.

zsh scheint das gleiche Schicksal zu erleiden (mit dem gleichen Code), erzeugt keinen Core-Dump und veranlasst Arch, Out of memory: Kill process 216 (zsh) score 0 or sacrifice child. auszugeben , aber es wird immer noch gegabelt. Nach einer Weile heißt es dann Killed process 162 (systemd-logind) ... (und hat immer noch ein forking zsh).

Arch scheint keinen pacman zu haben Version von ksh, also musste ich es stattdessen auf Debian versuchen. ksh-Objekte zu : als Funktionsname, aber mit etwas – sagen wir b() scheint stattdessen das gewünschte Ergebnis zu haben.


Linux
  1. Was ist NGINX? Wie funktioniert es?

  2. Was ist ein Webserver und wie funktioniert ein Webserver?

  3. Wie funktioniert Awk ‘!a[$0]++’?

  4. Wie funktioniert das Sticky Bit?

  5. Was ist DNS und wie funktioniert es?

Wie funktioniert Git?

Wie funktioniert SFTP?

Ssh – Wie funktioniert Reverse-SSH-Tunneling?

Linux – Wie funktioniert die Anzeige von Linux?

Wie funktioniert Swap-Speicher in Linux?

Wie funktioniert die Anzeige von Linux?