web-dev-qa-db-fra.com

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

Parmi les questions suivantes

nous voyons que gksu ne sera plus supporté à long terme et qu'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, le message d'erreur suivant s'affiche:

>>>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 devais pas la faire dépendre de gksu?

8
Takkat

Commencez par créer un fichier d'action .policy dans /usr/share/polkit-1/actions/. Il est classique de nommer les fichiers d'action de manière "hiérarchique par le fournisseur", tels que com.ubuntu.pkexec.gparted.policy ou org.debian.apt.policy

Puis collez 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 les valeurs appropriées, par exemple gedit, gedit Text Editor et /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, nom de fichier est le préfixe de toutes ses actions.

Après avoir enregistré le fichier, le programme spécifique s’exécutait avec X, une interface graphique, etc.

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

session optionnelle pam_xauth.so

6
user43787

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

Pour cela, 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 fonction ACPI getXuser)

Si vous constatez que votre fichier .desktop ne fonctionne toujours pas, vous pouvez essayer d’envelopper votre pkexec commandline dans un extrait sh, 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=937

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

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

1
Glutanimate