如何使用 pkexec 以 root 身份运行 GUI 应用程序?

如何使用 pkexec 以 root 身份运行 GUI 应用程序?

我在用特里克尔GNU/Linux-Libre 附带Gnome3 闪回桌面环境。

我知道我可以通过sudo&以 root 身份运行 GUI 应用程序gksudo,但我想知道如何在以下命令的帮助下以 root 身份运行 GUI 应用程序pkexec

当我尝试运行gedit(或任何其他应用程序,例如:)nautiluspkexec gedit,它会提示输入密码进行身份验证:-

截屏

输入密码后退出并出现错误:-

$ pkexec gedit
error: XDG_RUNTIME_DIR not set in the environment.

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

所以,显示环境似乎出了问题。

我也尝试过DISPLAY=:0 pkexec gedit但不起作用。


以下信息可从man pkexec:-

PROGRAM 将运行它的环境将设置为最小已知且安全的环境,以避免通过 LD_LIBRARY_PATH 或类似机制注入代码。此外,PKEXEC_UID 环境变量设置为调用 pkexec 的进程的用户 ID。因此,pkexec 将不允许您以其他用户身份运行 X11 应用程序,因为未设置 $DISPLAY 和 $XAUTHORITY 环境变量。如果操作上的 org.freedesktop.policykit.exec.allow_gui 注释设置为非空值,则这两个变量将被保留;不过,这是不鼓励的,并且只能用于遗留程序。

现在我不知道该怎么做才能实现这一目标。

因此,帮助我了解如何通过pkexec.或者这可能吗?


顺便说一句,受到gparted-pkexec命令的启发,效果很好。怎么gpartedpkexec

答案1

可以通过向策略包添加自定义操作来完成。如果您想以 root 身份运行 gedit,则pkexec必须创建新文件,/usr/share/polkit-1/actions/org.freedesktop.policykit.gedit.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.gedit">
    <description>Run gedit program</description>
    <message>Authentication is required to run the gedit</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>

最后pkexec gedit应该按预期工作。


访问联机帮助页或参考手册它用示例解释它,例如:-

$ man pkexec | grep -i ^Example -A 60
EXAMPLE
       To specify what kind of authorization is needed to execute the program /usr/bin/pk-example-frobnicate as
       another user, simply write an action definition file like this

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

             <vendor>Examples for the PolicyKit Project</vendor>
             <vendor_url>http://hal.freedesktop.org/docs/PolicyKit/</vendor_url>

             <action id="org.freedesktop.policykit.example.pkexec.run-frobnicate">
               <description>Run the PolicyKit example program Frobnicate</description>
               <description xml:lang="da">Kør PolicyKit eksemplet Frobnicate</description>
               <message>Authentication is required to run the PolicyKit example program Frobnicate (user=$(user), program=$(program), command_line=$(command_line))</message>
               <message xml:lang="da">Autorisering er påkrævet for at afvikle PolicyKit eksemplet Frobnicate (user=$(user), program=$(program), command_line=$(command_line))</message>
               <icon_name>audio-x-generic</icon_name>
               <defaults>
                 <allow_any>no</allow_any>
                 <allow_inactive>no</allow_inactive>
                 <allow_active>auth_self_keep</allow_active>
               </defaults>
               <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/pk-example-frobnicate</annotate>
             </action>

           </policyconfig>

       and drop it in the /usr/share/polkit-1/actions directory under a suitable name (e.g. matching the namespace of
       the action). Note that in addition to specifying the program, the authentication message, description, icon
       and defaults can be specified. Note that occurences of the strings $(user), $(program) and $(command_line) in
       the message will be replaced with respectively the user (of the form "Real Name (username)" or just "username"
       if there is no real name for the username), the binary to execute (a fully-qualified path, e.g.
       "/usr/bin/pk-example-frobnicate") and the command-line, e.g. "pk-example-frobnicate foo bar". For example, for
       the action defined above, the following authentication dialog will be shown:

           [IMAGE][2]

               +----------------------------------------------------------+
               |                     Authenticate                     [X] |
               +----------------------------------------------------------+
               |                                                          |
               |  [Icon]  Authentication is required to run the PolicyKit |
               |          example program Frobnicate                      |
               |                                                          |
               |          An application is attempting to perform an      |
               |          action that requires privileges. Authentication |
               |          is required to perform this action.             |
               |                                                          |
               |          Password: [__________________________________]  |
               |                                                          |
               | [V] Details:                                             |
               |  Command: /usr/bin/pk-example-frobnicate                 |
               |  Run As:  Super User (root)                              |
               |  Action:  org.fd.pk.example.pkexec.run-frobnicate        |
               |  Vendor:  Examples for the PolicyKit Project             |
               |                                                          |
               |                                  [Cancel] [Authenticate] |
               +----------------------------------------------------------+

答案2

对于我来说,使用 Ubuntu 来运行硬信息作为,

pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY hardinfo

效果很好。此提示来自保姆(法语 Ubuntu 论坛)。

答案3

$DISPLAY如果您只需要一个用户,那么您可以与给定用户共享当前的 cookie ,例如root,无需使用pam_xauth

sudo xauth -f /root/.Xauthority add $(xauth list $DISPLAY)

运行此命令后(每个会话只应执行一次),您pkexec只需共享您的即可运行 GUI 程序$DISPLAY

pkexec env DISPLAY=$DISPLAY gparted

另请注意,您很少需要将编辑器运行为root.如果您需要更改其他用户拥有的文件,您可以使用 GVfs 在任何相当现代的系统上执行此操作:

gedit admin:///etc/fstab

这就像运行 polkit 身份验证代理(要求输入密码)一样pkexec,但不是以 root 身份运行编辑器,而是给予它对单个文件的不受限制的访问权限。

相关内容