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...
ubuntu + XAMPP: CGI wird ausgeführt als nobody
Hat es ich nun erledigt?
Wenn ja, bitte code posten (würde mich interessieren).
Gruss, Dominik
Wenn ja, bitte code posten (würde mich interessieren).
Gruss, Dominik
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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...
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...
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)
Ich glaube zwar nicht das das gross weiter hilft, aber man weiss ja nie.
Gruss, Dominik
Im Moment habe ich eine Shell in Python in einer Shell

Code: Alles auswählen
import os
cmd = "/bin/bash -i"
print cmd
bash = os.popen(cmd, "r")
Gruss, Dominik
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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...
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...
Mal ein versuch:
in.write(passwd)
in.close()[/python]
Code: Alles auswählen
import os
cmd = 'su username -c "chmod 777 * -R"'
in = os.popen(cmd, "w")
in.close()[/python]
-
- User
- Beiträge: 25
- Registriert: Samstag 22. Januar 2005, 19:43
Im neuen Python 2.4 hat es neu ein subprocess Module.
Wirf mal einen Blick darauf.
Gruss, Dominik
Wirf mal einen Blick darauf.
Gruss, Dominik
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hier mal ein Versuch mit subprocess:
Allerdings geht's so nicht... Ich erhalte bei process.stdin.write() den Fehler:
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()
Code: Alles auswählen
IOError: [Errno 32] Broken pipe
args = (32, 'Broken pipe')
errno = 32
filename = None
strerror = 'Broken pipe'
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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":
Die Ausgaben:
Es gibt aber auch in Python 2.4 ein "normales" popen() Damit komme ich weiter:
Die Ausgaben:
Und bei w.clode() gibt's wieder ein Brocken 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?
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"
Code: Alles auswählen
XXX XXX
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"
Code: Alles auswählen
su: must be run from a terminal
Code: Alles auswählen
IOError: [Errno 32] Broken pipe
args = (32, 'Broken pipe')
errno = 32
filename = None
strerror = 'Broken pipe'

Wie kann ich sonst noch Befehle unter einem andern Account ausführen?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
sudojens hat geschrieben:Wie kann ich sonst noch Befehle unter einem andern Account ausführen?
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
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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...
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...
-
- User
- Beiträge: 25
- Registriert: Samstag 22. Januar 2005, 19:43
subprocess:
http://python.fyxm.net/peps/pep-0324.html
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
http://python.fyxm.net/peps/pep-0324.html
Könnte das die elegante Lösung sein?- A hook for executing custom code between fork and exec. This
can be used for, for example, changing uid.
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
-
- User
- Beiträge: 25
- Registriert: Samstag 22. Januar 2005, 19:43
Ich glaube die Lösung ist pty oder einfacher pexpect.
http://pexpect.sourceforge.net/
Da du über einen terminal/console kommst sind auch Sachen wie su möglich
Code: Alles auswählen
import pexpect
c = pexpect.spawn("/bin/bash -i")
c.interact()
Da du über einen terminal/console kommst sind auch Sachen wie su möglich
