Posso usare pkexec in uno script python o in un file .desktop?


8

Dalle seguenti domande

vediamo che gksu non sarà più supportato a lungo termine e non verrà installato di default da> = 13.04. Invece dovremmo usare pkexec che fa bene il suo lavoro per applicazioni non grafiche ma non per applicazioni sulla GUI:

pkexec gedit

quando si sostituisce gksu in un file .desktop

EXEC=pkexec /usr/bin/gedit

o quando eseguo uno script Python per eseguire un'applicazione grafica con permessi di root ottengo il seguente errore:

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

Come dovrei riscrivere i miei script o i miei file .desktop per supportare una finestra di dialogo di autenticazione ed eseguire un'applicazione come root se non dovessi farlo dipendere da gksu?


Uno degli aggiornamenti che sudoho visto ha detto qualcosa sull'integrazione del supporto per gksu in sudo. Un'altra cosa da guardare è sudo -Ache secondo la pagina man lancia un login (possibilmente) grafico.
j0h

Risposte:


6

Per prima cosa crea un .policyfile di azione in /usr/share/polkit-1/actions/. È convenzionale denominare i file di azioni in modo "gerarchico fornitore", come com.ubuntu.pkexec.gparted.policyoorg.debian.apt.policy

Quindi incolla il seguente contenuto:

<?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>

Sostituisci [Short/Full Program Name/Path]con i valori appropriati, ad esempio gedit, gedit Text Editore /usr/bin/gedit. <action id>il valore non deve corrispondere al nome file scelto (e un singolo file può contenere più azioni), ma convenzionalmente il nome file è il prefisso per tutte le sue azioni.

Dopo aver salvato il file, il programma specifico verrebbe eseguito con X e GUI e simili.

Un'altra soluzione sembra essere: aggiungere la seguente riga in /etc/pam.d/polkit-1:

sessione opzionale pam_xauth.so


1

Ancora un'altra correzione per gli script utente: determinare le variabili di ambiente appropriate all'interno dello script.

A tale scopo puoi utilizzare uno snippet come il seguente:

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

(basato sulla getXuserfunzione ACPI )

Se il .desktopfile non funziona ancora, puoi provare a racchiuderlo pkexec commandlinein uno shsnippet, ad esempio:

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

L'ultimo problema è un bug noto, apparentemente:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.