使用policykit+dbus代替gksu运行图形应用程序

1 投票
2 回答
1446 浏览
提问于 2025-04-16 21:56

我在找一个命令,它能像gksu或beesu那样工作,但需要依赖policykit。

关于policykit和dbus的文档有点复杂,看起来不太清楚。

我找到了“pkexec”,但是在尝试运行图形应用程序时,它会显示错误。

pkexec gedit

结果:

(gedit:7243): Gtk-WARNING **: cannot open display: 

2 个回答

0

大多数图形程序都需要使用dbus,所以即使你成功运行了它,也可能会出现问题。对于gnome程序,至少需要设置以下几个变量:'SESSION_MANAGER', 'DBUS_SESSION_BUS_ADDRESS', 'DISPLAY', 'GNOME_DESKTOP_SESSION_ID', 'XAUTHORITY'。而对于kde程序,你需要设置这些变量:'SESSION_MANAGER', 'DBUS_SESSION_BUS_ADDRESS', 'DISPLAY', 'KDE_FULL_SESSION', 'XAUTHORITY'。我觉得pkexec至少需要'XAUTHORITY'和'DISPLAY'这两个变量,才能连接到xorg服务器。

2

你需要在 /usr/share/polkit-1/actions 目录下创建一个 action definition file,这个文件要用 XML 格式写。

把这个文件复制到 /usr/share/polkit-1/actions/com.example.gedit 这个位置:

<?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="com.example.gedit">
    <message gettext-domain="gedit">Authentication is required to run gedit as root</message>
    <icon_name>accessories-text-editor</icon_name>
    <defaults>
      <allow_any>auth_admin</allow_any>
      <allow_inactive>auth_admin</allow_inactive>
      <allow_active>auth_admin</allow_active>
    </defaults>
    <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/gedit</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
  </action>

</policyconfig>

这里的 org.freedesktop.policykit.exec.allow_gui = true 设置会允许 gedit 连接到你的 Xorg 服务器。这样它会自动把 XAUTHORITYDISPLAY 这些信息传递给它。

撰写回答