如何配置pkexec不要求输入密码?


12

我有一个GUI应用程序,需要使用超级用户权限调用守护程序(用Python编写)。我想这样做而不提示用户输入密码。

由于守护程序是一个脚本,因此我无法直接设置SUID位。我可以为此编写一个C包装程序,但是我不想重蹈覆辙,尤其是当我自己的一个错误可能导致系统的安全性受到严重损害时。

在这种情况下,我通常要做的是添加一行/etc/sudoers,允许用户使用NOPASSWD指令以root用户身份执行守护程序而无需输入密码。从命令行可以正常工作。但是,当我从GUI进行此操作时,会pkexec弹出一个对话框,询问用户密码。看来在Ubuntu上,sudo从GUI进行的调用以某种方式被拦截pkexec

有没有解决的办法?我真的宁愿不必处理setuid脚本的麻烦。


您说什么应用程序?
RaduRădeanu13年

任何GUI应用程序。当GUI应用程序尝试运行时sudo somecommandpkexec无论是否存在允许程序执行的sudoers策略,弹出的对话框都是密码对话框。
Chinmay Kanchi 2013年

Answers:


14

这么说是不恰当的:“似乎在Ubuntu上,以sudo某种方式截获了从GUI的调用pkexecpkexec与没什么共同点sudo。与相比sudopkexec不会向整个进程授予root权限,而是允许对集中式系统策略进行更好的控制。

现在,如果您想运行GUI应用程序而不会被询问pkexec,则这并不难。让我们以GParted为例。当您打开它时,您将看到以下对话框窗口,要求您输入密码:

认证

单击详细信息,对话框窗口现在如下所示:

gparted身份验证-详细信息

从这里开始,只需使用以下命令打开文件:/usr/share/polkit-1/actions/com.ubuntu.pkexec.gparted.policy

gksu gedit /usr/share/polkit-1/actions/com.ubuntu.pkexec.gparted.policy

并更改以下几行:

      <allow_any>auth_admin</allow_any>
      <allow_inactive>auth_admin</allow_inactive>
      <allow_active>auth_admin</allow_active>

具有以下内容:

      <allow_any>yes</allow_any>
      <allow_inactive>yes</allow_inactive>
      <allow_active>yes</allow_active>

保存文件并关闭它。接下来,当您打开GParted时,将不再要求您输入密码。


是的,pkexec确实确实拦截了对sudo的调用。让我看看是否可以构建这种行为的最小示例。
Chinmay Kanchi 2013年

我无法在一个简单的应用程序中复制此代码,它可能仅在某些非常特殊的情况下发生,并且我没有时间跟踪该错误。我要接受你的回答。干杯。
Chinmay Kanchi 2013年

@ChinmayKanchi让我们更加清楚。我再举一个例子gparted。当您从terminal运行时sudo gparted,您/usr/sbin/gparted将以root特权运行文件。当你开始gparted从GUI,你其实开始gparted-pkexec(您可以验证这里面/usr/share/applications/gparted.desktop是文件)/usr/bin/gparted-pkexec:这是一个shell脚本,其目的是运行以下命令pkexec "/usr/sbin/gparted"相当于拥有了pkexec gparted。因此,与无关sudo。而且您应该在终端中使用此命令,而不是sudo gparted
RaduRădeanu2013年

1
@ChinmayKanchi sudo仅应用于外壳程序应用程序,而不应用于GUI应用程序。见man sudoman pkexec在这个意义上。
RaduRădeanu2013年

是的,我知道您的两点。我的情况是我有一个GUI应用程序(由我编写),尝试使用sudo启动外壳程序(守护程序,也由我编写)。由于某种原因,这样做会导致调用pkexec而不是sudo,这意味着我为守护程序创建的所有sudo策略都会被忽略。
Chinmay Kanchi 2013年
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.