En algún momento, mi aplicación necesita realizar tareas administrativas como crear un archivo en / etc o ejecutar comandos con privilegios de root.
Sé que podría hacer un Q&D:
os.popen("pkexec foo bar")
Pero también sé que esta no es la forma limpia prevista para hacerlo. Algún tipo de molestia para el usuario porque siempre necesita volver a ingresar su contraseña en lugar de tener un manejo similar a la sesión.
Fui muy optimista ya que encontré el ejemplo de Python para la autenticación .
Es un ejemplo simple que funciona de inmediato:
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
He sido bastante ingenuo pensando que después de la autorización podría continuar en el script con algunos comandos os.popen (). Ahora sé mejor :(
Puedo ver el resultado de la tupla en el ejemplo anterior, pero en la documentación adicional no pude encontrar un código de trabajo para continuar en este punto.
¿Qué tengo que ver con este resultado? ¿Cómo puedo seguir realizando las tareas que necesito? ¿Hay una referencia de Python con ejemplos que ofrecen los métodos disponibles?
Traté de enumerar los métodos de autorización usando dir () pero no pude encontrar ninguna pista sobre cómo continuar.
Realmente quiero evitar usar mi reserva, pero sería mi último recurso. Por favor, ayúdame a hacerlo de la manera correcta :)
Gracias y saludos
André
Editar:
Debido a que no lo hice funcionar y mi solución anterior al iniciar mi programa con gksu no funciona fuera de / opt /, finalmente tuve que renunciar e implementar mil solicitudes de contraseña para hacer que el programa funcione de manera rudimentaria para obtener al menos una camiseta en el enfrentamiento de la aplicación.
No noté el problema porque primero compartí rápidamente. Allí todo funcionó bien. Pidiendo una vez la contraseña al principio. Estoy totalmente deprimido ahora. Mi contribución para AppShowdown fue https://launchpad.net/armorforge . ;-(
Respuestas:
Primero hay que entender un concepto fundamental: PolicyKit solo maneja la autorización, no la escalada de privilegios. PolicyKit responderá la pregunta: "¿está autorizado el usuario para hacer esta tarea?", Pero no le dará privilegios de root.
El modelo de uso común es crear un servicio del sistema DBus, que se ejecuta con privilegios de root. Tomará solicitudes de procesos no raíz, usará PolicyKit para determinar si ese proceso está autorizado para hacer esa solicitud y luego realizará la tarea solicitada.
Escribí un tutorial sobre PolicyKit y DBus con Python en ubuntuforums.org hace unos años. Los principios son los mismos, aunque podría necesitar alguna actualización. Necesito irme a la cama ahora, así que eche un vistazo y avíseme si necesita una actualización.
fuente