Seiten-Inhalt

CGI mit Perl

CGI Programmierung

HTTP-Server Apache

Um überhaupt CGI-Scripte lokal auf dem eigenen Rechner zu starten - und zu testen, muß ein HTTP-Server auf dem Rechner installiert werden. Erst habe ich versucht, mit OHTTP zu arbeiten. Für 'erste Schritte' ist dieser vollkommen ausreichend. Vor allem die Konfiguration ist für 'den ersten HTTP-Server' recht leicht verständlich in einem Windows-Fenster mit vielen Reitern untergebracht. Leider unterstützt er nicht alle Features, die für einen Server möglich sind (z.B die Fehlerausgabe via 'print STDERR ...' in die Error-Log-Datei funktioniert(e damals?) nicht).

So habe ich mich für einen HTTP-Server entschieden, der sogar noch kostenlos zum Download zur Verfügung steht: den Apache-Web-Server. Hier ein Link zum Download von Apache. Für die Konfiguration in einer Textdatei muss schon ein wenig Verständnis und Erfahrung vorhanden sein. Hat man diese Hürde aber erst einmal überwunden, so stehen alle Türen und Möglichkeiten offen... Der Apache ist schlißelich nicht umsonst ein weiter verbreiteter Web-Server - erstaunt war ich damals auch, wie problemlos er sich auch auf dem eigenen kleinen "normalen" Rechner installieren läßt.

Programmierung

Ich habe alle meine Erkenntnisse größtenteils aus den beiden Perl- Standardwerken 'Programmieren mit Perl' und 'Perl-Kochbuch' (siehe auch hier).
Des weiteren war mir sehr hilfreich die Befragung eines sehr geduldigen Freundes, der immer wieder Fragen von mir bekam und diese immer wieder beantwortete - wenn sie denn präzise genug gestellt waren :-)

Danke an Volker!


Der Shebang ("Schibäng" *g*)

In Perl-Scripten wird in der ersten Zeile dem Apachen festgelegt, wie er mit der Datei umgehen soll - wie in anderen Linux-/Unix-Scripten ist diese Zeile - der Shebang - der Pfad zu einem Interpreter, der weiß, wie er mit den folgenden Zeilen umzugehen hat. Einerseits kann man hier unter Windoof bspw.

#!c:/Perl/bin/perl.exe
use strict;
...
angeben. Es gibt aber auch noch eine weitere Möglichkeit, dies zu umgehen, um bspw. Scripte von Linux-Systemen ohne Anpassungen des Shebang zu übernehmen.

Hierfür ist ein wenig Konfiguration in der Apache-Konfigurationsdatei nötig - und ein kleiner Eingriff in die Windows-Registry.
Einerseits muß man für das entsprechende Verzeichnis (und somit den untergeordneten Verzeichnisbaum mit der
addhandler-Direktive festlegen, welche Dateien als CGI-Scripte ausgeführt werden. Meistens werden hier Dateiendungen wie .pl und/oder .cgi eingetragen. Nun folgt noch der "Trick", mit dem man dem Web-Server mitteilen kann, dass er den Shebang ignorieren und ein anderes Programm nutzen soll: ScriptInterpreterSource ist der Schlüssel zum Erfolg. Diesen Eintrag habe ich bei meinem Server auf registry gesetzt. Nun muß man noch in der Registry den Eintrag vornehmen, was ausgeführt werden soll. Hierfür dient dem Apachen der Registrierungs-Schlüssel HKEY_CLASSES_ROOT\Shell\ExecCGI\Command. Trägt man dort, wie im Apache-Manual beschrieben bspw. "C:/perl/bin/perl" ein, so werden ab nun (man denke an den Apache-Server-Neustart!) die Scripte mit dem dort eingetragenen Interpreter ausgeführt.

Auf meinem System hatte ich aber nun das Problem, daß ich auch .CGI-Dateien als Perl-Scripte ausführen lassen musste. Da Windoofs in diesem Fall aber noch keine Zuornung hatte, daß es .cgi-Dateien auch als Perl-Scripte zu interpretieren hat, funktioniert dies erst nicht. Als ich dann aber die Registry-Struktur

HKEY_CLASSES_ROOT\.cgi
HKEY_CLASSES_ROOT\.cgi           - (Standard) = Perl
HKEY_CLASSES_ROOT\Perl
HKEY_CLASSES_ROOT\Perl           - (Standard) - nicht gesetzt
HKEY_CLASSES_ROOT\Perl\ShellNew
HKEY_CLASSES_ROOT\Perl\ShellNew  - (Standard) - nicht gesetzt
einfügte, war auch das kein Problem mehr. Es werden nun .pl- und .cgi-Dateien als Perl-Scripte von dem in der Windows-Registry eingetragenen Interpreter (bspw. "c:/perl/bin/perl") interpretiert und ausgeführt.

(Bei mir funktioniert es so, wie ich oben beschrieben habe. Dies kann ggf. für andere Systeme so in der Art nicht unbedingt funktionieren - aber immerhin kann es als Anhaltspunkt dienen, eine Lösung zu finden. :-)


Häufige Fehler(-meldungen)

Treten beim ersten Testen von Perl-Scripten nach dem Hochladen auf den Server Fehler auf, so gibt es dafür in der Regel nur ein paar Gründe:

  • der Shebang wurde nicht an die Umgebung des Servers angepaßt, sondern ist noch auf den lokelen Pfad eingestellt.
  • Das Script wurde mit Hilfe von FTP im "binay"-Modus auf den Server übertragen. Perl- und andere Scripte müssen aber im "ASCII"-Modus übertragen werden. Ändern Sie die Einstellungen Ihres FTP-Programms und versuchen Sie es erneut.
  • Pfade, die unter der lokalen Umgebung funktionieren, wurden nicht auf die Begebenheiten des Servers angepaßt. So werden Verzeichnisse und/oder Dateien nicht gefunden.
  • Das Script hat die unter Unix/Linux erforderlichen Rechte nicht, um ausgeführt zu werden. Die Änderung des executable-Flags ist auch in den meisten FTP-Programmen möglich. (Unter besonders abgesicherten Umgebungen (z.B. cgiwrap) müssen erst noch entsprechende Berechtigungen gesetzt werden).
  • Das Script versucht im Schreibzugriff auf eine Datei zuzugreifen. Dies ist auf den meisten Servern ein Problem, da schon die Verzeichnisse nicht für schreibenden Zugriff freigegeben sind.
  • Manchmal kann es sein, daß bestimmte Module nicht standardmässig (oder in der neuesten Version) auf dem Server installiert sind. Überprüfen Sie am besten vor der Programmierung, ob das entsprechende Modul zur Verfügung steht oder klären Sie mit Ihrem System administrator, ob es installiert werden kann.

Weitere Fehlermeldungen entnehmen Sie der error.log-Datei. Ist bekannt, wo diese auf dem Server zu finden ist und können Sie auf diese zugreifen, so ist dort i.d.R. eine Beschreibung des Problems zu finden.

Code-Schnipsel

Schnipsel I: Meist führen auf dem Server liegende Scripte nicht nur eine einzige Aktion aus. Durch die Übergabe von Parametern (durch Formulare oder im URL) kann man die Reaktion des Scripts auf den Aufruf beeinflussen. Um die auszuführende Aktion zu interpretieren, benutze ich meist folgende Zeilen:

#!/usr/bin/perl -w
use strict;
use CGI;
my $q = new CGI;


my %Aktionen = ( neu    => &AddItem,
                 del    => &DelItem,
                );

my $todo = $q->param('action');
unless ($todo) { die 'Keine Aktion spezifiziert!' };
 
if ($Aktion{$todo}) { $Aktion{$todo}->() }
else                { die 'Keine gültige Aktion!' };


sub AddItem { ... }
sub DelItem { ... }

(Das Script setzt voraus, daß mit dem Parameter "action" eine gültige Aktion übergeben wurde.)

Schnipsel II: Die Sicherheit eines Scripts ist häufig ein wichtiger Faktor. Um einen Scriptfehler durch Pufferüberlauf o.ä. zu verhindern kann man mit folgenden Zeilen einige Fehler umgehen:

$CGI::POST_MAX = 1024 * 100;      # maximal 100K Postings
$CGI::DISABLE_UPLOADS = 1;        # keine Uploads

Ansonsten ist natürlich darauf zu achten, daß möglicht alle möglichen Aktionen mit allen möglichen Werten und Inhalten vom Script ver- oder bearbeitet werden sollten.

Schnipsel III:

... to be completed soon... ;-)

 


Drucken
letzte Änderung: 14.Feb 2012

rechte Spalte

Buchtips - mit und ohne Computer

Unter dem folgenden Link finden Sie eine Liste von Büchern, die ich für lesenswert halte.
Klicken Sie hier.