[ HOME
| mini-faq | dclpc-faq
| checkliste | perlbuch
| 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>