如何配置pkexec?


32

阅读以下问题和答案:

给我带来了另一个问题,它将为该命令的新用户带来问题:

  • 如何配置pkexec以便于使用?

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

(在终端中打开文件)

pkexec nano /etc/mysql/my.cnf  

(在GUI中打开文件)

pkexec gedit /etc/mysql/my.cnf  

最后一个出现以下错误:

 pkexec must be setuid root

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

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

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

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

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


1
在Ubuntu的leiu中,在13.04中负责这方面的业务,这就是我为gedit和nautilus做的事情。在这里工作正常,但不会发布答案,因为这只是我的解决方案,直到Ubuntu负责为止。ubuntuforums.org/…–
doug

嗯,不能添加评论-因此必须求助于答案...使用:alias pkexec ='pkexec env DISPLAY = $ DISPLAY XAUTHORITY = $ XAUTHORITY'意味着登录gui返回env的路径而不是命令最终被执行。有没有办法安排使用“ env DISPLAY = $ DISPLAY XAUTHORITY = $ XAUTHORITY”,以便pkexec gui返回最终执行命令的路径?请参阅此处的图片:polkit身份验证对话框

Answers:


39

如何配置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.[...]
    

    您可以在其中以以下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>
    

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

对于这三个设置标签:allow_anyallow_inactive以及allow_active策略文件中的以下选项可用:

  • :用户无权执行该操作。因此,不需要认证。
  • :用户被授权无需任何认证即可执行该操作。
  • 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定义可分为两种:

  • 在位于中的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-结构

是否有用于配置pkexec用法的GUI应用程序?

据我所知,到目前为止(2014年1月18日)还不存在这样的内容。如果将来我能找到一些东西,我也不会忘记更新此答案。


4
多么美丽的答案!!非常感谢。现在我明白了为什么我不能doublecmd使用ROOT PRIVELEGES 运行,因为我需要使用DISPLAY & XAUTHORITY!! 导出环境!只是一个小问题:编写策略或一直运行带有命令的程序有什么区别pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY doublecmd吗?
Ilia Rostovtsev

我在想@IliaRostovtsev这会pkexec变得不安全,gksudo就像通过这样的别名运行一样?可能不是别名,而是具有root权限的脚本,会更安全吗?
Aquarius Power

@AquariusPower您会以哪种方式看到它不安全?您当然可以尝试,但是我不确定。当您需要使用在“ you”下运行的GUI(X Server)和另一个需要以root用户身份运行的GUI程序时,就会出现问题。如果有发现,请四处游玩并回发。
Ilia Rostovtsev 2014年

@radu-rădeanu在Utopic auth_admin_keep上似乎无效。如果我从gui(等效于pkexec synaptic)启动突触,则每次都要求输入密码。知道为什么吗?
Khurshid Alam 2014年


0

除了Radu的答案:我不会使用别名pkexec,而是使用gksudo

为什么? 您无需重写脚本。

我使用以下配置:

  • 打开一个终端
  • 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不支持链接中的参数
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.