stdout nach permission drop loggen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
horko
User
Beiträge: 17
Registriert: Dienstag 1. Oktober 2013, 10:49

Moin,

hab ein kleines Problem und nicht wirklich eine Lösung dafür parat.
Und zwar habe ich eine Logger Class die mir stdout loggt was auch klappt, allerdings
würde ich gerne die permissons droppen nachdem ich das script gestartet habe.
Denke mal dass das Problem ist das ich das script als root ausführe und dann die rechte droppe.

Code: Alles auswählen

import sys
import os

class Logger(object):
    def __init__(self, filename="Default.log"):
        self.terminal = sys.stdout
        self.log = open(filename, "a")
    
    def write(self, message):
        self.terminal.write(message)
        self.log.write(message)
try:
    sys.stdout = Logger('/tmp/event.logger')

def drop_permissions(uid_name='updateservice', gid_name='users'):
    import pwd
    import grp
    nonpriv_uid = pwd.getpwnam(uid_name).pw_uid
    nonpriv_gid = grp.getgrnam(gid_name).gr_gid
    os.setgroups([])
    os.setgid(nonpriv_gid)
    os.setuid(nonpriv_uid)
    del pwd
    del grp

    start_update()

def start_update():
    print 'test'

if __name__ == "__main__":
    drop_permissions()
Jemand ne Idee wie ich ihn dazu bringen kann den stdout zu loggen nachdem ich die permissions neu gesetzt habe?
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@horko: Dein Programm hat Syntaxfehler (try ohne except), 'del' ist überflüssig und imports schreibt man normalerweise an den Anfang.
Die Rechte werden nur beim Öffnen der Datei geprüft, das heißt, ein Filehandle weiß nichts mehr davon, Du kannst also auch mit dem unprivilegierten User in eine Datei schreiben, die nur von root schreibbar ist.
horko
User
Beiträge: 17
Registriert: Dienstag 1. Oktober 2013, 10:49

@Sirius3:

Danke für den Einwand, hab den except irgendwie vergessen beim abtippen des beispiels.
Allerdings ja hast recht jetzt gehts, vorhin hat er irgendwie nichts geloggt obgleich output auf stdout war, jetzt gehts, konfused.
Aber gut solange es jetzt läuft.
Warum ist der del überflüssig? Ich brauch pwd & grp nur an der einen Stelle und nachher läuft das ganze script via threading bis jemand die screen session beendet.
Daher dachte ich macht es keinen großen Sinn die drin zu behalten, was spricht gegen mein Vorgehen?
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@horko: bei pwd und grp handelt es sich um ganz normale lokale Variablen, die sowieso wieder gelöscht werden, wenn die Funktion zu Ende ist.
BlackJack

@horko: Ergänzend: Die Module bleiben trotzdem geladen. Das heisst auch das importieren in der Funktion ändert da nichts dran. Also kann man sie auch wie man das erwarten würde am Anfang des Moduls importieren. Falls es Dir wirklich um das bisschen Speicherplatz dieser beiden Module gehen sollte, dann ist Python die falsche Sprache, denn da wird deutlich mehr Speicher ”verschwendet”.
Antworten