Seite 1 von 1
ubuntu + XAMPP: CGI wird ausgeführt als nobody
Verfasst: Mittwoch 26. Januar 2005, 21:29
von jens
Normalerweise werden CGI-Skripte immer mit dem User nobody ausgeführt... wie bekomme ich es hin, das mein Python-CGI unter einem anderen User läuft???
Ich möchte eigentlich nur per chmod ein paar Dateien im httpd Verzeichnis andere Rechte zuweisen... Aber per nobody habe ich dazu nicht die nötigen Rechte...
Ich kann mir vorstellen Username/Passwort im Klartext in's CGI Skript zu schreiben, aber ich weiß nicht, wie ich damit was anfangen kann... sowas wie popen("sudo Username/Passwort chmod 777 * -R") funktioniert ja nicht so einfach...
EDIT: bin gerade auf suexec gestoßen...
Verfasst: Mittwoch 26. Januar 2005, 22:02
von Gast
Hat es ich nun erledigt?
Wenn ja, bitte code posten (würde mich interessieren).
Gruss, Dominik
Verfasst: Mittwoch 26. Januar 2005, 22:08
von jens
Ne, suexec, hat damit wohl zu tun, unter welchem User CGI-Skripte ausgeführt werden:
http://httpd.apache.org/docs/suexec.html
Aber das hilft mir erstmal nicht weiter...
Ich könnte natürlich in der httpd.conf User und Group einfach auf root ändern, aber das wäre sicherlich ein wenig unschön...
Verfasst: Mittwoch 26. Januar 2005, 23:05
von Gast
Ich bin leider noch nit wirklich zum experimentieren gekommen, da ich den Server meinen Kollegen, der auszieht ersetzen muss.
Im Moment habe ich eine Shell in Python in einer Shell

(kein CGI)
Code: Alles auswählen
import os
cmd = "/bin/bash -i"
print cmd
bash = os.popen(cmd, "r")
Ich glaube zwar nicht das das gross weiter hilft, aber man weiss ja nie.
Gruss, Dominik
Verfasst: Donnerstag 27. Januar 2005, 07:16
von jens
Zumindest für meinem Heimserver habe ich eine mögliche Lösung gefunden: Mittels
suexecusergroup kann man bestimmen mit welchem User/Gorup CGI's Ausgeführt werden.
s.
http://httpd.apache.org/docs-2.0/mod/mo ... cusergroup
Man könnte sich einen Virtuellen https Server einrichten und nur bei diesem suexecusergroup benutzen...
Verfasst: Donnerstag 27. Januar 2005, 13:37
von Gast
Mal ein versuch:
Code: Alles auswählen
import os
cmd = 'su username -c "chmod 777 * -R"'
in = os.popen(cmd, "w")
in.write(passwd)
in.close()[/python]
Verfasst: Freitag 28. Januar 2005, 10:50
von Slalomsk8er
Im neuen Python 2.4 hat es neu ein subprocess Module.
Wirf mal einen Blick darauf.
Gruss, Dominik
Verfasst: Montag 31. Januar 2005, 11:01
von jens
Hier mal ein Versuch mit subprocess:
Code: Alles auswählen
import subprocess
user = "root"
password = "[i]passwort[/i]"
process = subprocess.Popen('"su %s -c "id"' % user,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE )
process.stdin.write( password )
print process.stdout.read()
Allerdings geht's so nicht... Ich erhalte bei process.stdin.write() den Fehler:
Code: Alles auswählen
IOError: [Errno 32] Broken pipe
args = (32, 'Broken pipe')
errno = 32
filename = None
strerror = 'Broken pipe'
Verfasst: Montag 31. Januar 2005, 13:34
von Leonidas
Broken pipe.. heißt glaube ich, dass dir der Unterprozess zu schnell wegstirbt.
Verfasst: Montag 31. Januar 2005, 14:27
von jens
Eine Idee, wie man es umgehen kann???
Verfasst: Montag 31. Januar 2005, 15:36
von Leonidas
Vielleicht an den Popen() Argumenten tunen?
Verfasst: Montag 31. Januar 2005, 19:37
von jens
Also mit dem subprocess() bin ich nicht weiter gekommen... Ich hab mit die möglichen Parameter und Methoden angeschaut, aber so richtig funktioniert es nicht...
Hab zwar nun keinen Fehler mehr, aber auch keine Ausgabe vom Linux-Befehl "id":
Code: Alles auswählen
user = "root"
password = "[i]RootPasswort[/i]"
cmd = 'su %s -c id' % user
process = subprocess.Popen( cmd,
bufsize = 1,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE )
process.stdin.write( password )
print "XXX",process.stdout.read(),"XXX"
Die Ausgaben:
Es gibt aber auch in Python 2.4 ein "normales" popen() Damit komme ich weiter:
Code: Alles auswählen
user = "root"
password = "[i]RootPasswort[/i]"
cmd = 'su %s -c id' % user
r, w, e = popen2.popen3( cmd )
w.write( password )
print r.read()
print e.read()
w.close()
r.close()
e.close()
print "OK"
Die Ausgaben:
Und bei w.clode() gibt's wieder ein Brocken Pipe:
Code: Alles auswählen
IOError: [Errno 32] Broken pipe
args = (32, 'Broken pipe')
errno = 32
filename = None
strerror = 'Broken pipe'
Das scheint, bis auf den close()-Fehler zu funktionieren!!! Nur der SU Befehl scheint nicht so der richtige zu sein
Wie kann ich sonst noch Befehle unter einem andern Account ausführen?
Verfasst: Montag 31. Januar 2005, 20:45
von Leonidas
jens hat geschrieben:Wie kann ich sonst noch Befehle unter einem andern Account ausführen?
sudo
ist sowieso viel sicherer, muss dafür aber auch konfiguriert werden. Da muss man das root passwort nichtmal wissen, man kann auch für sudo Befehle andere Passwörter setzen
Verfasst: Montag 31. Januar 2005, 20:58
von jens
sudo scheint sich anders zu verhalten... Dabei kann man anscheinend nicht dass Passwort übergeben...
Wenn ich das Skript aus einem nicht root Terminal aufrufe, erhalte ich bei SU auch den Hinweis "su : Muss von einem Terminal gestartet werden". Bei SUDO erscheint immer die Eingabe für das Passwort... Also wird es per write() nicht übergeben
Es gibt für SUDO nocht den Parameter -S, dann übernimmt er ein Passwort durch den stdin... Klappen tut's aber nicht
Ich frage mich gerade, ob ich nicht einfach statt Apache mit Python selber einen Server machen soll, dann hab ich glaub ich keine Probleme... Aber es heißt immer das der eingebaute Server unsicher wäre... In wie fern stimmt das???
Eine andere umständliche Möglichkeit, ich bleib bei Apache, mit den eingeschränkten Rechte und reiche alles durch eine Telnetverbintung an den Rechner weiter...
Verfasst: Dienstag 1. Februar 2005, 13:14
von Leonidas
Du kannst sudo so einstellen, dass es für gewisse User für gewisse Befehle kein Passwort abfragt, dann wäre das schon gelöst.
Verfasst: Samstag 5. Februar 2005, 16:59
von Slalomsk8er
subprocess:
http://python.fyxm.net/peps/pep-0324.html
- A hook for executing custom code between fork and exec. This
can be used for, for example, changing uid.
Könnte das die elegante Lösung sein?
Sudo is mir auch in den Sinn gekommen. Das sicherste/unsicherst Programm auf dem Server (deine Conf entscheidet). Am bessten ohne Password, jedoch nur für das eine Kommando (nicht hauen falls falsch).
Gruss, Dominik
Verfasst: Freitag 18. Februar 2005, 21:32
von Slalomsk8er
Ich glaube die Lösung ist pty oder einfacher pexpect.
Code: Alles auswählen
import pexpect
c = pexpect.spawn("/bin/bash -i")
c.interact()
http://pexpect.sourceforge.net/
Da du über einen terminal/console kommst sind auch Sachen wie su möglich
