Kann ich pkexec in einem Python-Skript oder einer .desktop-Datei verwenden?

8

Aus den folgenden Fragen

Wir sehen, dass gksu langfristig nicht mehr unterstützt wird und standardmäßig ab> = 13.04 nicht mehr installiert wird. Stattdessen sollten wir pkexec verwenden, das seine Aufgabe für nicht grafische Anwendungen, aber nicht für Anwendungen auf der GUI erfüllt:

pkexec gedit

beim Ersetzen von gksu in einer .desktop-Datei

EXEC=pkexec /usr/bin/gedit

oder wenn ich ein Python-Skript ausführe, um eine grafische Anwendung mit Root-Berechtigungen auszuführen, wird folgende Fehlermeldung angezeigt:

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

Wie müsste ich meine Skripte oder meine .desktop-Dateien neu schreiben, um einen Authentifizierungsdialog zu unterstützen und eine Anwendung als Root auszuführen, wenn dies nicht von gksu abhängen sollte?

Takkat
quelle
Eines der Updates, das sudoich gesehen habe, sagte etwas über die Integration der Unterstützung für gksu in sudo aus. Eine andere Sache zu betrachten ist, sudo -Adie laut der Manpage ein (möglicherweise) grafisches Login startet.
j0h

Antworten:

6

Erstellen Sie zuerst eine .policyAktionsdatei in /usr/share/polkit-1/actions/. Es ist üblich, Aktionsdateien "herstellerhierarchisch" zu benennen, z. B. com.ubuntu.pkexec.gparted.policyoderorg.debian.apt.policy

Fügen Sie dann den folgenden Inhalt ein:

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

Ersetzen Sie [Short/Full Program Name/Path]mit den entsprechenden Werten, zum Beispiel gedit, gedit Text Editorund /usr/bin/gedit. <action id>value muss nicht mit dem ausgewählten Dateinamen übereinstimmen (und eine einzelne Datei kann mehrere Aktionen enthalten), aber herkömmlicherweise ist Dateiname das Präfix für alle Aktionen.

Nach dem Speichern der Datei würde das spezifische Programm mit X und GUI und so weiter ausgeführt.

Ein weiterer Fix scheint zu sein: Fügen Sie die folgende Zeile in /etc/pam.d/polkit-1 hinzu:

Sitzung optional pam_xauth.so

user43787
quelle
1

Noch ein Fix für Benutzerskripte: Bestimmen Sie die entsprechenden Umgebungsvariablen in Ihrem Skript.

Sie können dazu ein Snippet wie das folgende verwenden:

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

(basierend auf der ACPI- getXuserFunktion)

Wenn Sie feststellen, dass Ihre .desktopDatei immer noch nicht funktioniert, können Sie versuchen, sie pkexec commandlinein ein shSnippet zu verpacken , z.

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

Das letzte Problem ist anscheinend ein bekannter Fehler:

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

Glutanimat
quelle