如何将软件中心设置为允许非root用户安装软件?

如何设置软件中心,允许非root用户从Ubuntu存储库安装内容而无需输入密码?

我完全了解安全性的影响,并且我愿意冒险。Fedora 12带有类似的功能。(通过修改PolicyKit配置,我相信)


5值得注意的是,在天塌下来之后,Fedora也撤回了支持。 - Nicholas Knight
是的,我记得那个。这只在桌面电脑上有一个或两个用户时才有意义。 - dieki
请记住,一些应用市场软件(如软件中心)允许更改系统仓库。自助式的软件包服务存在风险,但用户添加不受信任的软件源则非常危险。 - Alfonso E.M.
5个回答

你可以修改PolicyKit的权限,允许用户访问软件中心使用的aptdaemon后端。
`dpkg --listfiles aptdaemon`显示`/usr/share/polkit-1/actions/org.debian.apt.policy`是指定在aptdaemon后端上可能发生的操作的文件。
浏览该文件,``标签指定了可能的操作。你可能希望使用`org.debian.apt.install-packages`允许用户从存档中安装新软件包,并使用`org.debian.apt.update-cache`允许用户更新软件包列表。
请查看`man pklocalauthority`,其中记录了如何设置PolicyKit操作的本地权限。将以下内容放入`/etc/polkit-1/localauthority/50-local.d/10-allow-users-to-install.pkla`将允许任何已登录到本地计算机的用户在键入自己的密码之后安装软件包(即使他们不在管理员组中),并且无需键入任何密码即可更新软件包缓存。
[Untrusted Install]
Action=org.debian.apt.install-or-remove-packages
ResultyAny=no
ResultInactive=no
ResultActive=auth_self

[Untrusted Update]
Action=org.debian.apt.update-cache
ResultAny=no
ResultInactive=no
ResultActive=yes

Kubuntu的策略(至少在Natty和Oneiric中)位于/usr/share/polkit-1/actions/org.kubuntu.qaptworker.policy - Lekensteyn
Kubuntu的使用说明可以在我的回答中找到。 - Lekensteyn
救命稻草 - 谢谢伙计!我不得不添加Identity=*才能让它工作,改编自http://askubuntu.com/a/123260。另外,有没有办法在例如`/var/log/auth.log`(或任何其他日志文件)中获取更多的策略工具日志输出?我只收到“身份验证失败”的消息,但没有失败原因... - ssc

我认为目前无法通过图形界面来实现,但以下方法应该可以,尽管有点笨拙。结果可能因人而异。
请在/etc/sudoers文件中添加以下行(使用sudo visudo命令编辑文件):
%packageinstallers ALL = NOPASSWD: /usr/bin/software-center /usr/bin/apt-get

然后,您只需要创建并将特定用户添加到packageinstallers组中:
$ sudo addgroup packageinstallers
$ sudo adduser jdoe packageinstallers

现在,jdoe可以做以下事情:
$ sudo apt-get install <some-package>

你可以编辑桌面菜单项的“软件中心”,使其调用software-center,并在命令前加上gksudoPolicyKit可能允许您在不使用sudo的情况下执行此操作,但这超出了我的理解范围。

他们能够通过Synaptic或aptitude安装吗,还是只能用apt-get? - dieki
如果你将"/usr/bin/synaptic"添加到列表中,它将有效。实际上,你可能还可以将"/usr/bin/software-center"添加到列表中,它应该能工作。不过我没有测试过,请告诉我是否有效,我会更新答案。 - lfaraone
我会试一试的。 :) - dieki
这将需要用户知道使用sudo运行软件中心,或者您修改.desktop文件。请查看我的答案,了解如何调整PolicyKit以实现您想要的功能。 - RAOF
同意,那将是一个更优越的解决方案。 - lfaraone

RAOF的回答只适用于Ubuntu。Kubuntu使用QAptWorker作为后端(在Natty和Oneiric中观察到)。为了允许非root安装,创建/etc/polkit-1/localauthority/50-local.d/10-allow-non-root-install-packages.pkla文件,内容如下:

[Update Software Sources]
Action=org.kubuntu.qaptworker.updateCache
ResultAny=no
ResultInactive=no
ResultActive=yes

[Install Software]
Action=org.kubuntu.qaptworker.commitChanges
ResultAny=no
ResultInactive=no
ResultActive=auth_self

我想允许一些非管理员用户安装软件,而不直接授予sudo访问权限。这可以通过在两个配置组中插入下面的行来实现:
Identity=unix-user:some-non-admin-user

如果有一个必须被授予权限的群组,请使用unix-group而不是unix-user

重新应用规则,我重新启动了。(重新登录可能也可以) - Lekensteyn
你应该怎么做这个?即使在执行 sudo -i 之后,我甚至都无法访问 /etc/polkit-1/localauthority(Ubuntu 17.10):“不会尝试处理目录 /etc/polkit-1/localauthority”。 - JHBonarius

如果您只需要一般的权限来允许/禁止软件包安装,请使用PolicyKit。
不幸的是,PolicyKit对要安装的软件包没有精细控制。如果您想给用户权限仅安装一组受限的应用程序,您应该使用sudo并安装类似softwarechannels的东西...
我也在寻��类似的解决方案,但由于没有找到任何东西,我编写了这个简单的解决方案"softwarechannels",在GitHub上可用
这是一个非常简单的系统,允许普通(非管理员)用户从受限目录安装软件包。
只需在一个简单的文本文件中定义'channels'(软件包组),并给予用户启动softwarechannels的权限。
他们只能看到与他们Unix组匹配的channels中的软件包。

为了在我的Ubuntu 18.04上使其工作,我不得不更改/etc/polkit-1/localauthority/50-local.d/10-allow-users-to-install.pkla文件为:
[Untrusted Install]
#Action=org.debian.apt.install-or-remove-packages
Action=org.freedesktop.packagekit.package-*
ResultyAny=no
ResultInactive=no
ResultActive=auth_self
Identity=*

[Untrusted Update]
Action=org.debian.apt.update-cache
ResultAny=no
ResultInactive=no
ResultActive=yes
Identity=*

[Admin Install]
#Action=org.debian.apt.install-or-remove-packages
Action=org.freedesktop.packagekit.package-*
ResultyAny=no
ResultInactive=no
ResultActive=yes
Identity=unix-group:adm

此外,根据最新的规定,我允许所有adm组的成员在安装或卸载时无需输入密码。