Supportnet / Forum / Skripte(PHP,ASP,Perl...)
Anfängerprobleme !
Frage
Hallo support'ler,
ich habe wie es aussieht ein kleines Anfänger-Problem mit Perl. Bin dabei gerade ein bisschen was über Perl zu lernen, nur funktioniert einiges nicht so wie es soll.
Als Server hab ich Sambar 6.0 mit ActivePerl 5.8...
Folgendes Problem:
Von einem HTML Dokument aus, soll ein Text an das Perl-Dokument übergeben, bearbeitet und dann wieder als HTML-Dokument ausgegeben werden.
Wenn ich nun die Texteingabe tätige und auf Absenden drücke wird zwar das Perl-Script laut Adressleiste aufgerufen, allerdings bekomme ich von Sambar im Browserfenster nur die Meldung "internal Server Error". In den Serverlogs steht auch nur, das ein CGI-Script nicht ausgeführt werden konnte.
Woran ich jetzt scheitere ist, dass andere Perl-Scripte wie die dumpenv.pl oder standard-Beispiele "Hallo-Welt" usw. funktionieren.
Nur bei Variablen-Übergabe funktioniert das nicht.
in der Config von Sambar wurde natürlich der Pfad zu Perl angegeben. Das PerlScript befindet sich auch im cgi-bin Verzeichnis und das HTML-File im docs. Andere Sambar Versionen habe ich auch schon probiert, daran liegts nicht.
P.S. Bitte keine Vorschläge wie "verwende doch Apache" usw. Ich mache das über eine Fernschule und da ist Sambar mit Active-Perl gefordert.
Wäre dankbar für jeden Tipp.
Falls ihrs braucht, kann ich auch noch die Codes der beiden Files hier posten.
Antwort 1 von semi
Wahrscheinlich hast Du vergessen den Response-Header auszugeben.
Füge folgendes am Anfang des Skriptes ein.
Gruß,
Michael
Füge folgendes am Anfang des Skriptes ein.
print "Content-type: text/html\n\n";Wichtig ist dabei, dass diese Anweisung vor allen anderen Ausgaben erfolgt.Gruß,
Michael
Antwort 2 von semi
Übrigens, es kann auch an Syntaxfehlern liegen.
Jage es mal durch den Syntaxcheck von Perl.
perl -c skript.pl
Jage es mal durch den Syntaxcheck von Perl.
perl -c skript.pl
Antwort 3 von Pinky
Ich kann mir nicht vorstellen, das im Perl Script selber der Fehler liegt, weil dieses ja von der Schule kommt. Trotzdem hier mal das Script:
#!/usr/bin/perl
# Das Script Hallo.pl
######################################################################
# Formularinhalt holen
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
# + Zeichen in Leerzeichen umwandeln und alle ASCII-Steuerzeichen
# beginnend mit % umwandeln.
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
$gast = "$FORM{'fullname'}";
print "Content-type: text/html\n\n";
print qq|
<HTML>
<HEAD>
<TITLE>Ausgabe</TITLE>
</HEAD>
<BODY>
<center>
<font face=\"Arial\" size=2>Hallo, $gast</font>\n";
</center>
</BODY>
</HTML>
|;
exit;
}
Im HTML-File gibts eigentlich nur eine wichtige Zeile:
<FORM ACTION="http://localhost/cgi-bin/hallo.pl" METHOD="POST">
Dann kommt nur ein kleines Textfeld mit Absende-Button.
#!/usr/bin/perl
# Das Script Hallo.pl
######################################################################
# Formularinhalt holen
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
# + Zeichen in Leerzeichen umwandeln und alle ASCII-Steuerzeichen
# beginnend mit % umwandeln.
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
$gast = "$FORM{'fullname'}";
print "Content-type: text/html\n\n";
print qq|
<HTML>
<HEAD>
<TITLE>Ausgabe</TITLE>
</HEAD>
<BODY>
<center>
<font face=\"Arial\" size=2>Hallo, $gast</font>\n";
</center>
</BODY>
</HTML>
|;
exit;
}
Im HTML-File gibts eigentlich nur eine wichtige Zeile:
<FORM ACTION="http://localhost/cgi-bin/hallo.pl" METHOD="POST">
Dann kommt nur ein kleines Textfeld mit Absende-Button.
Antwort 4 von semi
Alle anderen Skripte Laufen einwandfrei?
Ein Fehler fällt mir auf, wird aber nicht die Ursache für den Serverfehler sein. (Siehe Zeile mit font...)
So sollte es aussehen:
Ein internal Server Error (Errorcode: 500) kommt i.d.R. wenn perl nicht gestartet werden kann oder wenn das Skript keinen Header generiert.
Wie sieht es aus mit den Zugriffsrechten auf das cgi-bin Verzeichnis und auf das Skript?
Ist Perl bei Dir in /usr/bin/ (which perl auf der Console eingeben)
Mit dem Server Sambar kann ich leider nicht viel Anfangen.
Gruß,
Michael
Ein Fehler fällt mir auf, wird aber nicht die Ursache für den Serverfehler sein. (Siehe Zeile mit font...)
So sollte es aussehen:
<font face="Arial" size=2>Hallo, $gast</font>Ein internal Server Error (Errorcode: 500) kommt i.d.R. wenn perl nicht gestartet werden kann oder wenn das Skript keinen Header generiert.
Wie sieht es aus mit den Zugriffsrechten auf das cgi-bin Verzeichnis und auf das Skript?
Ist Perl bei Dir in /usr/bin/ (which perl auf der Console eingeben)
Mit dem Server Sambar kann ich leider nicht viel Anfangen.
Gruß,
Michael
Antwort 5 von Pinky
Ok, mit der Zeile hast du recht. Hab mittlerweile von Seiten der Schule auch schon eine Korrektur gefunden. Deswegen funktionierts aber immer noch nicht.
Zugriffsrechte sind doch relativ, ich mach das ja auf einem Lokalen Server, nicht auf einem Webserver. Schreibschutz usw. ist raus.
Das Original-Perl von Sabar ist im /usr/bin/-Verzeichnis, allerdings ist das eine Alte Version. Ich hab Active Perl installiert und verweise Sambar auf diese Perl.exe.
Da ich jetzt natürlich ständig rumprobiere bin ich noch auf ein anderes Phänomen gestossen, vielleicht hängt das ja auch damit zusammen:
Im Sambar Server kann ich CGI-Extensions für das cgi-bin und win-cgi Verzeichnis vorgeben. (also z.B. *.cgi *.pl *.exe). Wenn ich das aber eintrage läuft überhaupt kein pl-Script mehr (Internal System Error).
Langsam bin ich echt am Verzweifeln.
Zugriffsrechte sind doch relativ, ich mach das ja auf einem Lokalen Server, nicht auf einem Webserver. Schreibschutz usw. ist raus.
Das Original-Perl von Sabar ist im /usr/bin/-Verzeichnis, allerdings ist das eine Alte Version. Ich hab Active Perl installiert und verweise Sambar auf diese Perl.exe.
Da ich jetzt natürlich ständig rumprobiere bin ich noch auf ein anderes Phänomen gestossen, vielleicht hängt das ja auch damit zusammen:
Im Sambar Server kann ich CGI-Extensions für das cgi-bin und win-cgi Verzeichnis vorgeben. (also z.B. *.cgi *.pl *.exe). Wenn ich das aber eintrage läuft überhaupt kein pl-Script mehr (Internal System Error).
Langsam bin ich echt am Verzweifeln.
Antwort 6 von semi
Hee?!? Sehe ich da etwa Perl.exe? :-)
Warum sagst Du nicht gleich, dass es unter Windoof ausgeführt wird?
Unter Windows muß die erste Zeile im Skript wie folgt aussehen
#! \pfad\zu\perl\bin\perl.exe
Achte darauf, dass das Leerzeichen zwischen ! und der Pfadangabe vorhanden ist. Außerdem verwende Backslash in Pfadangaben.
Falls der Server auf einem anderen Laufwerk installiert ist als ActivePerl, dann mußt Du noch den Laufwerksbuchstaben davor setzen.
z.B.
#! d:\pfad\zu\perl\bin\perl.exe
Jetzt aber :-)
Gruß,
Michael
Warum sagst Du nicht gleich, dass es unter Windoof ausgeführt wird?
Unter Windows muß die erste Zeile im Skript wie folgt aussehen
#! \pfad\zu\perl\bin\perl.exe
Achte darauf, dass das Leerzeichen zwischen ! und der Pfadangabe vorhanden ist. Außerdem verwende Backslash in Pfadangaben.
Falls der Server auf einem anderen Laufwerk installiert ist als ActivePerl, dann mußt Du noch den Laufwerksbuchstaben davor setzen.
z.B.
#! d:\pfad\zu\perl\bin\perl.exe
Jetzt aber :-)
Gruß,
Michael
Antwort 7 von Pinky
Also ich hab ja gelernt, dass die sh-bang-Zeile unter Windows entfallen kann, weil sie nur für Unix-Systeme von Bedeutung ist. Trotz alledem hab ich das natürlich schon ausprobiert, leider ohne Erfolg.
Ich kann wie du oben beschreibst auf die Active-Perl exe oder auch auf die Sambar-eigene Perl.exe verweisen.
Es bringt alles nichts.
Ausserdem funktionieren ja andere Perl Scripte wie z.B. dumpenv.pl. Also kanns ja eigentlich nicht an den Pfadangaben liegen.
Ich blicks langsam echt nicht mehr.
Ich kann wie du oben beschreibst auf die Active-Perl exe oder auch auf die Sambar-eigene Perl.exe verweisen.
Es bringt alles nichts.
Ausserdem funktionieren ja andere Perl Scripte wie z.B. dumpenv.pl. Also kanns ja eigentlich nicht an den Pfadangaben liegen.
Ich blicks langsam echt nicht mehr.
Antwort 8 von semi
Versuche mal die GET Methode.
Wie ich schon schrieb, den Sambar Server kenne ich nicht.
Der Fehler kann viele Ursachen haben.
Vielleicht findest Du im FAQ-Forum des Herstellers paar Infos.
Sorry, mehr fällt mir dazu nicht ein. Dein Skript ist vollkommen korrekt.
Gruß,
Michael
$buffer = $ENV{'QUERY_STRING'};
...
# Rest des Skriptes
Vergiss nicht auch im Formular method="get" einzustellen.Wie ich schon schrieb, den Sambar Server kenne ich nicht.
Der Fehler kann viele Ursachen haben.
- Der Server kriegt die Eingabeumleitung nicht hin (könnte der Fall sein, wenn die GET-Methode funktioniert, POST aber nicht)
- Das temporäre Verzeichnis für die Ausgabeumleitung ist falsch eingestellt, wenn überhaupt vorhanden. (eher unwahrscheinlich, da andere Skripte laufen)
- Server ist ein 16Bit Prozess und versucht ein 32Bit Prozess zu kontrollieren (Perl.exe)
Übrigens, versuche mal wperl.exe statt "perl.exe".
Vielleicht findest Du im FAQ-Forum des Herstellers paar Infos.
Sorry, mehr fällt mir dazu nicht ein. Dein Skript ist vollkommen korrekt.
Gruß,
Michael
Antwort 9 von semi
Hier vielleicht noch eine Bemerkungen von der folgenden Seite http://www.sambar.com/session/highlight?url=/syshelp/cgi.htm&words=...
Zitat:
May CGI/WinCGI applications especially 16-bit applications or Perl applications that perform file i/o based on the installation directory will not run if there are spaces in the directory path. To execute properly, the Sambar Server must be moved to a directory that has not spaces.
Klartext: Wenn der Server oder Perl irgendwo Leerzeichen im Pfad haben, dann läuft nix.May CGI/WinCGI applications especially 16-bit applications or Perl applications that perform file i/o based on the installation directory will not run if there are spaces in the directory path. To execute properly, the Sambar Server must be moved to a directory that has not spaces.
Antwort 10 von Pinky
Ok, wenn ich wie du angibst die GET-Methode verwende habe ich folgende Zeile in der Adressleiste:
http://localhost/cgi-bin/hallo.pl?fullname=meineeingabe, im Browserfenster wieder "Internal System Error".
Verwende ich die wperl.exe selbes Ergebnis.
Ich gebs jetzt auf. Hab mir erstmal nen Webspace mit Perl/Cgi gesucht, werds dann da mal probieren oder mal Apache installieren.
http://localhost/cgi-bin/hallo.pl?fullname=meineeingabe, im Browserfenster wieder "Internal System Error".
Verwende ich die wperl.exe selbes Ergebnis.
Ich gebs jetzt auf. Hab mir erstmal nen Webspace mit Perl/Cgi gesucht, werds dann da mal probieren oder mal Apache installieren.
Antwort 11 von Pinky
So, Apache installiert, die 2 Dateien reinkopiert und schätzt mal .....
funktioniert einwandfrei.
Ich sag jetzt nix mehr zu Sambar, das ist bei mir unten durch.
Danke trotzdem für eure Bemühungen !
funktioniert einwandfrei.
Ich sag jetzt nix mehr zu Sambar, das ist bei mir unten durch.
Danke trotzdem für eure Bemühungen !

