从以下问题
我们看到 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 身份运行应用程序?
答案1
首先在 中创建一个.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
答案2
用户脚本的另一个修复方法是:确定脚本内适当的环境变量。
您可以使用如下代码片段来执行此操作:
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
(基于ACPIgetXuser
功能)
如果您发现.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