cgi + os.system = error (xampp, win)

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Zack
User
Beiträge: 47
Registriert: Dienstag 24. April 2007, 11:19

Ich möchte ein Python script über cgi ausführen. Leider gibt os.system mir immer nur ne "1" zurück, statt das script auszuführen. Beim direkten ausführen über cmd läuft es wunderbar, aber in verbindung mit dem cgi script über den apache(xampp) lässt sichs nicht starten. Das auszuführende Script ist ein builder zum compelieren von pascal-sources. Ich denke es liegt an dem cgi script oder an den apache confs. Bei beiden weiß ich aber leider nicht was zu so einem Problem führt.

cgi-script:

Code: Alles auswählen

#!C:\Programme\xampp\python\python.exe
import sys, os, traceback, cgi
sys.stderr = sys.stdout

def main():
	sys.stderr = sys.stdout
#	os.chdir(os.path.join("D:\","workdir","builder","Python"))
	print "Content-type: text/html\n\n"
	form = cgi.FieldStorage()	#parse query
	if form.has_key("build") and form["build"].value != "":
		print os.system("D:\\workdir\\builder\\Python\\builder.py "+ form["build"].value)
		print
		print "<h1> Build-Script </h1><br>"
		print "Script is starting: build.py ", form["build"].value, "<br>"
		print form["name"].value, ", thank you for using this Script <br>"
	else:
		print "<h1> Error! Please Enter Parameter.</h1>"
main()
index.html:

Code: Alles auswählen

<form method="POST" action="http://localhost/cgi-bin/loader.cgi">
	<p>build.py <input type="text" name="build" value="">
	<p>Click here to submit form: <input type="submit" value="Yeah!">
	<input type="hidden" name="session" value="1f9a2">
</form>
Result:

Code: Alles auswählen

1
Build-Script

Script is starting: build.py Simulator ConsoleCoach all
sdf , thank you for using this Script 
Ich hoffe jemand weiß Rat. Danke im Vorraus.

mit freundlichem Gruß
Zack
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Zack!

Nimm statt ``os.system`` ``subprocess.Popen``. Beispiele dafür findest du genug hier im Forum und im Wiki. http://wiki.python.de/

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

@Zack: Warum machst du das überhaupt über os.system/subprocess? Warum importierst du nicht builder.py und benutzt es direkt?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Zack
User
Beiträge: 47
Registriert: Dienstag 24. April 2007, 11:19

Mit subprocess.popen führt es leider auch zu keinem Erfolg. Nach dem absenden/übergeben der Parameter an das cgi-Script, kommt nur ein "Warten auf localhost...". Das gleiche passiert übrigends, wenn ich statt dem builder.py einfach netstat oder notepad ausführen will.
@jens: Der builder.py führt aber ebenfalls andere Prozesse aus. Damit wäre das Problem weiterhin bestehend, auch wenn es dann etwas eleganter wäre.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das ist ein generelles Problem, mit subprocess/os.system und blockierenden Ausgaben der Programme. Es hat also nicht direkt was mit CGI zu tun...

Versuche das gleiche erstmal mit einem lokalen Skript.

Schau mal hier:
http://www.python-forum.de/topic-2875.html
http://www.python-forum.de/topic-4941.html

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Code: Alles auswählen

>>> import subprocess
>>> args = ["cmd", "/C", "dir", "J:\\", "/O", "/AD", "/B"]
>>> process = subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
>>> print process.stdout.read()
Ablage
Apache
CanoScan
cygwin
Dokumente und Einstellungen
Karrigell
KDE
MinGW
MoinMoin
Office10
PROG
program files
Programme
Python24
Python25
RECYCLER
Sicherungen
System Volume Information
WINDOWS
xampp
Zope-Instance

>>>
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Zack
User
Beiträge: 47
Registriert: Dienstag 24. April 2007, 11:19

Danke erstmal für die Hilfe.
Soweit startet mein Script schon mal und gibt die Ausgabe im Browser wieder.
Leider bricht er bei bestimmten Python-Kommandos aus mir unerfindlichen Gründen immer ab.

Ab Zeile 13 geht's nicht mehr weiter. Ich kann nicht ganz nachvollziehen, was mir den "Zugriff verweigert".

Code: Alles auswählen

Import win32net
remote = {}
for x in os.popen('netstat').readlines():
    i = x
    if (i.find(":3389") > 0):
        if not (i.find(":3389") > i.find(":")):
            remote["ip"] = i[i.find(":3389")+5:i.rfind(":")].strip()
            remote["port"] = i[i.rfind(":")+1:i.rfind(":")+6].strip()

if not remote.has_key("ip"):
    remote = {'ip': '127.0.0.1', 'port': '0'}

remote["info"] = win32net.NetWkstaGetInfo(remote["ip"],100)
(Die Code-Passage speichert die Daten des Remote-Clients, sofern einer verbunden ist.)

Code: Alles auswählen

C:\Programme\xampp\cgi-bin> Traceback (most recent call last): File "D:\workdir\wBuildManager2\Python\wBuildManager.py"
, line 13, in ? remote["info"] = win32net.NetWkstaGetInfo(remote["ip"],100) pywintypes.error: (5, 'NetWkstaGetInfo', 'Zugriff verweigert')
Könnten es die importierten win32net Funktionen sein, die mir verweigert werden?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Der "Zugriff verweigert" Fehler hört sich irgendwie so an, als wenn dieser von Windows erzeugt wurde.
Mit welchem User läuft dein Skript dann als CGI? Darf dieser das auch dieses win32net.NetWkstaGetInfo() ausführen?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Zack
User
Beiträge: 47
Registriert: Dienstag 24. April 2007, 11:19

ja, das Script selbst lässt sich wunderbar mit dem selben Benutzer ausführen. Der Fehler tritt nur beim starten über das cgi-Script auf.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Zack hat geschrieben:ja, das Script selbst lässt sich wunderbar mit dem selben Benutzer ausführen.
Hallo Zack!

Um die Frage konkreter zu stellen:

Läuft der Apache als Dienst (dann läuft er nicht unter deinem Benutzer) oder läuft der Apache in einer Dos-Box?

Als Dienst wird dem Apachen kein Benutzer zugewiesen. Dann hilft es eventuell schon, wenn du dem Dienst einen Benutzer zuweisen würdest, der genug Rechte besitzt um ``NetWkstaGetInfo`` ausführen zu dürfen. Oder du führst das CGI als anderer Benutzer aus. --> http://httpd.apache.org/docs/2.2/suexec.html Keine Ahnung, ob das auch unter Windows funktioniert...

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Zack
User
Beiträge: 47
Registriert: Dienstag 24. April 2007, 11:19

@gerold: danke, das war's. Hätte ich auch drauf kommen müssen.
Nun läuft alles mit seiner gewohnten Routine. Ihr seid die größten \o/
Antworten