Settings

The page will reload to apply your changes.
Theme

ASCII Art Font

ASCII Art Menu

Original Usenet message from de.alt.rec.ascii-art, 5 May 2003.
Re: Wie geht das?

Re: Wie geht das?

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
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.

Help classify this post