¿Puedo usar pkexec en un script de Python o en un archivo .desktop?

8

De las siguientes preguntas

vemos que gksu ya no será compatible a largo plazo, y no se instalará de manera predeterminada desde> = 13.04. En cambio, deberíamos usar pkexec, que hace su trabajo bien para aplicaciones no gráficas, pero no para aplicaciones en la GUI:

pkexec gedit

al reemplazar gksu en un archivo .desktop

EXEC=pkexec /usr/bin/gedit

o cuando ejecuto un script de Python para ejecutar una aplicación gráfica con permisos de root, aparece el siguiente error:

>>>subprocess.Popen(['pkexec','gedit'])
** (gedit:3203): WARNING **: Could not open X display

¿Cómo tendría que volver a escribir mis scripts o mis archivos .desktop para admitir un diálogo de autenticación y ejecutar una aplicación como root si no tuviera que depender de gksu?

Takkat
fuente
Una de las actualizaciones sudoque vi dijo algo sobre la integración del soporte para gksu en sudo. Otra cosa a tener en cuenta es sudo -Aque, según la página de manual, inicia un (posiblemente) inicio de sesión gráfico.
j0h

Respuestas:

6

Primero cree un .policyarchivo de acción en /usr/share/polkit-1/actions/. Es convencional nombrar archivos de acción de forma "jerárquica de proveedores", como com.ubuntu.pkexec.gparted.policyoorg.debian.apt.policy

Luego pegue el siguiente contenido:

<?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-[Short Program Name]">
    <description>Run [Full Program Name]</description>
    <message>Authentication is required to run [Full Program Name]</message>
    <defaults>
      <allow_any>no</allow_any>
      <allow_inactive>no</allow_inactive>
      <allow_active>auth_admin_keep</allow_active>
    </defaults>
    <annotate key="org.freedesktop.policykit.exec.path">[Full Program Path]</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">TRUE</annotate>
  </action>

</policyconfig>

Reemplace [Short/Full Program Name/Path]con valores apropiados, por ejemplo gedit, gedit Text Editory /usr/bin/gedit. <action id>el valor no necesita coincidir con el nombre de archivo elegido (y un solo archivo puede contener múltiples acciones), pero convencionalmente el nombre de archivo es el prefijo para todas sus acciones.

Después de guardar el archivo, el programa específico se ejecutará con X y GUI y demás.

Parece que hay otra solución: agregue la siguiente línea en /etc/pam.d/polkit-1:

sesión opcional pam_xauth.so

usuario43787
fuente
1

Otra solución para los scripts de usuario: determine las variables de entorno apropiadas dentro de su script.

Puede usar un fragmento como el siguiente para hacer esto:

getXuser() {
        user=`pinky -fw | awk '{ if ($2 == ":'$displaynum'" || $(NF) == ":'$displaynum'" ) { print $1; exit; } }'`
        if [ x"$user" = x"" ]; then
                startx=`pgrep -n startx`
                if [ x"$startx" != x"" ]; then
                        user=`ps -o user --no-headers $startx`
                fi
        fi
        if [ x"$user" = x"" ]; then
               user=$(pinky -fw | awk '{ print $1; exit; }')
        fi
        if [ x"$user" != x"" ]; then
                userhome=`getent passwd $user | cut -d: -f6`
                export XAUTHORITY=$userhome/.Xauthority
        else
                export XAUTHORITY=""
        fi
        export XUSER=$user
}


for x in /tmp/.X11-unix/*; do
   displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
   getXuser;
      if [ x"$XAUTHORITY" != x"" ]; then
        export DISPLAY=":$displaynum"
      fi
done

(basado en la getXuserfunción ACPI )

Si encuentra que su .desktoparchivo aún no funciona, puede intentar envolverlo pkexec commandlineen un shfragmento, por ejemplo:

Exec=sh -c "pkexec --user root script_that_needs_root.sh"

El último problema es un error conocido, aparentemente:

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=690339

https://bugzilla.xfce.org/show_bug.cgi?id=9373

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=650038

https://bugzilla.gnome.org/show_bug.cgi?id=686059

Glutanimato
fuente