Могу ли я использовать pkexec в скрипте Python или в файле .desktop?

8

Из следующих вопросов

мы видим, что gksu больше не будет поддерживаться в долгосрочной перспективе и не будет установлен по умолчанию с> = 13.04. Вместо этого мы должны использовать pkexec, который прекрасно работает для неграфических приложений, но не для приложений в графическом интерфейсе:

pkexec gedit

при замене gksu в файле .desktop

EXEC=pkexec /usr/bin/gedit

или когда я запускаю скрипт python для запуска графического приложения с правами root, я получаю следующую ошибку:

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

Как бы мне пришлось переписать мои сценарии или мои файлы .desktop для поддержки диалога аутентификации и запустить приложение от имени пользователя root, если у меня не будет этого зависеть от gksu?

Takkat
источник
В одном из обновлений, которые sudoя видел, говорилось об интеграции поддержки gksu в sudo. Еще одна вещь, на sudo -Aкоторую стоит обратить внимание, это то, что согласно man-странице запускается (возможно) графический логин.
13

Ответы:

6

Сначала создайте .policyфайл действий в /usr/share/polkit-1/actions/. Обычно файлы действий называются «иерархически», например, com.ubuntu.pkexec.gparted.policyилиorg.debian.apt.policy

Затем вставьте следующий контент:

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

Замените [Short/Full Program Name/Path]на соответствующие значения, например gedit, gedit Text Editorи /usr/bin/gedit. <action id>Значение не обязательно должно соответствовать выбранному имени файла (и один файл может содержать несколько действий), но условно имя файла является префиксом для всех его действий.

После сохранения файла определенная программа будет работать с X и GUI и так далее.

Еще одно исправление: добавьте следующую строку в /etc/pam.d/polkit-1:

необязательный сеанс pam_xauth.so

user43787
источник
1

Еще одно исправление для пользовательских сценариев: определите соответствующие переменные среды внутри вашего сценария.

Вы можете использовать фрагмент, подобный следующему, чтобы сделать это:

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

(на основе getXuserфункции ACPI )

Если ваш .desktopфайл все еще не работает, вы можете попробовать обернуть его pkexec commandlineво shфрагмент, например:

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

Последняя проблема - известная ошибка, по-видимому:

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
источник