为什么 apt-get 需要 sudo?

为什么 apt-get 需要 sudo?

这可能是一个愚蠢的问题,但我最近意识到我不知道为什么apt-get 没有单用户功能。

我不想要的答案:

  • “这是因为 apt 写入了系统级目录”。这只是表面层面的原因,但我正在寻找更深层次的原因。是否有什么东西从根本上阻碍了单用户环境(例如 pip + virtualenv)?
  • “您可以直接从源代码构建”。这是一种解决方法,但不能解决我的问题。我不想修复短期问题,而且无论如何我在所有机器上都有 root 访问权限。

答案1

为什么 apt-get 需要 sudo?

并非总是如此。你可以完美地使用apt-get而不使用sudo。有些情况下你sudo根本不需要,例如使用apt-get downloadwhich 下载包到当前目录apt-get source它将 Debian 源文件下载到您当前的目录,changelog下载并打印给定包的更改日志,以及任何带有--simulate//--dry-run的命令(在您也需要--no-act的情况下)。install--no-download

这是因为这些操作/命令不需要写入系统目录。

现在,为什么apt-get需要sudo?实际上不需要。您可以放弃 apt-get,使用 来下载软件包wget,然后使用并将软件包提取到您喜欢的任何目录中。对于仅二进制软件包,dpkg --extract还有。--instdir

现在,为什么这不是默认设置?因为这很麻烦。为了做你想做的事,我们需要重新打包每个包两次,一次是为了正确的方式,另一次是为了做你想做的事。在构建时,二进制文件通常需要知道它们需要的文件和库在哪里(在某些情况下,这是在编译时硬编码的)。

现在,你可以做什么呢?只需 chroot 一些环境即可。啊啦virtualenv,您可以在其中无需 root 权限安装软件包。

总结一下,这不是 apt-get 的本意,我不知道还有哪个包管理器可以像 apt-get 一样允许你这样做。归根结底,它apt-get只是 dpkg 的一个前端,可以完成一些这样的工作。

答案2

这不是一个愚蠢的问题。

你要问的是,为什么 Apt仅有的在系统级别安装软件需要超级用户权限?为什么不能在用户级别选择性地安装软件,而不需要这样的权限?

简短而圆滑的回答是,这不是 Apt 的职责。Apt 的职责是管理和安装构成您计算机一部分的软件。系统。如果您想在用户级别安装软件,您可以自己安装,但不要使用 Apt。您可以自己编译,或者从某处获取静态编译的二进制文件,或者使用 flatpak 之类的东西。或者使用您自己的部署方法。

Apt 的作用

Ubuntu 是一个 Linux 发行版。Linux分配其核心是来自许多不同来源的软件的集合,所有这些软件都被发行版的管理员收集到一个地方,以便您可以从中安装完整的、可以运行的系统。

为了实现这一点,发行版不能只是提供完全不经修改的软件 - 对于构成系统一部分的每个软件,它都必须以特定的方式将其“安装”到系统中,以便它与该系统上的其他软件正确地协同工作。

Ubuntu 等发行版维护存储库组成该系统的软件。存储库由许多软件包组成,这些软件包是系统的独立部分,可以单独选择和安装。每个这样的软件包都以允许将其安装到工作系统中的方式布局其中的软件,因此所有软件和支持文件都已位于它们将驻留在目标系统上的目录路径中。除此之外,软件包还附带安装、配置和/或卸载脚本,用于执行任何其他所需的工作。

软件包内文件的布局以及软件包中的安装/配置/卸载脚本都假设软件包是整个系统的一部分。因此,很难找到单个软件包并安装它别的地方,因为脚本和包的布局不是为此设计的。

除此之外,系统中的软件包经常被其他软件包所依赖。而且,如果软件包中的软件被依赖——依赖性另一个包,它必须被放置在文件系统中的正确位置,并且在许多情况下,必须运行安装和配置脚本以确保它被正确安装。

Ubuntu 和 Debian 上安装软件包并运行其安装/配置/卸载脚本的工具称为 DPKG。但是,在存储库中查找软件包并确保所有依赖其他软件包的软件包也安装的工具称为 APT。

从中可以看出,软件分发堆栈的每个部分都经过精心设计,以便软件安装到可预测的位置,以便它可以作为系统的一部分工作,并且软件可以依赖于其他软件,等等。

Ubuntu 等操作系统对系统提供的软件和用户自己安装的软件进行了非常明确的区分。这种区别甚至内置在文件系统层次结构标准 (FHS) 中,该标准规定了 Linux 发行版(和类 Unix 操作系统)如何布局其软件。用户安装的软件将进入系统上的单独目录,例如

  • /opt - 适用于不属于操作系统但由其他供应商提供的系统范围软件
  • /usr/local/* - 用于系统管理员手动安装的系统范围软件,不属于操作系统的一部分
  • 主目录 - 用于最终用户在其用户帐户中安装的软件,而不是系统范围的

除上述内容外,如果有理由制定自己的目录方案而不使用上述目录,则可以使用其他目录。

还有什么其他选择?

如果您自己编写软件或从上游源获取软件并自行调整,则可以修改软件以将其安装在您喜欢的位置并按您喜欢的方式运行。所以这始终是一个选择。

如果您想使用操作系统(或其他 Linux 发行版)的软件包,但将它们安装在其他位置,则有各种方法可以从软件包中取出软件并执行此操作。但是,这样做的成功程度取决于软件包的编写方式、其安装和配置脚本的工作方式、软件包中的依赖项的工作方式等。

您可以使用容器化(使用 chroot)安装到目录中,甚至可以在该目录中运行单独的 Apt 副本。然后,您基本上可以在操作系统的目录中拥有一个精简版的 Linux 发行版。

Snap 或 Flatpak 等技术就采用了这样的技术,这也是为什么它们在如何以及在何处安装软件方面非常灵活。

答案3

包本身中的信息决定了文件的安装位置,因此您需要sudo写入/和更改包数据库。

当您安装软件包时,您将安装预构建的二进制文件以及相关的配置和元文件和脚本,它们是软件包的重要组成部分。这些脚本和配置文件与依赖项和系统的其余部分紧密相关。除非您确切知道自己在做什么,否则您不会想轻易更改它们。

如果您在无法访问的系统(例如在办公室)中,sudo则可以从源代码进行编译,并将安装目录设置为您的主目录。这样就不需要了sudo。从源代码安装时,您通常不会更改软件包数据库。

答案4

因为它编辑的文件被 chmod 了,所以你不能使用它们。你也许可以对它们进行 chmod,但是我不建议这样做

相关内容