Gibt es eine Möglichkeit, einen sudo
-Kontextmanager zu implementieren, der den umschließenden Bereich als einen anderen Benutzer ausführt, indem er das sudoers-System verwendet?
Ich bezweifle, dass die sudo(8)
ausführbare Datei mir hier helfen wird, aber vielleicht gibt es eine C-Level-Schnittstelle, an die ich mich binden kann?
Motivation: Ich kann fast dieses Shell-Skript vollständig auf Python portieren, ohne irgendwelche Subprozesse, außer dass ich momentan system('sudo sh -c "echo %i > /dev/thatfile"' % value)
habe. Es wäre so elegant, wenn ich with sudo(), open('/dev/thatfile', 'w') as thatfile: thatfile.write(str(value))
könnte.
Ich vermute, das ist auf keine einfache Weise möglich. Programme, die ihre Berechtigungen wie sudo
eskalieren, müssen in ihren Dateisystemberechtigungen (das ist das Bit "setuid") ein Flag gesetzt haben, um dem Betriebssystem zu sagen, dass es sie als einen anderen Benutzer ausführen soll als den, der sie gestartet hat. Wenn Sie nicht möchten, dass Ihr gesamter Python-Interpreter auf root gesetzt wird, gibt es keinen direkten Weg, etwas Entsprechendes für einen kleinen Teil Ihres Python-Codes zu tun.
Es wäre denkbar, einen sudo
style-Kontextmanager zu implementieren, indem Sie Ihren regulären Python-Code nicht privilegiert ausführen, sondern stattdessen den Bibliothekscode vorübergehend ersetzen, der verschiedene OS-Aufrufe ausführt (z. B. open
ing einer Datei) mit einer Art Proxy, die es mit einem setuid-Hilfsprogramm verbindet. Aber es wäre eine Menge Arbeit, um so etwas zum Laufen zu bringen, und viel mehr Arbeit, um sicherzustellen, dass es sicher genug ist, um es überall in der Produktion einzusetzen.
Eine Idee, wenn Sie Ihre aktuelle Lösung der Verwendung eines Shell-Skripts aus einem system
-Aufruf nicht mögen: Schreiben Sie die Datei mit normalem Python-Code mit Ihren regulären Benutzerberechtigungen. Dann chown
it (und verschiebe es wenn nötig) mit einem sudo
Aufruf.
Tags und Links python sudo contextmanager