Root-Aufgaben mit dbus und policykit

10

Irgendwann muss meine Anwendung administrative Aufgaben wie das Erstellen einer Datei in / etc oder das Ausführen von Befehlen mit Root-Rechten ausführen.

Ich weiß, ich könnte einfach ein Q & D machen:

os.popen("pkexec foo bar")

Aber ich weiß auch, dass dies nicht der vorgesehene saubere Weg ist, dies zu tun. Eine Art Ärger für den Benutzer, weil er sein Passwort immer neu eingeben muss, anstatt eine sitzungsähnliche Behandlung zu haben.

Ich war sehr optimistisch, als ich das Python-Beispiel für die Authentifizierung fand .

Es ist ein einfaches Beispiel, das sofort funktioniert:

import dbus

bus = dbus.SystemBus()
proxy = bus.get_object('org.freedesktop.PolicyKit1', '/org/freedesktop/PolicyKit1/Authority')
authority = dbus.Interface(proxy,  dbus_interface='org.freedesktop.PolicyKit1.Authority')

system_bus_name = bus.get_unique_name()

subject = ('system-bus-name', {'name' : system_bus_name})
action_id = 'org.freedesktop.policykit.exec'
details = {}
flags = 1            # AllowUserInteraction flag
cancellation_id = '' # No cancellation id

result = authority.CheckAuthorization(subject, action_id, details, flags, cancellation_id)

print result

Ich war ziemlich naiv und dachte, dass ich nach der Autorisierung einfach mit einigen os.popen () - Befehlen im Skript weitermachen könnte. Jetzt weiß ich es besser :(

Ich kann das Tupel-Ergebnis im obigen Beispiel sehen, aber in der weiteren Dokumentation konnte ich zu diesem Zeitpunkt keinen funktionierenden Code finden, um fortzufahren.

Was habe ich mit diesem Ergebnis zu tun? Wie kann ich die Aufgaben, die ich benötige, weiter ausführen? Gibt es eine Python-Referenz mit Beispielen, die die verfügbaren Methoden anbieten?

Ich habe versucht, die Autorisierungsmethoden mit dir () aufzulisten, konnte aber keinen Hinweis darauf finden, wie es weitergehen soll.

Ich möchte wirklich vermeiden, meinen Fallback zu verwenden, aber es wäre mein letzter Ausweg. Bitte hilf mir, es richtig zu machen :)

Danke und Grüße

André

Bearbeiten:

Da ich dies nicht zum Laufen gebracht habe und meine frühere Lösung durch Starten meines Programms mit gksu nicht aus / opt / heraus funktioniert, musste ich schließlich tausend Anfragen nach einem Passwort aufgeben und implementieren, damit das Programm zumindest rudimentär funktioniert ein T-Shirt im App-Showdown.

Ich habe das Problem nicht bemerkt, weil ich es zuerst schnell geteilt habe. Da hat alles geklappt. Fragen Sie zu Beginn einmal nach dem Passwort. Ich bin jetzt total niedergeschlagen. Mein Beitrag für AppShowdown war https://launchpad.net/armorforge . ;-(

Liberavia
quelle
Ich denke, Sie könnten bei StakOverflow bessere Antworten finden. Sie sollten darum bitten, dass diese Frage dort migriert wird.
jgomo3

Antworten:

6

Es gibt ein grundlegendes Konzept, das Sie zuerst verstehen müssen: PolicyKit behandelt nur die Autorisierung, nicht die Eskalation von Berechtigungen. PolicyKit beantwortet die Frage: "Ist der Benutzer berechtigt, diese Aufgabe auszuführen?", Gibt Ihnen jedoch keine Root-Berechtigungen.

Das häufig verwendete Modell besteht darin, einen DBus-Systemdienst zu erstellen, der mit Root-Rechten ausgeführt wird. Es werden Anforderungen von Nicht-Root-Prozessen entgegengenommen, mithilfe von PolicyKit ermittelt, ob dieser Prozess berechtigt ist, diese Anforderung zu stellen, und anschließend die angeforderte Aufgabe ausgeführt.

Ich habe vor ein paar Jahren ein Tutorial über PolicyKit und DBus mit Python auf ubuntuforums.org geschrieben . Die Prinzipien sind die gleichen, obwohl möglicherweise einige Aktualisierungen erforderlich sind. Ich muss jetzt ins Bett gehen, also schau mal rein und lass es mich wissen, wenn es aktualisiert werden muss.

Flimm
quelle