- WARNUNG VERSUCHEN SIE NICHT, DIESES GERÄT AUF EINER PRODUKTIONSMASCHINE ZU LAUFEN
Wenn ich die Wikipedia-Seite zum Thema lese, verfolge ich im Allgemeinen die Vorgänge mit folgendem Code:
:(){ :|:& };:
Auszug aus der Beschreibung
Die folgende Gabelbombe wurde 2002 als Kunst präsentiert;56 Der genaue Ursprung ist nicht bekannt, aber es gab ihn im Usenet vor 2002. Die Bombe wird ausgeführt, indem die folgenden 13 Zeichen in eine UNIX- Shell wie bash oder zsh eingefügt werden . Es wird eine Funktion mit dem Namen ':' definiert, die sich zweimal im Vordergrund und einmal im Hintergrund aufruft.
Allerdings ist mir das letzte Stück nicht ganz klar. Ich sehe die Funktionsdefinition:
:(){ ... }
Aber was ist noch los? Auch tun andere Shells wie ksh
, csh
und tcsh
leiden auch das gleiche Schicksal der Lage zu sein , etwas Ähnliches zu konstruieren?
bash
shell-script
zsh
fork
slm
quelle
quelle
Antworten:
Diese Gabelbombe erinnert mich immer an etwas, was ein KI-Programmierlehrer in einer der ersten Lektionen sagte, an denen ich teilgenommen habe: "Um Rekursion zu verstehen, muss man zuerst Rekursion verstehen."
Diese Bombe ist im Kern 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 im Hintergrund dargestellt wird.
Ich habe gesehen, dass dies auf StackOverflow beantwortet wurde , und ich denke, dass das dort angegebene Beispiel es am besten veranschaulicht, nur weil es einfacher ist, auf einen Blick zu sehen, was es tut (gestohlen vom obigen Link ...)
Definieren Sie die Fehlerfunktion
☃() { ... }
, deren Hauptteil sich selbst aufruft (die Fehlerfunktion), die Ausgabe an sich selbst weiterleitet (die Fehlerfunktion)☃|☃
und das Ergebnis im Hintergrund&
. Rufen Sie dann, nachdem die Funktion definiert wurde, tatsächlich die Fehlerfunktion auf; ☃
.Ich stelle fest, dass zumindest auf meiner Arch-VM die Notwendigkeit, den Prozess im Hintergrund auszuführen, keine Voraussetzung dafür ist, dass dasselbe Endergebnis erzielt wird, der gesamte verfügbare Prozessspeicher belegt und der Host blockiert wird. Eigentlich habe ich jetzt gesagt, dass es manchmal den Run-Away-Prozess zu beenden scheint und nach einem Screenful
-bash: fork: Resource temporarily unavailable
mit einemTerminated
(undjournalctl
zeigt bash core dumping) aufhört .Um Ihre Frage zu csh / tcsh zu beantworten, unterstützt keine dieser Shells Funktionen. Sie können nur einen Aliasnamen verwenden. Für diese Shells müssten Sie also ein Shell-Skript schreiben, das sich selbst rekursiv aufruft.
zsh scheint dasselbe Schicksal zu erleiden (mit demselben Code), entleert den Kern nicht und veranlasst Arch, zu geben
Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.
, aber es gibt sich weiterhin. Nach einer Weile heißt es dannKilled process 162 (systemd-logind) ...
(und hat immer noch eine Gabelung zsh).Arch scheint keine
pacman
Version von ksh zu haben, also musste ich es stattdessen mit Debian versuchen. ksh Objekte:
als Funktionsname, aber mit etwas - sagenb()
stattdessen scheint das gewünschte Ergebnis zu haben.quelle
Ctrl+Shift+u+<hex>
den Hex-Code des Unicode-Zeichens, das Sie anzeigen möchten. Eine Liste der sichtbaren Unicodes finden Sie unter: fileformat.info/info/unicode/utf8test.htm (die meisten ungeraden finden Sie in den Abschnitten "Verschiedenes"). Windows sollte superuser.com/questions/47420/… auschecken und ich persönlich benutze das in dem Link erwähnte Toolunicodeinput.exe
oder schneide es über meinen Browser aus und füge es ein. Sie können immer HTML-Sequenzen verwenden, wie von Sambler vorgeschlagen.