Sie sind nicht angemeldet.

  • »koepke« ist männlich
  • »koepke« ist der Autor dieses Themas

Beiträge: 14

Registrierungsdatum: 29.09.2013

Derivat: Ubuntu

Architektur: 64-Bit PC

Desktop: Unity

  • Nachricht senden

1

31.01.2015, 14:09

Apache2 führt perlscripte nicht aus

Hallo Leute,

ich möchte Perlscripte auf meinem Rechner (Ubuntu 12.04LTS) ausführen. Die Testdateien test.pl und test.cgi liegen bei mir unter /var/www. Die Testdateien ließen sich anfangs nicht auf der Konsole starten, also habe ich perl nachinstalliert. Es läuft lt. perl -h die Version Perl 5 / version 14 / (v5.14.2). Jetzt kann ich die testscripte starten, auch wenn sie inhaltlich noch nicht wirklich funktionieren.

Den Webserver Apache2 habe ich inzwischen auch installiert, er läuft: apache2 -v ergibt: Apache/2.2.22.
Wenn ich in meinem Browser http://localhost aufrufe erhalte ich auch das typische "It works!". Als nächstes habe ich in diese index.html-datei links zu den testscripten eingebaut. Wenn ich diese jetzt anklicke, dann erhalte ich
"Forbidden
You don't have permission to access /test.cgi on this server."
Dem Verzeichnis /var/www habe ich inzwischen die Berechtigung rwxrwxrwx zugeteilt. Ebenso den den Dateien test.pl und test.cgi. Also habe ich die Testdateien kopiert und in den Pfad /usr/lib/cgi-bin kopiert. Zusätzlich in meine index.html zwei weitere Links darauf gesetzt. Wenn ich diese jetzt aufrufe erhalte ich die Meldung:
"Not found
The requested URL /usr/lib/cgi-bin/test.pl was not found on this server"
Inzwischen habe ich in die ehemals leere Datei /etc/apache2/httpd.conf folgendes eingefügt:

Quellcode

1
2
3
4
<Directory /var/www>
Options +ExecCGI
AddHandler cgi-script .cgi .pl
</Directory>



Und das gleiche nochmal für das Verzeichnis /usr/lib/cgi-bin Keine Änderung! Da ich sowohl ein Rechteproblem wie auch ein "Finde die Datei nicht"-Problem habe, tippte ich auf eine unvollständige/fehlerhafte
Konfiguration in /etc/apache2/apache2.conf? Ich finde dort für mich keinen Ansatzpunkt der zu meinem Problem passt.
Habt ihr einen Tipp in welche Richtung ich suchen muss? ?(

Viele Grüße
Siegfried

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »koepke« (07.02.2015, 17:35)


2

31.01.2015, 17:28

Habt ihr einen Tipp in welche Richtung ich suchen muss?
Ja, in dieser -> http://httpd.apache.org/docs/2.2/howto/cgi.html
Müsste sogar auf deinem eigenen Rechner unter http://localhost/manual/de/howto/cgi.html zu finden sein...

Deine Lösungsansätze solltest du schnell wieder verwerfen. Allen voran diesen, das ist schlechter Stil und bringt -wie du siehst- überhaupt nichts:
Dem Verzeichnis /var/www habe ich inzwischen die Berechtigung rwxrwxrwx zugeteilt. Ebenso den den Dateien test.pl und test.cgi.


ein Rechteproblem wie auch ein "Finde die Datei nicht"-Problem
Weder noch.
mir is wurscht

  • »koepke« ist männlich
  • »koepke« ist der Autor dieses Themas

Beiträge: 14

Registrierungsdatum: 29.09.2013

Derivat: Ubuntu

Architektur: 64-Bit PC

Desktop: Unity

  • Nachricht senden

3

02.02.2015, 19:04

Hallo Fredl,

sorry für die kurze Unterbrechung - das Real Life hat mich benötigt ;) So.

Wennn ich die Vorgaben aus dem Apache Tutorial in meine httpd.conf aufnehme, also Eintragen von
LoadModule cgi_module modules/mod_cgi.so
dann 'meckert' Apache nach einem reload "[warn] module cgimodule is already loaded, skipping"
Also hatte ich das bereits wieder in der httpd.conf auskommentiert - aber es zeigt ja das die Datei auf verarbeitet wird.

Die Sache mit der Vorgabe zu den ScriptAliasen habee ich bei mir wie folgt umgesetzt:
# Variante A
ScriptAlias /cgi-bin/ /var/www/
Weil in /var/www zur Zeit meine testscripte liegen. Ich hatte auch schon folgendes probiert:
# variante B
ScriptAlias /usr/lib/cgi-bin/ /var/www/
Weil das ja der komplette Pfad zu dem cgi-bin-Verzeichnis ist. Interessant war dabei folgendes:

Beide Varianten (A & B) führen nach einem Reload nicht zu einer Fehlermeldung auf der Konsole - toll.
Aber: Bei Variante A erhalte ich bei einem Aufruf von
/var/www/test.pl --> "Forbidden ..."
und bei
/usr/lib/cgi-bin/test.pl "Not found ..."

Und bei Variante B
/var/www/test.pl ---> "Forbidden ..."
und bei
/usr/lib/cgi-bin/test.pl ---> "Internal Server Error ..."

Übrigens gibt es in meinem Verzeichnis /etc/apace2/ eine Konfigurationsdatei mit dem Namen apache2.conf. Diese wiederrm ruft die httpd.conf (mit den user configurations) auf.

Ich habe nochmal etwas anders probiert: Wenn ich in das Verzeichnis /var/www/ (in der auch die Scripte test.pl und test.cgi liegen, eine einfache Datei test.txt lege, wird diese anstandslos aufgerufen und im Browser angezeigt. Das heißt doch, daß die Anforderung des Browser auf die Datei erlaubt wird - ihm also die entsprechenden Rechte zugesprochen sind.

Der Versuch ein Script aufzurufen endet mit "Forbidden ... You don't have permission to access /test.pl
on this server." Ich muss also die Frage klären:
  • Warum habe ich nicht das Recht auf die test.pl zuzugreifen oder
  • Habe ich nicht das Recht die Ausführung des Scriptes test.pl anzufordern oder darf der
  • Interpreter perl nicht auf die Datei test.pl zugreifen.
Ich finde das Prinzip mit der Rechtevergabe in Linux eigentlich okay, aber so langsam... steigt mein Blutdruck an ... :cursing:

Viele Grüße
Siegfried

4

02.02.2015, 19:41

bei einem Aufruf von
/var/www/test.pl
Wie meinst du das genau mit "Aufruf von..."?
"http://localhost/var/www/test.pl" im Browser oder wie?

Nach deiner Variante A wäre "http://localhost/cgi-bin/test.pl" zumindest hitverdächtig.
Nach Variante B "http://localhost/usr/lib/cgi-bin/test.pl". Der "Internal Server Error ..." wäre demnach ein gutes Zeichen, denn er zeigt, daß sich was tut. ;) (Vermutlich baut das Script einen Crash.)

Ist test.pl ausführbar?
mir is wurscht

  • »koepke« ist männlich
  • »koepke« ist der Autor dieses Themas

Beiträge: 14

Registrierungsdatum: 29.09.2013

Derivat: Ubuntu

Architektur: 64-Bit PC

Desktop: Unity

  • Nachricht senden

5

02.02.2015, 20:28

Die Scripte sehen so aus (von Inhalt):

Quellcode

1
2
3
4
5
6
7
8
9
#!/user/bin/perl -w

use strict;

print "Content-type: text/html\n\n”;
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n;
print "<h1>Hurra, es klappt!</h1>\n;
print "</body></html>\n;


Die Zugriffsrechte sind rwxrwxrwx, die Dateien gehören dem user www-data in der Gruppe www-data.

Jetzt rufe ich die Datei index-html (liegt auf dem Server) im Browser (auf einem Clientrechner) auf, durch Eintippen von 192.168.1.102. Die index.html sieht so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
	<body>
		<h1>It works!</h1>
		<p>This is the default web page for this server.</p>
		<p>The web server software is running but no content has been added, yet.</p>
		<p>...</p>
		
		<h2>Scripte liegen unter /var/www/</h2>
		<p><a href="test.pl">Hier geht es zum Test  ... (test.pl)</a></p>
		<p><a href="test.cgi">Hier geht es zum Test  ... (test.cgi)</a></p>
		<p><a href="wetter.cgi">Hier geht es zum Wetter... (wetter.cgi)</a></p>
		<p>...</p>

		<h2>Scripte liegen unter /user /lib/cgi-bin/...</h2>
		<p><a href="/usr/lib/cgi-bin/test.pl">Hier geht es zum Test  ... (test.pl)</a></p>
		<p><a href="/usr/lib/cgi-bin/test.cgi">Hier geht es zum Test  ... (test.cgi)</a></p>
		<p><a href="/usr/lib/cgi-bin/wetter.cgi">Hier geht es zum Wetter... (wetter.cgi)</a></p>
		<p>...</p>
		<p>Externer Link</p>
		<a href="http://www.tagesschau.de/">ARD Tagesschau</a> Nachrichten<br>
	</body>
</html>


Wenn ich jetzt den Link test.pl anklicke erhalte ich als Ergebnis:
Forbidden ... You don't have permission to access /test.pl on this server.

Wenn ich jetzt den Link test.cgi anklicke erhalte ich als Ergebnis (die scriptdatei - immerhin!):

Quellcode

1
2
3
4
5
6
7
8
9
#!/usr/bin/perl -w

use strict;

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n;
print "<h1>Hurra, es klappt!</h1>\n";
print "</body></html>\n";


Der entsprechende Abschnitt in der httpd.conf sieht inzwischen so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<IfModule alias_module>
    	ScriptAlias /cgi-bin/ "/var/www/"
    	<Location /cgi-perl>
            	SetHandler perl-script
            	PerlResponseHandler Modperl::PerlRun
            	PerlOptions +ParseHeaders
            	Options +ExecCGI
    	</Location>
</IfModule>

<Directory "/var/www">
    	AllowOverride None
    	Options None
    	Options +ExecCGI
    	Order allow,deny
    	Allow from all
    	AddHandler cgi-script .cgi .pl
</Directory>

<Directory "/usr/lib/cgi-bin">
    	AllowOverride None
    	Options None
    	Options +ExecCGI
    	Order allow,deny
    	Allow from all
    	AddHandler cgi-script .cgi .pl
</Directory>



P.S. Unter http://aktuell.de.selfhtml.org/artikel/server/apacheconf/ gibt es eine dt. Anleitungzu r httpd.conf - Ich habe das Thema <Directory> ausprobiert konnte aber keine wesentliche verbesserung erzielen. Also die httpd.conf wird von Apache bearbeitet, aber offensichtlich stehen nicht die richtigen Kommandos drin...?


Gruß
Siegfried

  • »koepke« ist männlich
  • »koepke« ist der Autor dieses Themas

Beiträge: 14

Registrierungsdatum: 29.09.2013

Derivat: Ubuntu

Architektur: 64-Bit PC

Desktop: Unity

  • Nachricht senden

6

04.02.2015, 20:08

Hallo,

vielen Dank für die letzten Tipps. Inzwischen bin ich (mit viel Rumgesuche im Netz) auf diese Geschichte mit den "sites" und den "Virtuellen Hosts" gestossen - das wird wohl die Richtung sein in der die Lösung zu finden ist. Muss mich da jetzt erstmal reinlesen (damit ich verstehe worum es eigentlich geht...).

Und komme dann wahrscheinlich mit weiteren, hoffentlich schlaueren Fragen...

PS.: Eigentlich wollte ich nur Wetterdaten über den Server verfügbar machen, jetzt werde ich noch zum Konsolenfreak....

Windige Grüße
Siegfried

7

05.02.2015, 01:41

Muss mich da jetzt erstmal reinlesen (damit ich verstehe worum es eigentlich geht...).

Kann nie schaden ;)

Hier ein bisschen was zum inspizieren:
<Location /cgi-perl>
Diesen Pfad gab's bis dato nicht.

(Vermutlich baut das Script einen Crash.)
Könnte z.B. daran liegen:

Quellcode

1
2
3
print "<html><head><title>Test-Ausgabe</title></head><body>\n; 
print "<h1>Hurra, es klappt!</h1>\n; 
print "</body></html>\n;
Da fehlen abschließende Quotes. Sowas nehmen Interpreter sehr ernst.
mir is wurscht

  • »koepke« ist männlich
  • »koepke« ist der Autor dieses Themas

Beiträge: 14

Registrierungsdatum: 29.09.2013

Derivat: Ubuntu

Architektur: 64-Bit PC

Desktop: Unity

  • Nachricht senden

8

07.02.2015, 16:22

Meanwhile....

Inzwischen habe ich auf Ubuntu von 12.04 LTS auf 14.04 LTS aufgestockt und der Apache läuft jetzt in der Version 2.4.7 mit perl 5 Version 18.

Und damit habe ich nochmal von vorne begonnen. Also:

Perl läuft (einfache scripte, mit nano geschrieben, ausführbar gemacht, auf der Konsole aufgerufen).
Apache (2.4) läuft. Eine httpd.conf gibt es hier nicht mehr. Konfiguriert wird zum einen über /etc/apache2/apache2.conf und zum anderen über die Datei: /etc/apache2/sites-enabled/000-default.conf.

Die Reihenfolge in der sich Apache die Konfigurationsschnipsel holt ist: Erst apache2.conf und als letztes die 000-default.conf.

In apache2.conf gibt es folgende Festlegung für das Verzeichnis .../www und alle darunterliegenden Verzeichnisse (Zeile 2 und 4 habe ich eingefügt):

Quellcode

1
2
3
4
5
6
7
<Directory /var/www/>
  	AddHandler cgi-script .cgi .pl
  	Options Indexes FollowSymLinks
  	Options +ExecCGI
  	AllowOverwride None
  	Require all granted
</Directory>


Und in der 000-default.conf existieren folgende Vorgaben (Zeile 3 habe ich um +ExecCGI erweitert):

Quellcode

1
2
3
4
5
6
ScriptAlias /cgi-bin/	/var/www/html/
<Direktory  /var/www/html>
  	AllowOverride None
  	Options +ExecCGI - MultiViews +SymLinksIfOwnerMatch
  	Requires all granted
</Directory>


Im Verzeichnis /var/www/html liegen nun zwei Scripte (inzwischen ohne Fehler und mit vollständigen Quotes....) mit identischem Inhalt:

Mit der aktuellen Konfiguration erhalte ich dann gleich zwei Fehlermeldungen wenn ich eine der beiden Scripte über den Webbrowser eines im Netz laufenden Rechners aufrufe:
... [cgi:error] [pid 19765] [client 19.168.1.106] AH01215: Undefined subroutine &main::header called at /var/www/html/test,cgi line 4., referer: http://192.168.1.101/
... [cgi:error] [pid 19765] [client 19.168.1.106] End of script output before headers: test,cgi, referer: http://192.168.1.101/

Die Fehler interpretiere ich als Hinweis darauf daß Apache mit der Bearbeitung des Scriptes beginnt und dann Problem bekommt...

Quellcode

1
2
3
4
5
6
7
8
#!/usr/bin/perl -w
use strict;
use CGI;
print header();
print "Content-type: text/plain;charset=utf-8\n\n";
print "<html><head><title>Test-Ausgabe</title><//head>\n";
print "<body><h1>Hurra, es klappt!</h1>/body></html>\n";
exit;


Wenn ich jetzt
  • Zeile 4 "print header()" aus den Files entferne und
  • in der 000-default.conf die Option "SymLinksIfOwnerMatch" entferne un
  • im testscript "text/plain..." durch "text/html" ersetze,
dann funktioniert der Aufruf der Perlscripte test.cgi und test.pl anstandslos! :thumbsup:
Vermutlich könnte ich die beiden Directory-Direktiven noch clever zusammenführen - es sieht schon etwas gewurschtelt aus. Jetzt muss ich nur noch mein eigentliches perlscript wetter.cgi hier zum Laufen bringen...

An dieser Stelle erstmal allen ein DANKE :thumbup: für die Unterstützung!

Grüße
Siegfried

  • »koepke« ist männlich
  • »koepke« ist der Autor dieses Themas

Beiträge: 14

Registrierungsdatum: 29.09.2013

Derivat: Ubuntu

Architektur: 64-Bit PC

Desktop: Unity

  • Nachricht senden

9

12.02.2015, 17:25

Nachtrag:
Jetzt funktioniert tatsächlich alles. Wer die Wetterstation sehen will gibt in seine Adresszeile im Browser "http://windwetter.dlinkddns.com/" oder "31.16.57.5" ein.
Grüße
Siegfried

10

13.02.2015, 14:00

Na bitte, sieht doch nicht schlecht aus. :thumbup:

Vermutlich könnte ich die beiden Directory-Direktiven noch clever zusammenführen
Momentan dürfte das nicht viel bringen, denn wenn die wörtlich so aussehen wie hier, ist die zweite nicht nur unnötig, sondern wird auch gar nicht verwendet. Du solltest dir die Apache-Logs ansehen. (Tipp: suche nach "Direktory"...)

Alles was da drin steht, hast du in der ersten Direktive schon festgelegt, und zwar wie du selber sagst:
für das Verzeichnis .../www und alle darunterliegenden Verzeichnisse

Zusätzlich ist der Script-Alias nutzlos, wenn die Scripte in einem anderen Verzeichnis liegen und dort auch ausgeführt werden. Was übrigens nicht Sinn der Sache ist, deshalb auch die Existenzberechtigung von "Script-Alias" und eigens dafür vorgesehenen Verzeichnissen.

In den Logs wirst du auch Hinweise auf diverse Typos hier und dort finden... ;)
Z.B.:
Options +ExecCGI - MultiViews +SymLinksIfOwnerMatch


Undefined subroutine &main::header
Dafür fehlt wahrscheinlich das entsprechende Perl-Modul. Wie du siehst brauchst du es aber ohnehin nicht, da du die Header ja eh selber schreiben lässt.

Dein HTML-Code könnte ein bisschen Nacharbeit vertragen:
print "<html><head><title>Test-Ausgabe</title><//head>\n";
print "<body><h1>Hurra, es klappt!</h1>/body></html>\n";
Gut, daß die meisten Browser, dank M$ sehr tolerant sind...

Und als nächstes Kapitel wäre dann "Absichern eines Webservers" angesagt. :whistling:
mir is wurscht