Last-modified: April 07, 2001 Version: 1.02 URL: http://www.worldmusic.de/perl/idiots-guide.html ------------------------------------------------------------------------ Die Anleitung zum Loesen von CGI-Problemen fuer "Idioten" (Uebersetzung des "Idiot's Guide to Solving CGI Problems" von Tom Christiansen) ------------------------------------------------------------------------ Diese Seite bezieht sich hauptsaechlich 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 darueber 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 Loesung gesucht zu haben. Das schreckt schon mal Leute ab, die Dir ansonsten haetten helfen koennen (und wollen); und verarmt das Netz, weil es das ohnehin schon schlappe Verhaeltnis von Signal zu Rauschen noch weiter verschlechtert. Gehe zunaechst einmal die untenstehende Checkliste durch, um ein paar Fragen zu beantworten [kennenzulernen?] . Ein paar Beispielantworten sind vorgegeben - andere wirst Du selbst herausfinden muessen. ------------------------------------------------------------------------ Frage: Wem "gehoert" 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 ausfuehrbar 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 Ausfuehren von CGIs bei Deinem Server fuer das Verzeichnis und/oder die Dateiendung eingerichtet? Antwort: Nein, mein Systemadministrator hat vergessen, das so zu konfigurieren. Er dachte, GET wuerde ausreichen, und hat die Moeglichkeiten fuer POST weggelassen. ------------------------------------------------------------------------ Frage: Unter welcher UID (User ID) fuehrt 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: Noe. Die Dateien gehoeren mir, aber sie werden nicht als "ich" ausgefuehrt. Und die Rechte sind 0600 anstelle von 0666. Schaetze, deshalb kann ich meine Dateien nicht oeffnen. ------------------------------------------------------------------------ Frage: Was passiert, wenn Du das Script interaktiv ausfuehrst? Antwort: Ich wusste gar nicht, dass man CGI-Scripts interaktiv ausfuehren kann, weil ich es nicht fuer wichtig hielt, die Dokumentation fuer 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 haengt 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 hoeher. (Versuche perl -v und uname -a zu benutzen, um herauszufinden, ob Perl aelter 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 natuerlich 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 laeuft.) Antwort: Apache 1.3.17 ------------------------------------------------------------------------ Frage: Was passiert wenn Du Perls -w - Flag benutzt? Antwort: Ich erhalte jede Menge Auskunft ueber meine dummen Fehler, die alle detailliert in der perldiag manpage ("Seite" des elektronischen Handbuches) aufgelistet sind, wo ich sorgfaeltig nachgeschaut habe, was sie bedeuten. ------------------------------------------------------------------------ Frage: Was passiert wenn Du Perls -T - Flag benutzt? Antwort: Ich erhalte jede Menge Auskunft ueber Sicherheitsprobleme, die uebrigens in der perlsec manpage beschrieben sind, welche ich sorgfaeltig 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; ausserdem findet Perl all diese dummen Fehler, die ich dann sorgfaeltig 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 gueltigen Header und dann einen gueltigen 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 "Sample Title\n"; Vielleicht haette ich doch besser gleich das Modul CGI.pm benutzen sollen das mir ueber die Funktionen header(), start_html() und end_html() automatisch und, vor allem, korrekt ein komplettes HTML-Rumpfdokument erzeugt und das inklusive dazugehoerigem Header. ------------------------------------------------------------------------ Frage: Hast Du daran gedacht, STDOUT am Anfang Deines Scriptes zu "flush"en, so dass der MIME-Typ vor irgendwelchen Fehlermeldungen ausgegeben wird? Antwort: Nein. Kein Wunder, dass 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 Rueckgabwerte 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 waere), oder hast zumindest die eingeschraenktere cgi-lib.pl - Bibliothek benutzt? Antwort: Haeh? 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 dass 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 ueberlegt, nach de.comm.infosystems.www.authoring.cgi zu posten, anstatt die de.comp.lang.perl.*-Newsgroups mit Fragen zu ueberfluten, die nicht das Geringste mit Perl zu tun haben? Antwort: Noe. 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 Boesen Imperiums benutzt: Hast Du schon geschaut, was die Windoof-Perl-FAQ ueber 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 hoert man, wie die Festplatte langsam zu Staub zermahlen wird, nachdem wichtige Geschaeftsgeheimnisse gestohlenn worden sind) ------------------------------------------------------------------------ Wenn Du einfache Fragen stellst, stehen die Chancen recht gut, dass Du Dein Problem selbst loesen kannst, ohne um Hilfe bitten zu muessen und das Netz gegen Dich aufzubringen. Nachdem Du alle diese Dinge sorgfaeltig ueberprueft 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 moeglichst 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 bisschen Sinn fuer 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 Buechern an, die Du unter http://www.worldmusic.de/perl/perlbuch.html finden kannst. Meiner Meinung nach sind die Buecher von Addison-Wesley und O' Reilly die verstaendlichsten; 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. Ue.: Der obenstehende Text ist im Original in einem sehr "legeren" Ton gehalten. Es wurde bei der Uebersetzung 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 / gaengigere zu ersetzen. Meinen Dank an dieser Stelle an Volker Rattel, der sich die Muehe gemacht, diesen Text noch einmal Korrektur zu lesen und viele meiner Schnitzer auszubessern. Jorgen W. Lang im Mai 2000 ------------------------------------------------------------------------ Copyright 1996 Tom Christiansen. Alle Rechte vorbehalten. Copyright der Uebersetzung (c) 2000 by Jorgen W. Lang