如何配置 pkexec?

如何配置 pkexec?

阅读这些问题和答案:

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

  • 如何配置pkexec才能方便使用?

例如,执行以下操作时:

(在终端中打开文件)

pkexec nano /etc/mysql/my.cnf  

(在 GUI 中打开文件)

pkexec gedit /etc/mysql/my.cnf  

最后一个出现以下错误:

 pkexec must be setuid root

这让我产生了以下问题:

  1. 如何配置以避免出现这种情况?与执行相同操作时的行为方式类似(他们仅要求输入密码)pkexecsudogksu

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

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

  4. 是否有一个 GUI 应用程序可以配置pkexec使用情况(Policy Kit)?

答案1

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

我发现了两种可能的方法:

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

    pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY gedit
    

    不会出现任何错误。这是正常的,因为man pkexec这件事非常清楚:

           [...] pkexec will not allow you to run X11 applications
           as another user since the $DISPLAY and $XAUTHORITY environment
           variables are not set.[...]
    

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

    alias pkexec='pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY'
    
  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.[...]
    

    您可以在/usr/share/polkit-1/actions名为的文件中创建一个新的策略文件com.ubuntu.pkexec.gedit.policy,其中包含以下 xml 代码,其中最重要的是设置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>
    

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

对于这三个设置标签:allow_anyallow_inactive并且allow_active从策略文件中,可以使用以下选项:

  • :用户无权执行此操作。因此无需进行身份验证。
  • 是的:用户无需任何身份验证即可执行该操作。
  • auth_self:需要身份验证,但用户不需要是管理用户。
  • 管理员权限:需要以管理用户身份进行身份验证。
  • auth_self_keep:与auth_self但是,sudo授权只持续几分钟。
  • auth_admin_keep:与管理员权限但是,sudo授权只持续几分钟。

     来源:Polkit - 结构 - 行动

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

如果尚不存在,那么将配置文件保存在哪里?

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

  • 操作在位于 的 XML .policy 文件中定义/usr/share/polkit-1/actions。每个操作都附加了一组默认权限(例如,您需要以管理员身份使用 GParted 操作)。可以推翻默认设置,但编辑操作文件不是正确的方法。此策略文件的名称应采用以下格式:

    com.ubuntu.pkexec.app_name.policy
  • 授权规则在 JavaScript .rules 文件中定义。它们位于两个位置:第三方软件包可以使用/usr/share/polkit-1/rules.d(尽管很少有人使用)和/etc/polkit-1/rules.d用于本地配置。.rules 文件指定用户子集,引用操作文件中指定的一项(或多项)操作,并确定该用户/那些用户可以采取这些操作的限制。例如,规则文件可以否决所有用户在使用 GParted 时以管理员身份进行身份验证的默认要求,确定某些特定用户不需要这样做。或者根本不允许使用 GParted。

     来源:Polkit——结构

是否有一个 GUI 应用程序可以配置pkexec用法?

据我所知,到目前为止(2014 年 1 月 18 日)还不存在这样的事情。如果将来我发现了什么,我也不会忘记更新这个答案。

答案2

除了 Radu 的回答之外:我不会使用别名 pkexec,但是执行命令

为什么? 您不需要重写脚本。

我使用以下配置:

  • 打开终端
  • cd /usr/local/bin
  • sudo gedit gksudo (创建名为“gksudo”的新文件
  • 写入以下内容:

    • pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY $@

    • (不要忘记$@最后的。这是用于重定向所有参数)

  • 保存并退出

  • 使文件可执行:chmod 755 gksudo
  • 现在你的系统上应该有一个功能齐全的 gksudo 命令 - 永久可用。

出于文档的原因,我将写下我尝试过但没有成功的方法:

  • 别名 pkexec='pkexec env [...]'
  • 别名 gksudo='pkexec [...]'
    • 不是永久的并且只停留在一个航站楼
  • 添加别名~/.bash_aliases
    • 如果您先打开终端,则有效。如果您双击脚本,则无效
  • 创建带有参数的 pkexec 链接(ln -s pkexec [...]
    • 经过快速谷歌搜索,似乎 Linux 不支持链接中的参数

答案3

与@Radu Rădeanu 的回答相反,我的回答解释了如何创建pkexec命令并对其进行配置以使其正常工作gksu

因此,GUI 版本的主要替代方法sudo是使用pkexec命令,但为此您需要在执行时导出某些环境变量,这可以通过在文件中添加以下别名来完成~/.bashrc

alias gksu='pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS'

现在为了使用它,您可以运行以下命令:

# structure: gksu <cmd>
$ gksu /usr/bin/my_app

参考:

相关内容