2012-04-11 13 views
10

Estoy construyendo una extensión de shell Gnome, y quiero poder hacer algunas cosas con privilegios escalados. Entonces, estoy pensando que necesito usar "policy kit", pero no sé cómo hacerlo.Gnome shell escalada de privilegios

Por lo tanto, decir que quería hacer algo como ifconfig eth0 down o ifconfig eth0 up

que se puede ejecutar desde el terminal: pkexec ifconfig eth0 down y se le solicitará una contraseña y luego hacerlo.

Pero, ¿cómo se supone que debo hacerlo desde dentro de una extensión?

Estoy bastante seguro de que tiene algo que ver con hacer un archivo en/usr/share/polkit-1/actions, pero no puedo encontrar nada en Internet o de otra manera.

Quiero ser capaz de configurarlo para que no haya necesidad de escribir una contraseña, y la extensión solo puede ejecutar el comando determinado cada vez que lo desee.

Sé que es una muy mala idea permitir ejecutar cualquier comando. Eso no es lo que estoy pidiendo, quiero poder ejecutar un solo programa/comando.

EDITAR: No estoy seguro, pero creo que podría ser imposible que no haya necesidad de escribir una contraseña. Solo sé que sudo no solicita la contraseña por un tiempo después de la primera vez, así que quiero una funcionalidad similar. No estoy seguro de qué es posible.

+0

Esto generalmente no va a funcionar demasiado bien, porque su extensión de shell (en JavaScript) se ejecutará dentro del mismo proceso que el propio shell, exponiéndolo así a todo tipo de "fugas de seguridad ..." - La apuesta segura sería, de hecho, usar 'pkexec' o aislar el bit de código privilegiado" inseguro "en un proceso separado ... PD: volver a pedir una contraseña por' sudo' et al es una configuración de seguridad de todo el sistema; el valor por defecto es volver a solicitar después de un (largo) mientras que – BRFennPocock

+0

@BRPocock sí usando 'pkexec' es lo que quiero hacer. ¿Cómo haría eso desde dentro de la extensión? – Jay

Respuesta

2

Es mucho tiempo que no trabajaba con PolicyKit, pero de lo que recuerdo, tiene de hecho para crear un archivo en la acciones/directorio, con contenidos como:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE policyconfig PUBLIC 
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" 
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd"> 
<policyconfig> 

    <action id="org.freedesktop.policykit.pkexec.run-ifconfig"> 
    <description>Configure network</description> 
    <message>Authentication is required to set ifconfig parameters</message> 
    <defaults> 
     <allow_any>no</allow_any> 
     <allow_inactive>no</allow_inactive> 
     <allow_active>...</allow_active> 
    </defaults> 
    <annotate key="org.freedesktop.policykit.exec.path">/sbin/ifconfig</annotate> 
    </action> 

</policyconfig> 

Tienes que cambie el valor en:

<allow_active>...</allow_active> 

Para el valor que desea. Selección de un valor de:

  • "no" se denegará el acceso
  • "Sí", se permite el acceso de forma implícita
  • "auth_user" requiere autenticación de usuario
  • "auth_admin" requiere autenticación de administrador.
  • "auth_user_keep" y "auth_admin_keep" funcionan de forma similar pero retienen la autenticación durante unos minutos después.
  • Además de algunos otros valores, vea here.

Cambiar el valor de la clave allow_active a "yes" debería detener las demandas de autenticación.

Luego debe adaptar el archivo de acción a sus necesidades y llamarlo.

Hugo,

1

que estaba teniendo la misma cuestión para tratar de implementar un selector de sintonía. Esto es lo que se me ocurrió.

Como otros respondieron, es posible que deba escribir un archivo de política (utilicé "auth_admin"). Lo coloqué en "/ usr/share/polkit-1/actions/tuned-adm.política. "No creo que pueda distribuir eso a través del modelo de extensiones, así que tendré que preguntar en sentido ascendente para incluirlo.

Luego, utilicé pkexec y mi comando para obtener el" sudo popup "y lo obtuve para trabajar

const GLib = imports.gi.GLib; 
const Util = imports.misc.util; 
this.pkexec_path = GLib.find_program_in_path('pkexec'); 
this.tunedadm_path = GLib.find_program_in_path('tuned-adm'); 
let result = Util.trySpawnCommandLine(this.pkexec_path + " " + this.tunedadm_path + " list") 

la verdadera sorpresa aquí fue utilicé un par de otros métodos para ejecutar la línea de comandos y se encerrarían gnome-shell he encontrado el código aquí:... https://github.com/nodefourtytwo/gnome-shell-extension-cpu-freq/blob/master/extension.js ser particularmente útil

Cuestiones relacionadas