为什么apt-get需要sudo?


12

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

我不想要的答案:

  • “这是因为apt写入系统级目录”。这就是表面层次的原因,但是我正在寻找更深层次的层次。从根本上阻止单用户环境(la pip + virtualenv)吗?
  • “您可以仅从源代码构建”。这是一种解决方法,但不能解决我的问题。我不想解决短期问题,无论如何我都可以在所有机器上拥有root用户访问权限。

希望您知道您可以从主目录中的源代码构建任何软件包。
Jobin 2014年

对,但是我正在寻找的,为什么基础的apt-get的限制。从源代码构建并不能解决这个问题。
PattimusPrime 2014年

1
我认为您真正要问的问题是“为什么大多数Linux软件都无法重定位?”。允许apt-get将软件安装到用户本地目录中是完全有可能的,但是由于大多数软件不支持此操作,因此这样做毫无意义。

Answers:


10

为什么apt-get需要sudo?

不总是。您可以使用完全apt-get没有sudo。在某些情况下,您根本不需要sudo,例如使用apt-get download,将软件包下载到当前目录apt-get source将debian源文件下载到当前目录,changelog下载并打印给定软件包的变更日志,以及任何包含在--simulate/ --dry-run/ --no-act(在的情况下install,你也需要--no-download)。

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

现在,为什么apt-get需要sudo?其实不是。您可以抛弃apt-get,与一起下载软件包,wget然后dpkg --extract在您喜欢的任何目录中使用和提取软件包。还有--instdir一个应该只对二进制包有效。

现在,为什么这不是默认值?因为这很痛苦。要执行您想要的操作,我们需要将每个程序包重新包装两次,一次以正确的方式进行包装,另一次以您想要的方式进行。在构建时,二进制文件通常需要知道它们所需的文件和库在哪里(在某些情况下,在编译时会进行硬编码)。

现在,您可以做什么呢?只需 virtualenv chroot某个环境中,您就可以在没有root的情况下安装软件包。

总结,这不是使用apt-get的方式,而且我不知道另一个类似于apt-get的软件包管理器允许您执行此操作。归根结底,这apt-get只是dpkg的前端,可以完成其中的一些工作。


3

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

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

如果您使用的是系统,例如在工作中没有sudo访问权限,则可以从源代码进行编译,并将安装目录设置为主目录。然后,不需要sudo。从源安装时,通常不会更改软件包数据库。


谢谢回答!我知道并使用了变通办法,但是我想弄清楚的是为什么我一直在使用它们。我相信您是在说问题是安装路径由软件包维护者硬编码-为什么不能更改此设置?
PattimusPrime

2

这不是一个愚蠢的问题。

操作系统中的特权级别

Ubuntu-以及实际上任何现代操作系统-都具有针对不同软件的不同特权级别的概念。用户启动的软件通常在基于用户的特权级别下运行,出于安​​全原因,该特权级别没有修改系统所需的访问权限-它只能修改属于该用户的文件。

为了对操作系统进行任何可能对整个系统产生影响的修改,而不仅是对用户文件的影响,都需要更高的特权级别,在Linux中称为“超级用户”特权(或通常称为“超级用户”特权)。称为“根”)。此特权级别可以不受限制地访问整个操作系统,从而可以为所有用户修改或破坏所有文件。

apt-get的作用

通过apt-get安装软件时,将安装系统范围内可用的软件。也就是说,该软件不仅会放置在用户的主目录中,仅由该用户运行,而且会安装在系统范围的应用程序目录中(例如/ usr,/ etc,/ var等)。 ),供所有用户运行。为了修改这些目录,您需要超级用户权限。没有特权的用户不能修改这些目录,因为否则,没有特权的软件可能会干扰系统。

如果您尝试使用apt-get安装某些东西而没有赋予apt-get超级用户特权,那么它将无法克服的第一个障碍是获得一个锁,以写入其自己的软件目录。作为系统范围的实用程序,apt-get维护已安装软件的目录,该目录自然需要超级用户特权才能进行编辑,以使未特权的软件不会对其造成混乱。但是,即使您能够以某种方式克服此障碍(例如,通过更改文件权限),安装软件过程中的许多其他步骤仍将失败,因为安装例程将取决于写入多个系统目录。

使用Linux,可以在没有超级用户权限的情况下安装软件,但是您需要自己编写(例如,shell脚本)或自己编译并直接运行编译的可执行文件。如果有权限,可以使用apt-get(以及其他基于aptitude,synaptic或Ubuntu软件中心的基于APT的实用工具)在全系统范围内进行安装,这一点更加容易。


感谢您的回答,也感谢您的详尽。我了解apt-get在系统范围内的性质,但是我想了解的是为什么必须采用这种方式。
PattimusPrime 2014年

1
不一定要那样。这恰好是Ubuntu(和Debian)的设计方式。没有人会阻止某人设计一个操作系统,而该操作系统通常是按用户安装软件的。
thomasrutter 2014年

1

为什么默认情况下apt-get安装到/(或类似目录)?

这样做的简单原因是apt-get无法确定在何处安装软件。它由开发人员决定,并在应用程序内部进行编码。

我可以安装到其他目​​录吗?

是的,您可以安装到其他目​​录。对于开源软件,获取源代码,更改安装目录,编译,构建和安装。通常,随附configure脚本中都有一个选项,可让您指定安装位置。通常是这样--prefix

但是我坚持使用apt-get。现在要做什么?

好。仍然有一种使用apt-get进行此操作的方法,尽管对于最终用户而言这太多了。按照步骤。

  1. 获取源。
  2. 将安装目录更改为$HOME
  3. 编译和构建。
  4. 将其打包为.deb文件
  5. 创建一个启动板帐户。
  6. 签署ubuntu行为准则(我不确定是否有必要这样做)。
  7. 为自己创造一个PPA
  8. 将deb软件包上传到ppa。
  9. 将PPA添加到您的源中。
  10. 运行sudo apt-get update
  11. 运行apt-get install package

那太容易/太难了,是否可以在安装过程中选择目录?

是的,没有。

是的,因为有可能,某些软件使用此方法,我所知道的唯一一个方法是。Qt5它具有一个.run文件,该文件在执行时会要求许多其他输入中的安装目录。

否,因为此方法未使用apt-get

有一天,我可以轻松做到这一点apt-get吗?

我认为软件开发人员apt-get和/或软件开发人员不会对此感兴趣,但是可以开发某些软件,这些软件仅要求安装目录即可自动执行源,更改,编译,构建,安装步骤。

我的第六感告诉我命令是

apt-dont-get install pkg1 pkg2 ...

感谢您的回答-彻底,可以解决我的问题。但是,我不明白为什么没有兴趣将单用户功能开发到apt-get中。在某些用例中,该功能似乎很有用。
PattimusPrime

信息不错,但是在问答中有一种问答格式...?:) idk,也许您应该将其编辑为标准格式?只是一个想法。
2014年

@PattimusPrime这种情况在大多数情况下很少见,因为在大多数情况下,管理员会安装所有必需的软件,而其他人则不需要安装软件。同样,从源代码进行构建非常容易,而且只要软件开发人员不在自己的软件中实施该功能,实施这种功能就将毫无用处,这将阻止apt-get开发人员这样做。另外,许多现有程序都依赖于其他程序,并且在/ usr目录中搜索它们。要实现此功能,将需要对所有具有依赖项的现有软件进行更改(这无处不在)。
注册用户

在$ HOME中安装文件是否违反Debian策略。你绝对不应该那样做。如果有的话,请使用/opt/package目录chmod。
Braiam 2014年

@Braiam:我看到有人推荐安装包中$HOME/opt/,如果他们不具备所需的权限在安装包/opt/..
阿迪亚

-1

导致它编辑更改的文件,因此您无法使用它们。您也许可以修改它们,所以我不能推荐这样做


谢谢回答。我在寻找为什么只编辑经过修改的文件。在我看来,单用户功能将易于实现,并且在某些领域(例如超级计算集群)非常有用
PattimusPrime 2014年
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.