Puis-je utiliser pkexec dans un script python ou un fichier .desktop?

8

Des questions suivantes

nous voyons que gksu ne sera plus supporté à long terme, et il ne sera pas installé par défaut à partir de> = 13.04. Au lieu de cela, nous devrions utiliser pkexec qui fait bien son travail pour les applications non graphiques mais pas pour les applications sur l'interface graphique:

pkexec gedit

lors du remplacement de gksu dans un fichier .desktop

EXEC=pkexec /usr/bin/gedit

ou lorsque j'exécute un script python pour exécuter une application graphique avec des autorisations root, j'obtiens l'erreur suivante:

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

Comment devrais-je réécrire mes scripts ou mes fichiers .desktop pour prendre en charge une boîte de dialogue d'authentification et exécuter une application en tant que root si je ne dois pas la faire dépendre de gksu?

Takkat
la source
L'une des mises à jour que sudoj'ai vues a dit quelque chose sur l'intégration du support de gksu dans sudo. Une autre chose à regarder est celle sudo -Aqui, selon la page de manuel, lance une connexion graphique (éventuellement).
j0h

Réponses:

6

Créez d'abord un .policyfichier d'action dans /usr/share/polkit-1/actions/. Il est classique de nommer les fichiers d'actions de manière "hiérarchique fournisseur", tels que com.ubuntu.pkexec.gparted.policyouorg.debian.apt.policy

Collez ensuite le contenu suivant:

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

Remplacez [Short/Full Program Name/Path]par des valeurs appropriées, par exemple gedit, gedit Text Editoret /usr/bin/gedit. <action id>la valeur n'a pas besoin de correspondre au nom de fichier choisi (et un seul fichier peut contenir plusieurs actions), mais classiquement le nom de fichier est le préfixe de toutes ses actions.

Après avoir enregistré le fichier, le programme spécifique s'exécuterait avec X et GUI et autres.

Un autre correctif semble être: Ajoutez la ligne suivante dans /etc/pam.d/polkit-1:

session facultative pam_xauth.so

user43787
la source
1

Encore un autre correctif pour les scripts utilisateur: déterminez les variables d'environnement appropriées dans votre script.

Pour ce faire, vous pouvez utiliser un extrait comme le suivant:

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

(basé sur la getXuserfonction ACPI )

Si vous trouvez que votre .desktopfichier ne fonctionne toujours pas, vous pouvez essayer de l'envelopper pkexec commandlinedans un shextrait, par exemple:

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

Le dernier problème est un bug connu, apparemment:

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

Glutanimate
la source