CGIHTTPServer führt unter Windows kein CGIs aus

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
ulrich1992
User
Beiträge: 42
Registriert: Montag 8. November 2010, 15:25
Wohnort: Braunschweig
Kontaktdaten:

Ich baue mir gerade einen einfachen Webserver mittels des Moduls CGIHttpServer.
Ich habe jetzt das Problem das wenn ich unter Windows versuche ein CGI Script auszuführen folgende Fehlermeldung kommt:

Error code 403.
Message: CGI script is not executable ('/cgi-bin/test.cgi').
Error code explanation: 403 = Request forbidden -- authorization will not help.


Unter OpenSolaris und Ubuntu Linux funktioniert es, (nach dem üblichen chmod 0755) hingegen wie es soll.
Die restlichen Serverfunktionen der Klasse funktionieren alle ohne Probleme unter Windows.
Ich hab mit Google gesucht und nichts zu meinem Problem gefunden.
Python Version ist 2.6.
Braucht ihr meinen Quellcode?
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Späte Antwort.

Windows weiß nicht wie er .cgi ausführen soll. Steht in der .cgi in der ersten Zeile ein: '#!/usr/......' ?

Das würde erklären warum Linux es kann. Versuch mal, wenn es sich um ein Python Script handelt, mit .cgi in .py umbennen. Oder ändere die erste Zeile auf die python.exe um z.B '#!C:/Python26/python.exe', ob dein Server das kann weiß ich nicht, wie es mit Leerzeichen aussieht auch nicht.
ulrich1992
User
Beiträge: 42
Registriert: Montag 8. November 2010, 15:25
Wohnort: Braunschweig
Kontaktdaten:

Sr4l hat geschrieben:Späte Antwort.

Windows weiß nicht wie er .cgi ausführen soll. Steht in der .cgi in der ersten Zeile ein: '#!/usr/......' ?

Das würde erklären warum Linux es kann. Versuch mal, wenn es sich um ein Python Script handelt, mit .cgi in .py umbennen. Oder ändere die erste Zeile auf die python.exe um z.B '#!C:/Python26/python.exe', ob dein Server das kann weiß ich nicht, wie es mit Leerzeichen aussieht auch nicht.
Das hab ich natürlich schon probiert:
Testscript abgespeichert im Ordner c:/www/cgi-bin/ als test.cgi

#!c:/Python26/python.exe
print "Content-Type: text/html"
print
print "Hallo Welt"


Aufruf http://localhost/cgi-bin/test.cgi
Ergebnis:

Error response
Error code 403.
Message: CGI script is not executable ('/cgi-bin/test.cgi').
Error code explanation: 403 = Request forbidden -- authorization will not help.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Dann solltest du mal nen minimal Beispiel vom Server veröffentlichen für weitere Hilfe.
ulrich1992
User
Beiträge: 42
Registriert: Montag 8. November 2010, 15:25
Wohnort: Braunschweig
Kontaktdaten:

Code: Alles auswählen

import sys, os, SocketServer, BaseHTTPServer, CGIHTTPServer, socket, time

class ThreadingCGIServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
    pass

DocumentRoot="c:/www/"
port=8080
os.chdir(DocumentRoot)
os.environ["DOCUMENT_ROOT"]=os.getcwd()

Handler=CGIHTTPServer.CGIHTTPRequestHandler
Handler.cgi_directories=['/cgi-bin', '/htbin']
try:
  httpd = ThreadingCGIServer(('',port), Handler)
  print "Server started"
except:
  print "Error:Can't bind to socket"
  sys.exit(0)

try:
  httpd.serve_forever()
except: 
  print "Server Stopped"
  sys.exit(0)
BlackJack

@ulrich1992: Sieht so aus als wenn der auf Port 8080 läuft, der steht bei Deiner Beispiel-URL aber nicht!? Kann es sein, dass Du einen anderen HTTP-Server am laufen hast und *der* diese Rückmeldung gibt?
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Unter Windows funktioniert das Interpretieren der ersten Zeile in der Datei nicht.
Wenn eine Dateiendung kein Programm zugeordnet ist wird es als nicht ausführbar gekennzeichnet.

Du kannst CGIHTTPHandler Monkey patchen, damit er noch andere Endungen Python zuordnet.

Code: Alles auswählen

import CGIHTTPServer
class CGIHTTPRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler):
    def is_python(self, path):
        """Test whether argument path is a Python script."""
        head, tail = os.path.splitext(path)
        return tail.lower() in (".py", ".pyw", ".cgi")
Handler=CGIHTTPRequestHandler
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

also ich kann den Fehler nachvollziehen, auch wenn man korrekt auf Port 8080 den Aufruf startet...

Gruß, noisefloor
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Nachtrag: Wenn man das CGI-Skript direkt in c:/www platziert funktioniert es. Bzw. es funktioniert nicht wirklich, weil, wie Sr4L sagt, unter Windows das CGI-Skript nicht ausgeführt wird. Aber es wird immerhin zum Download angeboten. ;-)

Gruß, noisefloor
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

hatte gerade das gleiche Problem (schon doof, wenn man Code von Linux auf Windows portieren muss ;-) ).

Es funktioniert, wenn die CGI-Skripte die Endung '.py' haben und _nicht_ '.cgi'. cgi wird scheinbar geblockt, weil Windows mit der Endung nichts anfangen kann, py ist für den Python Interpreter reserviert = bekannt.

Gruß, noisefloor
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Müsste es nicht eine Option für den PyCGIServer geben, welche Dateiendung welchen Interpreter ausführen??
LG Maik
Antworten