PERL


[ HOME | mini-faq | dclpc-faqchecklisteperlbuch | idiot's guide ]


Anmerkung : Dieses Dokument liegt auch in den folgenden Formaten vor: [ .txt ]

Last-modified: April 07, 2001
Version: 1.02
URL: http://www.worldmusic.de/perl/idiots-guide.html


Die Anleitung zum Lösen von CGI-Problemen für "Idioten"

(Übersetzung des "Idiot's Guide to Solving CGI Problems" von Tom Christiansen)

Diese Seite bezieht sich hauptsächlich auf Unix-Systeme. Falls Du ein anderes Betriebssystem benutzt, solltest Du wahrscheinlich auch die anderen Perl-FAQs lesen.

Falls Du - wie die meisten Leute - in der Newsgroup bist, hast Du uns vermutlich mit dem klassischen CGI-Problem konfrontiert: "Geht nicht".
Allerdings ohne uns ausreichende Hintergrundinformationen darüber zu geben, worin das Problem denn nun besteht. Dumm, denn so stehst Du nun als Dussel da, der um kostenlose Hilfe bittet - ohne vorher selbst nach einer Lösung gesucht zu haben.


Das schreckt schon mal Leute ab, die Dir ansonsten hätten helfen können (und wollen); und verarmt das Netz, weil es das ohnehin schon schlappe Verhältnis von Signal zu Rauschen noch weiter verschlechtert.

Gehe zunächst einmal die untenstehende Checkliste durch, um ein paar Fragen zu beantworten [kennenzulernen?] . Ein paar Beispielantworten sind vorgegeben - andere wirst Du selbst herausfinden müssen.


Frage:
Wem "gehört" das Script ?
Antwort:
Mir.
 

Frage:
Auf welche Rechte ist das Script gesetzt?
Antwort:
Sie standen auf 0600 (-rw-------), dann habe ich aber gemerkt, dass das Script nicht ausführbar war. Ich nehme also besser 0755 (-rwxr-xr-x).
 

Frage:
Befindet sich Dein Script im richtigen Verzeichnis?
Antwort:
Nein, ich habe vergessen, es in /usr/local/apache/cgi-bin/ abzulegen ( bzw. unter dem Pfad, der in der Konfigurationsdatei (/usr/local/apache/conf/httpd.conf bei einer "Standadinstallation" des Apache-Webservers unter Linux)) in der Directive ScriptAlias angegeben ist.
 

Frage:
Ist das Ausführen von CGIs bei Deinem Server für das Verzeichnis und/oder die Dateiendung eingerichtet?
Antwort:
Nein, mein Systemadministrator hat vergessen, das so zu konfigurieren. Er dachte, GET würde ausreichen, und hat die Möglichkeiten für POST weggelassen.
 

Frage:
Unter welcher UID (User ID) führt der Webserver seine CGI-Programme aus?
Antwort:
wwwuser bzw nobody. (Hoppla. Damit kann man ja gar nicht in meine Dateien oder Verzeichnisse schreiben.)
 

Frage:
Kann die UID des Servers irgendwelche Dateien schreiben, die Du schreiben wolltest?
Antwort:
Nö. Die Dateien gehören mir, aber sie werden nicht als "ich" ausgeführt. Und die Rechte sind 0600 anstelle von 0666. Schätze, deshalb kann ich meine Dateien nicht öffnen.
 

Frage:
Was passiert, wenn Du das Script interaktiv ausführst?
Antwort:
Ich wusste gar nicht, dass man CGI-Scripts interaktiv ausführen kann, weil ich es nicht für wichtig hielt, die Dokumentation für das Modul CGI.pm zu lesen.
 

Frage:
Was steht im Error-Log des Servers?
Antwort:
Oh. Ich habe gar nicht daran gedacht, da mal nachzuschauen. Ah, da ist es ja ( z.B.: /usr/local/apache/logs/error_log ). Hmm...
 

Frage:
Wo ist die Error-Log-Datei?
Antwort:
(Kann man nicht wissen, das hängt vom benutzten System ab. Frage Deinen Server-Administrator, wenn Du es nicht in /usr/local/apache/logs/error_log finden kannst.)
 

Frage:
Welche Perl-Version wird benutzt? Welche Version des Betriebssystems?
Antwort:
Perl Version 5.6.0, Linux 6.1 oder höher.
(Versuche perl -v und uname -a zu benutzen, um herauszufinden, ob Perl älter als 5.005 ist.
Falls "Ja": JETZT UPGRADEN!)
 
 

Frage:
Welche Version der Bibliothek (des Moduls...) wird benutzt?
Antwort:
grep -i version in der Bibliothek, oder bei CGI.pm, mach' Folgendes:
$ perl -le 'use CGI; print $CGI::VERSION'
2.55
 

Frage:
Wie lautet der Pfad zum Perl-Interpreter auf Deinem Server?
Antwort:
/contrib/bin/perl
 

Frage:
Und welchen Pfad zum Perl-Interpreter hast Du in Deinem Script angegeben?
Antwort:
/usr/bin/perl. (Oops, dann kann das natürlich nicht gefunden werden.)
 

Frage:
Welche Versionsnummer hat der Webserver (HTTP-Daemon), den Du benutzt?
(Diese Angabe gibt den Leuten einen Hinweis auf die Systemumgebung, unter der Dein Skript läuft.)
Antwort:
Apache 1.3.17

Frage:
Was passiert wenn Du Perls -w - Flag benutzt?
Antwort:
Ich erhalte jede Menge Auskunft über meine dummen Fehler, die alle detailliert in der perldiag manpage ("Seite" des elektronischen Handbuches) aufgelistet sind, wo ich sorgfältig nachgeschaut habe, was sie bedeuten.
 

Frage:
Was passiert wenn Du Perls -T - Flag benutzt?
Antwort:
Ich erhalte jede Menge Auskunft über Sicherheitsprobleme, die übrigens in der perlsec manpage beschrieben sind, welche ich sorgfältig gelesen und verstanden habe. Ich habe sogar die CGI Security FAQ gelesen...
 

Frage:
Was passiert, wenn Du use strict in Deinem Script benutzt?
Antwort:
Ich fange an, meine Variablen zu deklarieren und meine Strings korrekt zu quoten; außerdem findet Perl all diese dummen Fehler, die ich dann sorgfältig korrigiere, indem ich my() -Deklarationen, use vars und quotes benutze.
 

Frage:
Hast Du daran gedacht, den korrekten MIME-Typ auszugeben, bevor Du irgendwelche Nicht-Header-Ausgaben machst?
(Andere Header sind zum Beispiel Location: ... oder Set-Cookie: ...)
Antwort:
Oh, richtig, ich brauche ja erst einen gültigen Header und dann einen gültigen Body. Ich vermute, ich muss diese Sachen eher ausgeben, als ich das bisher getan habe. Und ich muss Header und Body mit zwei newline-Zeichen trennen, anstatt einfach mit einem:

print "Set-cookie: GroversDelight\n";
print "Content-Type: text/html\n\n"; # <-- zwo Newlines!
print "<HEAD>Sample Title</HEAD>\n";

Vielleicht hätte ich doch besser gleich das Modul CGI.pm benutzen sollen das mir über die Funktionen header(), start_html() und end_html() automatisch und, vor allem, korrekt ein komplettes HTML-Rumpfdokument erzeugt und das inklusive dazugehörigem Header.


Frage:
Hast Du daran gedacht, STDOUT am Anfang Deines Scriptes zu "flush"en, so daß der MIME-Typ vor irgendwelchen Fehlermeldungen ausgegeben wird?
Antwort:
Nein. Kein Wunder, daß da nichts kommt, bevor es knallt, wenn es knallt. Ich denke, ich benutze besser die folgende Zeile am Anfang meines Scriptes:
$| = 1
 

Frage:
Was passiert, wenn Du die Rückgabwerte jedes einzelnen Systemaufrufes testest?
Antwort:
Na, das sieht mir aber nach viel zuviel Arbeit aus. Hmmm, als ich etwas wie
open FILE, ">some_file" or die("can't write some_file: $!");
 
eingebaut habe, hat sich im Error-Log gezeigt, dass $! schon mal "Permission denied" oder "No such file or directory" enthielt - und alles wurde klar.
 

Frage:
Hast Du das Standard-Modul CGI.pm benutzt, um das zu tun, was Du wolltest, anstatt alles von Hand zu parsen (was nun wirklich eine idiotische Idee wäre), oder hast zumindest die eingeschränktere cgi-lib.pl - Bibliothek benutzt?
Antwort:
Häh? Du meinst wirklich, das hat schon jemand vorher gemacht? Ich hatte ja keine Ahnung, das ich das gar nicht alles selbst machen muss und das ich die neueste Version des CGI.pm Modules unter http://www.perl.com/cgi-bin/cgi_mod?modules=CGI bekommen kann.
 

Frage:
Hast Du beim Installieren der Bibliothek make install eingetippt, um es im richtigen Verzeichnis abzulegen ( irgendwo in @INC, ziemlich sicher so etwas wie /usr/local/lib/perl/site_perl/CGI.pm), so daß sie auch korrekt gefunden werden kann, und hast Du die Rechte auf 0644 gesetzt, oder hast Du einfach blind eine Kopie von Hand angefertigt und damit den Pfad, die Rechte oder sogar beides durcheinandergebracht?
Antwort:
Was ist make? Schau, ich habe es doch bloss selbst (mis)installiert, durch einfaches Kopieren nach cgi-bin, und dann habe ich die Rechte auf 0700 gesetzt. Ich vermute, deshalb funktioniert das nicht, richtig?

Frage:
Hast Du überlegt, nach de.comm.infosystems.www.authoring.cgi zu posten, anstatt die de.comp.lang.perl.*-Newsgroups mit Fragen zu überfluten, die nicht das Geringste mit Perl zu tun haben?
Antwort:
Nö. Ist das etwa der Grund, warum ich keine sinnvollen Antworten bekomme, sondern nur "flames" ?
 

Frage:
Sofern Du irgendein hirntotes "Fessele-und-diszipliere-mich" Pseudo-Betriebssystem des Bösen Imperiums benutzt: Hast Du schon geschaut, was die Windoof-Perl-FAQ über das Web zu sagen hat?
Antwort:
Nein. Ich wusste nichts von der Perl for Win32 FAQ von Evangelo Prodromou.
 

Frage:
Hast Du es vermieden, den Perl-Interpreter in Deinem cgi-bin-Verzeichnis unterzubringen? Wo doch http://www.perl.com/perl/news/latro-announce.html und CERT deutlich davor warnen?
Antwort:
Nein. Was stimmt damit nicht?
(Im Hintergrund hört man, wie die Festplatte langsam zu Staub zermahlen wird, nachdem wichtige Geschäftsgeheimnisse gestohlenn worden sind)

Wenn Du einfache Fragen stellst, stehen die Chancen recht gut, dass Du Dein Problem selbst lösen kannst, ohne um Hilfe bitten zu müssen und das Netz gegen Dich aufzubringen.

Nachdem Du alle diese Dinge sorgfältig überprüft hast und auch Deinen Kumpel (Kollegen, Kommilitonen, ....) gefragt hast, ob er sowas schon mal gesehen hat, dann poste, aber stelle sicher, dass Du uns mit möglichst vielen Details versorgst, inklusive Deiner eigenen Antworten auf alle (oder jedenfalls den meisten) obenstehenden Fragen.

Andererseits, wenn die meisten der Fragen nicht einmal das kleinste bißchen Sinn für Dich machen, dann hast Du Dich allerdings ziemlich weit hinausgewagt. Sollte dies der Fall sein, dann wartest Du vielleicht noch einen Moment mit dem Programmieren von CGIs. Suche Dir einen Guru vor Ort und schau' Dir ein paar von den Büchern an, die Du unter http://www.worldmusic.de/perl/perlbuch.html finden kannst.

 
 

Meiner Meinung nach sind die Bücher von Addison-Wesley und O' Reilly die verständlichsten; aber es gibt so viele, dass Du vermutlich selber schauen willst. Bedenke, dass die Dicke eines Buches nicht Klarheit oder Richtigkeit bedeuten muss.

 
 

Anm. d. Ü.: Der obenstehende Text ist im Original in einem sehr "legeren" Ton gehalten. Es wurde bei der Übersetzung versucht, diesen Ton weitgehend beizubehalten. Ich habe mir die Freiheit genommen, wo es angebracht erschien, auf entsprechende deutschssprachige Ressourcen zu verweisen, sowie einige der im Original benutzten Beispiele durch neuere und meines Wissens aktuellere / gängigere zu ersetzen.

Meinen Dank an dieser Stelle an Volker Rattel, der sich die Mühe gemacht, diesen Text noch einmal Korrektur zu lesen und viele meiner Schnitzer auszubessern.

Jørgen W. Lang im Mai 2000


Copyright 1996 Tom Christiansen.
Alle Rechte vorbehalten.

Copyright der Übersetzung © 2000 by Jørgen W. Lang <jwl@worldmusic.de>

 

Konzeption, Website Design und ARTwork Copyright © 1999-2002 by Joergen W. Lang <jwl@worldmusic.de>