Warum hat der Befehl „: () {: |: &} ;:“ mein System so stark verzögert, dass ich neu starten musste?


286

ACHTUNG!

Führen Sie diesen Befehl nicht aus, um ihn zu testen, es sei denn, Sie sind auf einen Absturz und / oder einen erzwungenen Neustart Ihres Systems vorbereitet.

Ich habe in meiner Virtualbox 12.04 versucht, eine App zu kompilieren, und während ich wartete, war ich zufällig auf ein Forum gestoßen, in dem ein Kommentar lautete:

Probieren Sie auch :(){ :|: & };:
Fun aus und benötigen Sie keinen Root.

Ohne nachzudenken, habe ich es in meinem Gnome-Terminal ausgeführt. Das hat meine 12.04 (in Virtualbox) so stark verzögert, dass ich sie herunterfahren musste.

Meine Frage ist, was macht dieser Befehl?

: () {: |: &} ;:



1
Siehe auch einen alten Thread: ubuntuforums.org/showthread.php?t=1392511
Paddy Landau



9
"Lag so schlecht" ist ziemlich optimistisch.
pstadler

Antworten:


372

Dies nennt man eine Gabelbombe .

:() bedeutet, dass Sie eine Funktion definieren, die aufgerufen wird :

{:|: &}bedeutet, die Funktion auszuführen :und ihre Ausgabe erneut an die :Funktion zu senden und diese im Hintergrund auszuführen.

Das ;ist ein Befehlstrennzeichen.

: Führt die Funktion zum ersten Mal aus.

Im Wesentlichen erstellen Sie eine Funktion, die sich bei jedem Aufruf zweimal selbst aufruft und keine Möglichkeit hat, sich selbst zu beenden. Es wird sich so lange verdoppeln, bis Ihnen die Systemressourcen ausgehen.

Das Laufen in Virtualbox war sehr vernünftig, sonst hätten Sie Ihren PC neu starten müssen.


27
Diese Antwort scheint darauf hinzudeuten, dass ein Neustart die einzige Möglichkeit ist. Tatsächlich kann diese Gabelbombe jedoch ohne Neustart getötet werden, und ich habe tatsächlich festgestellt, dass sie auf einigen Systemen sowieso nicht richtig funktioniert (weil das Spawn-Limit sinnvoll festgelegt ist).
Konrad Rudolph

27
Um eine vollständige Erklärung zu erhalten, sollte hier wahrscheinlich erwähnt werden, dass ;es sich um ein Befehlstrennzeichen handelt. Der { ... }Teil ist einfach der Inhalt der Funktion.
ein Lebenslauf

@ MichaelKjörling +1 Ich habe die Syntax erst verstanden, als ich Ihre Kommentare berücksichtigt habe.
Jumpnett

1
@SuperMatt Ich weiß nicht, ob diese Frage noch aktiv ist, aber trotzdem wollte ich wissen, was tut |und &tut. Ich verstehe, dass Sie die Funktionsweise der Funktion bereitgestellt haben, aber ich wollte wissen, was diese beiden tun
26.

1
@Noober wenn du dich noch fragst (so wie ich in diesem schwarzen Loch der knappen und kryptischen Dokumentation bin, die Linux ist), weiß ich! | Ist eine Pipe, die nach einem Befehl eingefügt wird, um die Ausgabe der Befehle als Eingabe für den folgenden Befehl zu senden. & ist eine Verzweigung, die einen neuen Thread für den vorhergehenden Befehl erstellt und den aktuellen Thread verlässt, um weitere Befehle auszuführen
flurbius

179

Dies ist eine sogenannte Gabelbombe, die in der Schale implementiert ist.

aus 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
Obwohl es sich um einen Tangentialpunkt handelt und der Begriff "Disown" möglicherweise überladen ist, wird ein in den Hintergrund gerichteter Prozess technisch gesehen nicht abgelehnt und kann immer mit dem Befehl "fg" in den Vordergrund gebracht werden. Die Prozesse werden beendet, wenn der Benutzer abmeldet (wenn es noch Mittel zur Verfügung stehen eine Abmeldung zu erreichen) .... es sei denn , und bis man läuft ‚disown‘ auf den Prozess oder jobid. Danach wird es in der Tat abgelehnt: Das Abmelden wird nicht beendet und fg hat keine Auswirkung.
Rondo

1
Obwohl dies nur eine Nebensache ist, bedeuten die Klammern nicht, dass in bashartigen Schalen keine Parameter vorhanden sind, sondern dass es sich nur um Dekoration handelt, die von C-Sprachen übrig geblieben ist.
Charlie Harding

75

Dieser Befehl ist eine bekannte Version der Gabelbombe

Gabelbombenbild aus Wikipedia

Es führt dazu, dass Ihrem Computer der Arbeitsspeicher ausgeht, indem ein Prozess unendlich lang unterbrochen wird. Es gibt einige Schutzmaßnahmen, die Sie auch dagegen anwenden können:

Unix-Systeme haben normalerweise ein Prozesslimit, das von einem ulimit-Shell-Befehl oder seinem Nachfolger setrlimit gesteuert wird. Linux-Kernel setzen und erzwingen das RLIMIT_NPROC-Limit ("Ressourcenlimit") eines Prozesses. Wenn ein Prozess versucht, eine Verzweigung auszuführen, und der Benutzer, dem dieser Prozess gehört, bereits RLIMIT_NPROCProzesse besitzt , schlägt die Verzweigung fehl. Außerdem kann man unter Linux oder * BSD die pam_limitsKonfigurationsdatei /etc/security/limits.confauf die gleiche Weise bearbeiten . Bei nicht allen Linux-Distributionen ist das pam_limitsModul jedoch standardmäßig installiert.


18

Nach dieser :(){ :|: & };: heißt

Forkbomb ist eine Art poetischer Virusschöpfer

... Das verschlagene kleine Programm befiehlt ihm, mehrere Kopien von sich selbst anzufertigen, eine Kettenreaktion auszulösen und so die Ressourcen des Systems schnell zu erschöpfen ...

Es wird daher davon abgeraten, dies auszuführen. Dies kann die Hardware beschädigen, da dies zu einer schleifenweisen Ausführung führt und bei Laptops zu einer leichten Erwärmung führen kann.

Ein weiterer Link erklärt durch Screenshots hier .


59
Wenn eine Gabelbombe Hardwareschäden verursacht , haben Sie ein viel größeres und tieferes Problem.
ein Lebenslauf

38
Vielleicht sprach er von einer Bombe mit Gabelform, die in der Nähe Ihres PCs explodieren kann?
Dysoko

2
Der Link zum Screenshot ist kaputt.
IMustBeSomeone

0

Es wird , wie oben erläutert, als " Gabelbombe " bezeichnet. Eine andere Möglichkeit wäre, die Hintergrundausführung anstelle von Piping zu verwenden:

:(){ :&:;};:
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.