如何配置pkexec?

Lui*_*ado 34 command-line sudo pkexec

阅读这些问题和答案:

给我带来了另一个会给该命令的新用户带来问题的问题:

  • 如何配置pkexec方便使用?

例如,在执行以下操作时:

(在终端中打开文件)

pkexec nano /etc/mysql/my.cnf  
Run Code Online (Sandbox Code Playgroud)

(在 GUI 中打开文件)

pkexec gedit /etc/mysql/my.cnf  
Run Code Online (Sandbox Code Playgroud)

最后一个得到以下错误:

 pkexec must be setuid root
Run Code Online (Sandbox Code Playgroud)

现在这给我带来了以下问题:

  1. 如何配置pkexec以避免得到这个?类似于如何sudo/gksu做同样的事情时的行为(他们只要求输入密码)。

  2. 如果适用,如何告诉它在第一次将其应用于命令(或如果可配置的情况下包括第一个命令)后不要求输入密码?

  3. 如果配置文件不存在,在哪里保存?

  4. 是否有用于配置pkexec使用情况的 GUI 应用程序(策略工具包)?

Rad*_*anu 48

如何配置pkexec以避免在运行 GUI 应用程序时出错?

我找到了两种可能的方法:

  1. 如您所见,使用以下内容:

    pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY gedit
    
    Run Code Online (Sandbox Code Playgroud)

    不会给你任何错误。这是正常的,因为man pkexec在这件事上很清楚:

           [...] pkexec will not allow you to run X11 applications
           as another user since the $DISPLAY and $XAUTHORITY environment
           variables are not set.[...]
    
    Run Code Online (Sandbox Code Playgroud)

    因此,您可以创建一个(永久)别名(这是最简单的方法):

    alias pkexec='pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者,(再次)如man pkexec说:

           [...] These two variables will be retained if the
           org.freedesktop.policykit.exec.allow_gui annotation on an action is set
           to a nonempty value; this is discouraged, though, and should only be
           used for legacy programs.[...]
    
    Run Code Online (Sandbox Code Playgroud)

    您可以使用以下 xml 代码/usr/share/polkit-1/actions命名创建一个新的策略文件,com.ubuntu.pkexec.gedit.policy其中最重要的是设置org.freedesktop.policykit.exec.allow_gui为非空值:

    <?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.ubuntu.pkexec.gedit">
        <message gettext-domain="gparted">Authentication is required to run gedit</message>
        <icon_name>gedit</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>
    
    Run Code Online (Sandbox Code Playgroud)

在第一次将密码应用于命令后,如何告诉它不要求输入密码?

对于这三种设置标签:allow_any,allow_inactive并allow_active从政策文件,下面的选项:

  • no:用户无权执行该操作。因此不需要认证。
  • yes : 用户被授权执行操作而无需任何身份验证。
  • auth_self:需要身份验证,但用户不必是管理用户。
  • auth_admin:需要以管理用户身份进行身份验证。
  • auth_self_keep:与auth_self相同,但像 一样sudo,授权持续几分钟。
  • auth_admin_keep:与auth_admin相同,但像 一样sudo,授权持续几分钟。

     资料来源:Polkit - 结构 - 动作

因此,如果您使用auth_admin_keep选项(或,如适用,auth_self_keep),pkexec则在一段时间内不会再次要求输入密码(默认情况下,我检查时此时间设置为 5 分钟)。这里的缺点是这个东西只适用于一个 - 相同 - 命令/应用程序并且对所有用户有效(除非它在以后的配置中被否决)。

如果配置文件不存在,在哪里保存?

配置文件或polkit定义可以分为两种:

  • 操作在位于 .policy 的 XML .policy 文件中定义/usr/share/polkit-1/actions。每个操作都有一组附加的默认权限(例如,您需要标识为管理员才能使用 GParted 操作)。默认值可以被否决,但编辑操作文件不是正确的方法。此策略文件的名称应具有以下格式:

    com.ubuntu.pkexec.app_name.policy
    Run Code Online (Sandbox Code Playgroud)
  • 授权规则在 JavaScript .rules 文件中定义。它们可以在两个地方找到:3rd 方包可以使用/usr/share/polkit-1/rules.d(尽管很少使用)并且/etc/polkit-1/rules.d用于本地配置。.rules 文件指定用户的子集,参考在动作文件中指定的一个(或多个)动作,并确定该/那些用户可以采取哪些限制措施。例如,在使用 GParted 时,规则文件可能会否决所有用户作为管理员进行身份验证的默认要求,确定某些特定用户不需要。或者根本不允许使用 GParted。

     资料来源:Polkit - 结构

是否有 GUI 应用程序来配置pkexec使用情况?

据我所知,直到现在(18.01.2014)都不存在这样的事情。如果将来我会找到一些东西,我也不会忘记更新这个答案。

  • 多么漂亮的答案!!非常感谢。现在我明白为什么我不能使用 ROOT PRIVELEGES 运行 `doublecmd`,因为我需要使用 `DISPLAY &amp; XAUTHORITY` 导出环境!!只是一些小问题:在编写策略或仅运行带有命令的程序时,始终有什么区别吗?“pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY doublecmd”? (4认同)