Re: Wie geht das?
From Joerg Seyfferth <sey...@network-science.de>
· de.alt.rec.ascii-art
· 5 May 2003 20:28 · View full thread
· report
David Flatz wrote: > [mn] wrote: > >>Karsten Kruse <tec...@gmx.net> schrieb: >> >>>Shellspass: :(){ :|:&};: >> >>Hm, mal ne Frage zum "Shellspass" (spa�ig, in der Tat): >>WAS genau passiert da eigentlich? > > Ich sch�tze mal, das ist eine art Forkbombe. Ich hab allerdings keinen > Schimmer, wie's funktioniert, nur dass es unendlich viele Prozesse startet, > von denen einer alleine schone 100% CPU-Auslastung h�tte. nur ganz leicht OT ;) Ausgangssituation: :(){ :|:&};: Dabei handelt es sich um ein "unlesbar" gemachtes und in einer Zeile untergebrachtes Shell-Script. Um das Shell-Script besser lesbar darzustellen ersetze ich erst mal alle Doppeldunkte durch "unterprogramm". Raus kommt dann die folgende Zeile: unterprogramm(){ unterprogramm|unterprogramm&};unterprogramm Dann noch zur besseren Lesbarkeit in einzelne Zeilen aufgeteilt. unterprogramm() { unterprogramm|unterprogramm& }; unterprogramm Die Shell wuerde das Script so mit dem gleichen Resultat ausfuehren. Nur ist es so fuer den Menschen (etwas) verstaendlicher. Um fuer mich besser Bezug auf die einzelnen Zeilen nehmen zu koennen nummeriere ich sie noch durch: 1 unterprogramm() 2 { 3 unterprogramm|unterprogramm& 4 }; 5 unterprogramm In Zeile eins steht die Definition eines Unterprogramms bzw. Funktion mit dem Namen "unterprogramm". Alles zwischen den geschweiften Klammern in Zeile zwei und vier ist der eigentliche Programmteil der Funktion "unterprogramm". Hier umfasst der eigentliche Programmteil der Funktion nur die Zeile drei. Wenn das Script von der Shell aufgerufen wird, geht die Shell das Script von oben nach unten durch und "ueberspringt" dabei Funktionsdefinitionen mit deren Programmteil. D.h. die erste Zeile, die die Shell wirklich ausfuehrt ist die Zeile fuenf. In Zeile fuenf steht fuer die Shell der Befehl "unterprogramm", der bewirkt, dass die zuvor uebersprungene Funktion "unterprogramm" mit deren Inhalt (Zeile drei) ausgefuehrt werden soll. Wuerde man im Script Zeile drei gegen eine Zeile austauschen, die einen Text ausgibt, dann wuerde der Aufruf des folgenden Scripts unterprogramm() { echo "Cooles Wetter!" }; unterprogramm nur einmal den Text "Cooles Wetter!" ausspucken und sich dann beenden. Ergaenzt man das Script aber um eine Zeile nach der Textausgabe, wie folgt: unterprogramm() { echo "Cooles Wetter!" unterprogramm }; unterprogramm dann gibt das Script den Text aus und ruft anschliessend wieder die Funktion "unterprogramm" auf, gibt den Text wieder aus und ruft sich wieder auf und so weiter. Das Resultat waere eine nicht endende Ausgabe von: Cooles Wetter! Cooles Wetter! Cooles Wetter! Cooles Wetter! Cooles Wetter! Cooles Wetter! Cooles Wetter! Cooles Wetter! Cooles Wetter! . . . Im eigentlichen Programm wird in Zeile drei, anders als in meiner Variantion, kein Text ausgegeben. Wenn in einem Shell-Script, wie hier in Zeile drei, der Pipe-Strich "|" zum Einsatz kommt, bedeutet es, dass der Text oder die Ausgabe des Programms bzw. der Funktion vor dem Pipe-Strich an das Programm oder die Funktion nach dem Pipe-Strich durchgereicht wird. Zur Uebersicht wiederhole ich nochmal Zeile drei: 3 unterprogramm|unterprogramm& Hier ruft die Funktion "unterprogramm" sich wieder selbst auf und versucht seine Textausgabe an einen weiteren Aufruf der Funktion "unterprogramm" weiterzureichen. Bei jedem Aufruf der Funktion "unterprogramm" verschlimmert sich die Situation, weil immer mehr ineinander geschachtelte "Selbstaufrufe" erfolgen. Normalerweise reicht die Funktion links der Pipe seinen Text oder seine Ausgabe an die Funktion rechts der Pipe durch und beendet sich dann. Wenn die Funktion links der Pipe sich nicht beendet oder wie hier keinen Text schickt, "haengt" die Funktion rechts der Pipe, weil sie auf das Beenden der Funktion links der Pipe wartet. Somit "haengen" zwei laufende Funktionen und produzieren neue Funktionsaufrufe, die wieder und wieder sich selbst aufrufen. Das "&" bewirkt, dass das laufende Script als Hintergrundprozess weiterlaeuft und der Kommando-Prompt der Shell wieder erscheint. Das Script laeuft sozusagen im Hintergrund weiter und die urspuengliche Shell ist wieder frei fuer neue Eingaben. Ohne das "&" kaeme der Prompt der Shell erst wieder, wenn das Script durchgelaufen ist oder abgebrochen wurde. Durch die unendlichen Selbstaufrufe im Script wuerde der Prompt natuerlich nicht wieder kommen und der Benutzer haette noch die Moeglichkeit das laufende Script direkt mit Control+C abzubrechen. Durch das "&" rennt das Selbstmordkommando-Script im Hintergrund und ist fuer den Benutzer nicht mehr mit Control+C erreichbar. Bis der Benutzer merkt, was er da eigentlich aufgerufen hat, ist das System schon so ausgelastet, dass sich der Hintergrundprozess auch nicht mehr mit dem Befehl "fg" am Kommando-Prompt in den Vordergrund zurueck holen laesst, um es dann mit Crontrol+C zu beenden. Ich hoffe ich konnte etwas Licht in das "heimtueckische" Shell-Script bringen. Diddles erwuenscht :) -- MfG Joerg Seyfferth
Original message headers
X-Google-Language: GERMAN,ASCII X-Google-Thread: f7c81,cb2444dea5c2164f X-Google-Attributes: gidf7c81,public X-Google-ArrivalTime: 2003-05-05 13:31:08 PST Path: archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-06!sn-xit-08!supernews.com!news-out.visi.com!petbe.visi.com!skynet.be!skynet.be!newsfeed00.sul.t-online.de!newsmm00.sul.t-online.com!t-online.de!news.t-online.com!not-for-mail From: Joerg Seyfferth <sey...@network-science.de> Newsgroups: de.alt.rec.ascii-art Subject: Re: Wie geht das? Date: Mon, 05 May 2003 22:28:47 +0200 Organization: none Lines: 163 Message-ID: <b96hi0$3n4$04$1...@news.t-online.com> References: <b8p56j$c3ghi$1...@ID-15892.news.dfncis.de> <Pin...@uberhost.newbie-net.de> <b8r2f7$ch9f8$1...@ID-15892.news.dfncis.de> <Pin...@uberhost.newbie-net.de> <id2...@4ax.com> <3eb6ae0e$0$18200$91c...@newsreader01.highway.telekom.at> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-Trace: news.t-online.com 1052166528 04 3812 05H7Ek7SmA2MA 030505 20:28:48 X-Complaints-To: abu...@t-online.com X-ID: SxB+s6ZYoecn+3KLdy8l1hTTgACuKnR05Qn897w9U5jWHibXpgvTU8 User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3) Gecko/20030412 X-Accept-Language: de, en-us, en In-Reply-To: <3eb6ae0e$0$18200$91c...@newsreader01.highway.telekom.at> X-Enigmail-Version: 0.73.1.0 X-Enigmail-Supports: pgp-inline, pgp-mime Xref: archiver1.google.com de.alt.rec.ascii-art:4786
Related ASCII art in the Gallery
Explore these categories from our collection of 11,000+ artworks:
Make your own ASCII art
Turn images, text or 3D into ASCII, or draw your own – right in your browser.
About this message.
This message was posted publicly to the newsgroup
de.alt.rec.ascii-art
in 2003 and is mirrored here unchanged as part of the Historic Archives – only email addresses are masked.
The artwork and text belong to their original authors: if you copy a piece, keep the artist's initials or signature intact and credit them where you can.
Are you the author? Contact us to get your posts attributed, connected to your artist profile, or removed.
Report this message
Help us keep the archive clean and accurate. Reports are reviewed by a person – nothing is changed automatically.