ubuntu + XAMPP: CGI wird ausgeführt als nobody

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...
Gast

Hat es ich nun erledigt?
Wenn ja, bitte code posten (würde mich interessieren).

Gruss, Dominik
Benutzeravatar
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...
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
Benutzeravatar
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...
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]
Slalomsk8er
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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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'
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Broken pipe.. heißt glaube ich, dass dir der Unterprozess zu schnell wegstirbt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Eine Idee, wie man es umgehen kann???
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Vielleicht an den Popen() Argumenten tunen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
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":

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:

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"
Die Ausgaben:

Code: Alles auswählen

su: must be run from a terminal
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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
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...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Slalomsk8er
User
Beiträge: 25
Registriert: Samstag 22. Januar 2005, 19:43

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
Slalomsk8er
User
Beiträge: 25
Registriert: Samstag 22. Januar 2005, 19:43

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 ;)
Antworten