2010-03-08 11 views
10

Tengo una aplicación UI (utiliza GTK) para Linux que requiere ejecutarse como root (lee y escribe/dev/sd *).Autenticación de la aplicación GTK para ejecutar con permisos raíz

En lugar de requerir que el usuario abra un shell raíz o use "sudo" manualmente cada vez que inicia mi aplicación, me pregunto si la aplicación puede usar alguna API proporcionada por el sistema operativo para obtener permisos de raíz. (Nota: la aplicación gtk no puede usar el modo "setuid", así que no es una opción aquí.)

La ventaja aquí sería un flujo de trabajo más sencillo: el usuario podría, desde su cuenta de usuario predeterminada, hacer doble clic en mi aplicación desde el escritorio en lugar de tener que abrir un terminal raíz y ejecutarlo desde allí.

Lo pregunto porque OS X ofrece exactamente esto: una aplicación puede solicitar al sistema operativo que ejecute un ejecutable con permisos de raíz: el sistema operativo (y no la aplicación) le pide al usuario que ingrese sus credenciales, las verifique y luego las inicia el objetivo según lo deseado.

Me pregunto si hay algo similar para Linux (Ubuntu, por ejemplo)

Aclaración:

Así que, después de la alusión a PolicyKit Me pregunto si puedo usar eso para conseguir r/w acceso a los dispositivos de bloques "/ dev/sd ...". Encuentro que la documentación es bastante difícil de entender, así que pensé primero preguntar si esto es posible antes de pasar horas tratando de entenderlo en vano.

Actualización:

La aplicación es una herramienta de reparación de disco operada a distancia para el usuario de Linux unsavvy, y esos noobs Linux no tendrá mucho entendimiento del uso de sudo o incluso cambiar la pertenencia a grupos de sus usuarios, especialmente si su disco simplemente comenzó a actuar y se están volviendo locos. Es por eso que busco una solución que evite tecnicismos como este.

+0

Definitivamente es posible configurar cosas así; por ejemplo, el administrador de paquetes Synaptic generalmente se configura de esa manera. – caf

+0

No estoy seguro de que realmente desee ejecutar como root. Si solo necesita acceso al disco, es mejor agregar el usuario al grupo "disco". –

+0

Milán: mi aplicación actúa como una herramienta de reparación de discos de una sola vez. No creo que nadie que quiera usarlo esté dispuesto a cambiar su configuración de todo el sistema para esto, casi permanentemente. –

Respuesta

3

La manera antigua, simple pero que ahora se está eliminando, es GKSu. Here es la discusión sobre el futuro de GKSu.

La nueva forma es usar PolicyKit. No estoy seguro de cómo funciona esto, pero creo que debe iniciar su aplicación con el comando pkexec.

ACTUALIZACIÓN:

Mirando el código de ejemplo en http://hal.freedesktop.org/docs/polkit/polkit-apps.html, parece que se puede usar PolicyKit para obtener la autorización para ciertas acciones que se describen por .policy archivos en /usr/share/polkit-1/actions. La acción para ejecutar un programa como otro usuario es org.freedesktop.policykit.exec. Parece que no puedo encontrar una acción para acceder directamente a los dispositivos de bloque, pero debo admitir que la documentación de PolicyKit me rompe el cerebro también.

Por lo tanto, tal vez el curso de acción más simple para usted es separar su código de disco que requiere privilegios en una utilidad de línea de comandos y ejecutarlo desde su aplicación GUI usando g_spawn_[a]sync() con pkexec. De esa manera no tendrías que molestarte en solicitar acciones y ese tipo de cosas. De todos modos, es una mala práctica ejecutar tu aplicación GUI completa como root.

Otra sugerencia es preguntar directamente al autor de PolicyKit (David Zeuthen).O intente publicar su pregunta en la lista gtk-app-devel.

+0

He intentado pkexec - desafortunadamente, no funciona en mi caso ya que aparece el siguiente mensaje de error: "Gtk-WARNING **: no se puede abrir la pantalla:" - "man pkexec" explica por qué: "El entorno que PROGRAM ejecutará, se establecerá en un entorno conocido y seguro mínimo para evitar la inyección de código a través de LD_LIBRARY_PATH o mecanismos similares. Además, la variable de entorno PKEXEC_UID se establece en la identificación de usuario del proceso que invoca pkexec. Como resultado, pkexec no le permitirá ejecutar, p. X11 aplicaciones como otro usuario ya que la variable de entorno $ DISPLAY es no establecida. " Darn. –

+1

Hmm, creo que la API de PolicyKit te permite lograr lo mismo, pero desde dentro de tu programa. No estoy seguro sin embargo. – ptomato

+0

SO no me envió un correo sobre su actualización, así que solo lo veo ahora. Gracias por hacer un esfuerzo extra, creo que con esa información puedo salir adelante. –

Cuestiones relacionadas