我可以在python脚本或.desktop文件中使用pkexec吗?


8

来自以下问题

我们看到从长远来看将不再支持gksu,并且默认情况下不会从> = 13.04开始安装它。相反,我们应该使用pkexec,它可以很好地用于非图形应用程序,但不适用于GUI上的应用程序:

pkexec gedit

在.desktop文件中替换gksu时

EXEC=pkexec /usr/bin/gedit

或者当我运行python脚本以root权限运行图形应用程序时,出现以下错误:

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

如果我不应该依赖gksu,我该如何重新编写脚本或.desktop文件以支持身份验证对话框并以root身份运行应用程序?


sudo我看到的其中一项更新说了一些有关将gksu支持集成到sudo中的内容。要查看的另一件事是sudo -A,根据手册页启动了(可能是)图形登录。
2013年

Answers:


6

首先在中创建一个.policy动作文件/usr/share/polkit-1/actions/。通常以“供应商分层”方式命名操作文件,例如com.ubuntu.pkexec.gparted.policyorg.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]用适当的值,例如geditgedit Text Editor/usr/bin/gedit<action id>值不需要与所选文件名匹配(单个文件可以包含多个操作),但是按惯例,文件名是其所有操作的前缀。

保存文件后,特定程序将与X和GUI等一起运行。

另一个解决方法似乎是:在/etc/pam.d/polkit-1中添加以下行:

会话可选pam_xauth.so


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

(基于ACPI getXuser函数)

如果您发现.desktop文件仍然无法正常工作,则可以尝试将其包装pkexec commandlinesh摘要,例如:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.