这是一个关于 *nix 的设计选择的问题,而不是如何避免它的问题。
要求 root 访问才能安装大多数软件包的目的是什么?要求您使用 root 似乎是一个潜在的安全漏洞,因为大多数软件包不需要修改内核或需要 root 权限才能运行。如果目的只是为了节省空间,为所有用户在每台机器上安装一次软件包,那么为什么不为此目的使用不同的非 root 用户呢?
更新:我在这里假设没有 root 访问权限的软件包将不会安装到受 root 保护的目录中,而是安装到其他地方。
答案1
正如其他人在评论中指出的那样,要求 root 权限的一个明显原因是预构建的软件包会安装到共享系统目录中,而这些目录不应由任何人写入。为什么不是“其他非 root 用户”?我想说,因为有足够多的软件包需要更改共享系统文件和目录,所以不值得花那么多精力去跟踪哪些软件包真正需要 root 权限,哪些不需要,而且不以 root 身份安装也不会给你带来太多好处 —— 你已经对很多核心软件包的供应商充满信心,所以再多一些又有什么用呢。但最终,是的,存在安全性权衡,而且似乎供应商已经决定在这里以简单取胜。
这让我们想到一个问题:为什么软件包不能直接安装到用户的主目录中。实际上,在许多情况下,它们可以,但前提是你使用基于源代码的发行版,如 Gentoo。在这种情况下,你只需使用适当--prefix
或类似的参数编译程序(许多但不是全部的软件都支持这样的概念)。然而,大多数发行版都是基于二进制的,在这种情况下,问题在于许多 Unix 程序的编写方式是,在编译时将各种路径硬编码到程序中,当你处理成千上万个软件包及其维护者时,需要大量的工作和协调才能改变这种情况。在 Unix 世界中,协调尤其困难,因为系统供应商相对较多,不像 Windows,微软可以在很大程度上决定更改——甚至微软也难以让每个人都遵守规定,因此需要采取兼容性措施,例如UAC 虚拟化。
更深入地探讨硬编码路径问题,考虑一个foo
需要访问某种数据库的程序。这个文件在哪里?一个合理的路径是/usr/share/foo/foo.db
,它将被硬编码到程序中,以便它确切地知道在哪里查找。您可能会反对,$HOME/usr/share/foo/foo.db
如果程序找不到其硬编码文件,它可以简单地尝试或类似操作。这是真的,而且会很好,只是这种事情没有真正的标准或惯例,所以大多数程序只是没有实现这样的后备机制(再次是协调问题)。并且可以说,它还增加了复杂性,使相对较少的用户群体受益,但这是另一个麻烦。
一个相关的问题是程序如何加载它所依赖的共享库。动态链接器ld.so
需要知道在哪里可以找到所有这些共享库。基本上,可以在编译时将路径列表(再次)硬编码到可执行文件中,在这种情况下ld.so
将首先搜索这些路径;如果失败,则ld.so
搜索在中配置的目录。这个问题实际上相对容易克服,例如,通过适当/etc/ld.so.conf
设置环境变量。LD_LIBRARY_PATH
因此,归根结底,很多程序在设计时并没有考虑到如何(在运行时)灵活地查找文件,因此,打包开发人员认为提供安装到备用目录的选项是没有意义的。这并不是说这在技术上是不可能的——只是到目前为止,还没有意愿去创建一个标准并让每个人都遵循它。举个例子来说明这在技术上并非不可能,你可以看看我对这个问题的回答:无需 sudo 在服务器上安装 git。请注意,这是一种多么丑陋的解决方法,这就是事情的悲哀状态。
需要说明的是,我实际上和您一样,对于无法轻松地将二进制包安装到其他位置感到沮丧,并且多年来,当系统管理员不配合安装我想要使用的包时,我花费了大量的时间和精力,要么手动编译包,要么解决打包问题(方式类似于我在上一段中链接的问题)。