我如何仅为单个用户安装DEB文件应用程序?

通过软件中心或者使用DEB文件安装应用程序时,通常会将其系统范围内安装给所有用户。
有没有办法只为单个用户安装应用程序?

如何在没有根权限的情况下安装软件包? - Real
6个回答

好的,dpkg 对此并没有帮助,因为这不是它的设计目的。它想成为系统上安装软件包的根所有者唯一的普查。

唯一能想到的事情就是提取软件包并尝试手动将文件放置在主目录中。

然而,这只对某些东西有效。许多软件包被分成块(在/usr/bin中的可执行文件或脚本,在/lib中的库以及在/usr/share中的其他垃圾等),这些位置由构建脚本硬编码。因此,如果您尝试将这样的东西拉入~中,它将会破裂。您可以花费数小时来解开依赖关系,但您可以利用自己的时间做一些有用的事情,比如找到治愈癌症的方法或吸收世界上的美。

最好的方法是从编写软件的人那里获取非打包版本。几乎所有免费软件都以某种形式的压缩存档作为源代码提供,因此获取并构建即可。您不需要进行make install步骤。您的应用程序已经构建完成,只需将其放在所需位置即可。


1对于最后一个选项:在某些(简单的程序)情况下,它似乎可以帮助,但通常例如包会安装初始化脚本到/etc/init,在/etc中寻找配置文件,或者有一些其他硬编码路径。 - arrange
2基于_autoconf_的项目可以通过./configure --prefix=$HOME/local设置自定义安装目录。 - Ingo Karkat

我对这个主题了解不太多,但从其他答案来看,您可能可以使用 dpkg--root 参数将软件包安装到另一个目录而不是 /,然后通过 chroot 进入此软件包被“安装”的目录(当然可以是用户的主目录中的一个目录)。

要为除 root 之外的用户安装软件包,可能可以尝试使用 fakechroot 替代 chroot 来进行上述过程。

免责声明:我没有尝试过这个方法,并且在撰写本文时对 dpkgchroot 的经验不多,但根据我对这些工具的了解,这种方法有可能有效。

以下链接提供了一些信息,对于希望在没有 root 权限的情况下实现类似 chroot 效果的人可能会有所帮助:

更新

现在我已经对与这个主题有关的一些事情有了一些了解,并发现了更多信息...

碎片(本地环境构建块):
  • Fakechroot - 模拟 chroot(1)
  • Debootstrap - 在目录中创建另一个Debian文件系统层次结构
  • Fakeroot-NG/fakeroot - 可以假装成根用户执行某些操作
  • EmDebian - 一种使用更少空间的Debian变体,通常在chroot环境中使用
  • binfmt_misc - 可以运行文件,并使用其解释器,就像它们是本地二进制文件一样;与qemu-user一起使用时非常有用,用于处理外部架构的二进制文件(QEMU源代码附带的scripts/qemu-binfmt-conf.sh可以自动化此过程)
  • Qemu user space - 可以运行其他架构的二进制文件;当这些工具不支持某些处理器架构时,可以与其中一些工具一起使用
  • LwIP - 一种可以从用户空间运行的TCP/IP网络堆栈

完整(完整的本地环境提供者):

  • 用户模式Linux - 作为常规进程/程序运行另一个Linux系统
  • Qemu - 运行完整的虚拟计算机
  • PRoot - 提供chroot(1)mount --bindbinfmt_misc功能,并使用qemu-user-space运行其他架构的二进制文件
  • Linux命名空间 - 允许在本地环境中拥有完全的根权限,当使用用户命名空间时,这是Linux内核版本3.8及以后的特性。

摘要:通过模拟或实际拥有本地的根权限,可以为本地环境安装DEB软件包。


3如果你有与之前信息相矛盾的新信息,或者认为它能够增加一些内容,可以随意重新格式化你的回答。在许多情况下,通过重新表述而不是添加额外的“编辑”或“更新”部分,你的回答会更清晰明了。你提供的信息很有趣,但可能最相关的部分却被埋藏在底部。 - belacqua
@jgbelacqua - 重新格式化,谢谢你的建议。 - Abbafei

根据您想要达成的目标,可能有不同的方法使其工作(或者至少提供您想要的功能的hacky类似物)。
在许多方面,软件的安装归结为使资源可用,或允许访问系统上已经存在的东西。
无论是谈论授予对打印机的访问权限,还是允许用户在某个目录中执行程序,都有办法实现这一点,虽然它们可能是Ubuntu本地的,但这些解决方案通常会在.deb安装后添加。
以下是可以添加的两种后安装控制的一般类别。请注意,在适当的环境下,例如当强制执行紧密控制的组策略时,一旦您建立了基本系统,这可能更容易。这种权限甚至可以与LDAP或类似的系统相关联,该系统可以提供按用户或组进行身份验证和授权。 可见性控制
我自己曾经遇到过一个也许有些相似的情况,但在我的情况下,用户(全部都是7岁以下的孩子)并不(尚未)非常复杂。对我来说,只需隐藏Gnome菜单和/或删除桌面启动器即可。
从目录中删除可执行位会使进程无法搜索或遍历它们。这可以有效地使它们变得不可见,并且对用户来说,使它们变得不可用。例如,如果您有一个默认的系统策略,根据文件访问创建菜单,您可以采取这种化妆品解决方案,并且在随后的安装中只需进行少量额外的工作即可使其生效。 执行控制 通过Unix权限、apparmor配置文件、SELinux权限等方式可以对资源进行控制。根据应用程序的不同,可能还会有其他级别的控制过滤器起作用。如果没有更具针对性的解决方案,您可能需要编写特定程序的包装器来控制用户或进程的访问。

3+1 用于分离可见性和执行控制方面 - Takkat

你可以尝试使用dpkg--root选项来安装到另一个目录。但是如果应用程序在固定位置(如/etc)寻找文件,可能会遇到问题。
简而言之,我认为没有简单的方法。

您可以更改可执行文件的所有权,以便只有一个用户能够运行它。然后,如果需要的话,您可以将该应用程序从其他用户的菜单中删除。

1安装一个应用程序只针对单个用户的共同动机是避免需要使用管理员权限进行安装。 - ændrük
但如果他已经从.deb文件安装了,我们不是默认有管理员权限吗? - belacqua
据我所知,是的,从 .deb 安装需要管理员权限。但更一般地说,安装“仅限单个用户使用”的东西不应该要求提升到用于系统范围管理的特权。例如,我经常通过将程序放在 ~/bin 中仅为自己安装程序。这个问题存在一个模糊之处,即 Takkat 是否想限制多用户应用程序的访问/可见性,还是他想安装一个单用户应用程序。你和 arrange 的问题使用了前者的解释,而其他人则假设了后者。 - ændrük

怀疑的。
deb文件主要是在安装时解压到文件系统的根目录(以及一些配置文件)。如果你想只为一个用户安装它们,你需要将它们安装到/home/user文件夹中。即使你这样做了,它们也不会起作用,因为应用程序二进制文件不会出现在/usr/bin(或类似的位置),如果你尝试启动它们,系统将找不到它们。同样,库等也将无用,因为系统不会知道它们在/home中的某个位置。你可以尝试“蛮力方法”,调整PATH变量以指向你从deb文件中提取的文件所在的位置,但这不仅非常不安全,而且可能会导致许多兼容性问题(例如,菜单项将无法工作,因为GNOME期望.desktop文件位于/usr/share/applications中)。
此外,如果你只为某些用户安装了一个软件包,那么如果其他用户安装了与你自己安装的软件包冲突的软件包,可能会导致疯狂的依赖问题,并可能出现大量其他与软件包管理相关的问题。
所有这些麻烦使得为用户单独管理软件包变得极其困难,因此似乎不可能仅为一个用户安装它们,因为.deb文件的设计理念不允许这样做。