CGI mit Perl -

Der klassische Weg zu dynamischen Webseiten

 

 

Stefan Sell, tes@tursa.franken.de

KNF-Kongreß 26.11.2000

 

$Revision: 1.3 $


Was passiert beim Aufruf einer Webseite?


"Statisches" HTML


Was sind "dynamische" Webseiten?


Was bedeutet CGI (Common Gateway Interface)?


Beispiel-Anwendungen für CGI


CGI im Vergleich


Welche Programmiersprache für CGI?


Einfaches Beispiel

"Hello World" per CGI mit Perl:

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<HTML><HEAD><TITLE>\n";
print "Hello World!\n";
print "</TITLE></HEAD><BODY>\n";
print "Hello World! " . `date '+%d.%m.%y %H:%M:%S'` . "\n";
print "</BODY></HTML>\n";


Web-Server


Lokaler Web-Server


CGI-Skripte auf www.franken.de


Hochladen von CGI-Skripten auf www.franken.de

Als Beispiel mit der WWW-Userkennung "w3tursa" und dem Standard FTP-Client:

tes@tursa.franken.de:~/www/cgi-bin> ftp ftp.franken.de
Connected to ilsa.franken.de.
...
220 ProFTPD 1.2.0 Server (KNF ftp Server) [ilsa.franken.de]
Name (ilsa.franken.de:tes): w3tursa
331 Password required for w3tursa.
Password: XXXXXXXX
230 User w3tursa logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir cgi-bin
257 "/cgi-bin" - Directory successfully created.
ftp> chmod og-rw cgi-bin
200 SITE CHMOD command successful.

...

ftp> cd cgi-bin
250 CWD command successful.
ftp> asc
200 Type set to A.
ftp> put hello.cgi
local: hello.cgi remote: hello.cgi
200 PORT command successful.
150 Opening BINARY mode data connection for hello.cgi.
226 Transfer complete.
341 bytes sent in 0.00402 secs (83 Kbytes/sec)
ftp> chmod 0755 hello.cgi
200 SITE CHMOD command successful.

Das Skript kann nun unter der URL http://www.franken.de/users/tursa/cgi-bin/hello.cgi aufgerufen werden.

Daneben gibt es auch diverse komfortablere grafische FTP-Clients für verschiedene Plattformen.


CGI-Skripte auf shell.franken.de


Aufruf von CGI-Skripten aus HTML

Ein CGI-Script kann aus einer HTML-Datei heraus auf verschiedene Arten aufgerufen werden:


CGI-Umgebungsvariablen


Formulare


Beispiel-Formular: Einfache Eingabe

simpleform.html:

<HTML><HEAD>
<TITLE>Kommentar</TITLE>
</HEAD><BODY>

<FORM action="cgi-bin/simplefile.cgi" method=get>
<p>Geben Sie bitte ihren Kommentar ein:</p>
<TEXTAREA name="Kommentar" rows="10" cols="50">
</TEXTAREA><BR>
<INPUT type=submit value="Absenden">
</FORM>

</BODY></HTML>

Das entsprechende HTML-Formular kann unter der URL http://www.franken.de/users/tursa/simpleform.html aufgerufen werden.


Beispiel: Benutzereingabe in Datei speichern

simplefile.cgi:

#!/usr/bin/perl
$get_meth = $ENV{'REQUEST_METHOD'};
if ($get_meth eq "POST") {
    $data = <STDIN>; chomp $data;
} elsif ($get_meth eq "GET")    {
    $data = $ENV{'QUERY_STRING'};
}

# Initialisierungen:
$cntfile = "simplecnt";
$msgnr=0;
# Zählerdatei einlesen, wenn vorhanden:
if (-s $cntfile) {
    open (CNT, "<$cntfile");
    $msgnr=<CNT>; close (CNT);  }
$msgnr++;

# Eintrag schreiben:
open (ENTRY, ">simple${msgnr}.ent");
print ENTRY "$data";
close (ENTRY);

# Zählerdatei aktualisieren:
open (CNT, ">$cntfile");
print CNT "$msgnr\n";
close (CNT);

# HTML Ausgeben:
print "Content-type: text/html\n\n";
print "<HTML><HEAD><TITLE>\n";
print "Ihre Daten wurden verarbeitet\n";
print "</TITLE></HEAD><BODY>\n";
print "Ihre Daten wurden verarbeitet. ";
print "Sie hatten die Nummer ". $msgnr . "\n";
print "</BODY></HTML>\n";


Beispiel: Eingelesene Formulardaten als Mail versenden (1)

simplemail.cgi mit Perl-SMTP-Modul (für www.franken.de):

#!/usr/bin/perl
use Net::SMTP;
$mailto = "tes\@tursa.franken.de";

$get_meth = $ENV{'REQUEST_METHOD'};
if ($get_meth eq "POST") {
    $data = <STDIN>; chomp $data;
} elsif ($get_meth eq "GET")    {
    $data = $ENV{'QUERY_STRING'};
}

$smtp = Net::SMTP->new("mail-n.franken.de");
$smtp->mail($mailto);
$smtp->to($mailto);
$smtp->data();
$smtp->datasend("To: " . $mailto . "\n");
$smtp->datasend("From: CGI Skript\n");
$smtp->datasend("Subject: Hello\n\n");
$smtp->datasend("$data\n");
$smtp->dataend();
$smtp->quit;

print "Content-type: text/html\n\n";
print "<HTML><HEAD><TITLE>\n";
print "Ihre Daten wurden verarbeitet\n";
print "</TITLE></HEAD><BODY>\n";
print "Ihre Daten wurden verarbeitet. \n";
print "</BODY></HTML>\n";

Das entsprechende HTML-Formular kann unter der URL http://www.franken.de/users/tursa/simplemail.html aufgerufen werden.


Beispiel: Eingelesene Formulardaten als Mail versenden (2)

simplemail.cgi mit sendmail (nicht für www.franken.de, aber z.B. für andere Web-Server):

...

open  (MAIL, "|/usr/sbin/sendmail " . $mailto)
    || die "Can't open /usr/lib/sendmail!\n";

print MAIL "From: CGI Skript\n";
print MAIL "To: " . $mailto . "\n";
print MAIL "Subject: Hello\n\n";
print MAIL "$data\n");
close(MAIL);

...


Testen/Debuggen


Weiterführende Links