Gnome Shell权限提升

10
我正在构建一个Gnome shell扩展程序,希望能够以提升的权限执行某些操作。因此,我想使用“策略工具包”,但是不知道该如何实现。
例如,如果我想执行ifconfig eth0 downifconfig eth0 up等操作,可以在终端中运行pkexec ifconfig eth0 down并提示输入密码,然后就能执行相应操作。
但是从扩展程序内部该如何实现呢?我相信这与在 /usr/share/polkit-1/actions 中创建文件有关,但是我在互联网上和其他方面都找不到相关信息。
我希望能够设置这样一种方法,即无需输入密码,扩展程序就可以运行特定的命令。
我知道允许任意命令的运行是非常糟糕的主意,这也不是我的要求。我只想能够运行单个程序/命令。
编辑:我不确定是否无需输入密码是可能的。我只知道sudo在第一次之后会一段时间内不需要输入密码,所以我想要类似的功能。不确定是否可行。

这通常不会很好地工作,因为您的 shell 扩展(使用 JavaScript)将在与 shell 本身相同的进程中运行,从而使其暴露于各种安全“漏洞”... 实际上,最保险的方法是使用 pkexec 或以其他方式将特权代码的“不安全”部分隔离到单独的进程中... PS:通过 sudo 等重新提示输入密码是系统范围的安全设置;默认情况下通常会在一段时间后重新提示。 - BRPocock
@BRPocock 是的,我想使用 pkexec。我该如何在扩展程序中实现它? - Jay
2个回答

2

我很久以前就没有使用PolicyKit了,但我还记得,你确实需要在actions/目录中创建一个文件,并包含以下内容:

<?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.run-ifconfig">
    <description>Configure network</description>
    <message>Authentication is required to set ifconfig parameters</message>
    <defaults>
      <allow_any>no</allow_any>
      <allow_inactive>no</allow_inactive>
      <allow_active>...</allow_active>
    </defaults>
    <annotate key="org.freedesktop.policykit.exec.path">/sbin/ifconfig</annotate>
  </action>

</policyconfig>

您需要更改以下内容的值:
<allow_active>...</allow_active>

根据您需要的价值。选择以下价值中的一个:

  • "no" 将拒绝访问
  • "yes" 将隐式允许访问
  • "auth_user" 需要用户身份验证
  • "auth_admin" 需要管理员身份验证。
  • "auth_user_keep" 和 "auth_admin_keep" 也是如此,但在几分钟后保留身份验证。
  • 还有其他一些值,查看此处

将 allow_active 键的值更改为 "yes" 应该停止身份验证的需求。

然后你需要根据自己的需求调整操作文件并调用它。

Hugo,


1

我也曾经遇到相同的问题,试图为tuned实现选择器。这是我想出来的方法。

正如其他人所回答的那样,你可能需要编写一个策略文件(我使用了“auth_admin”)。我把它放在了“/usr/share/polkit-1/actions/tuned-adm.policy”中。我不认为我可以通过扩展模型分发它,所以我将不得不要求上游包含它。

接下来,我使用了pkexec和我的命令,得到了“sudo弹窗”,并让它工作了。

const GLib = imports.gi.GLib;
const Util = imports.misc.util;
this.pkexec_path = GLib.find_program_in_path('pkexec');
this.tunedadm_path = GLib.find_program_in_path('tuned-adm');
let result = Util.trySpawnCommandLine(this.pkexec_path + " " + this.tunedadm_path  + " list")

这里的关键是,我使用了其他几种方法来运行命令行,它们会锁定gnome-shell。我发现这里的代码:https://github.com/nodefourtytwo/gnome-shell-extension-cpu-freq/blob/master/extension.js 特别方便。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接