阅读这些问题和答案:
给我带来了另一个会给该命令的新用户带来问题:
- 如何配置
pkexec
才能方便使用?
例如,执行以下操作时:
(在终端中打开文件)
pkexec nano /etc/mysql/my.cnf
(在 GUI 中打开文件)
pkexec gedit /etc/mysql/my.cnf
最后一个出现以下错误:
pkexec must be setuid root
这让我产生了以下问题:
如何配置以避免出现这种情况?与执行相同操作时的行为方式类似(他们仅要求输入密码)
pkexec
。sudo
gksu
如果适用,如何告诉它在第一次将其应用于命令后不要要求输入密码(或者如果可配置则包括第一个命令)?
如果尚不存在,那么将配置文件保存在哪里?
是否有一个 GUI 应用程序可以配置
pkexec
使用情况(Policy Kit)?
答案1
如何配置pkexec
以避免运行 GUI 应用程序时出现错误?
我发现了两种可能的方法:
如您所见,使用以下内容:
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'
或者,(再次)如
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_any
,allow_inactive
并且allow_active
从策略文件中,可以使用以下选项:
- 不:用户无权执行此操作。因此无需进行身份验证。
- 是的:用户无需任何身份验证即可执行该操作。
- auth_self:需要身份验证,但用户不需要是管理用户。
- 管理员权限:需要以管理用户身份进行身份验证。
- auth_self_keep:与auth_self但是,
sudo
授权只持续几分钟。 - auth_admin_keep:与管理员权限但是,
sudo
授权只持续几分钟。
因此,如果你使用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
参考:
- https://dev.to/logix2/another-gksu-alternative-for-ubuntu-xorg-2356
- https://forums.linuxmint.com/viewtopic.php?t=325571
- 如何配置 pkexec?
- PKEXEC:没有显示名称,也没有 $DISPLAY 环境变量
- https://www.freedesktop.org/software/polkit/docs/0.105/pkexec.1.html
- https://linuxconfig.org/how-to-create-custom-desktop-files-for-launchers-on-linux