linux中`fakeroot`命令有什么需要

gkt*_*gkt 123 su sudo

为什么我们需要fakeroot命令?我们不能简单地使用sudoorsu命令吗?

手册页说:

fakeroot - 在伪造 root 权限的环境中运行命令以进行文件操作

About.com 说:

提供一个假的根环境。该软件包旨在启用以下功能:dpkg-buildpackage -rfakeroot即消除成为软件包构建的 root 用户的需要。这是通过设置LD_PRELOAD为 来完成的libfakeroot.so,它提供了getuid, chown, chmod, mknod, stat, ... 的包装器,从而创建了一个假的根环境。如果你不明白这些,你不需要fakeroot

我的问题是,它解决简单su或不简单的特殊目的是什么sudo?例如,要重新打包 ubuntu 中所有已安装的包,我们给出以下命令:

$ fakeroot -u dpkg-repack `dpkg --get-selections | grep install | cut -f1`
Run Code Online (Sandbox Code Playgroud)

我们可以使用 sudo 或 su 而不是 fakeroot 来执行上述命令,如下所示:

$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`
Run Code Online (Sandbox Code Playgroud)

编辑:

跑步:

$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`
Run Code Online (Sandbox Code Playgroud)

给我这个错误:

控制目录具有错误的权限 700(必须 >=0755 和 <=0775)

有什么理由吗?

sak*_*isk 88

想象一下,您是在远程服务器上工作的开发人员/包维护人员等。您想要更新包的内容并重新构建它,从 kernel.org 下载和自定义内核并构建它,等等。在尝试执行这些操作时,您会发现某些步骤需要您拥有root权限(UIDGID0) 出于不同的原因(安全、被忽视的权限等)。但是不可能获得root权限,因为您正在远程机器上工作(并且许多其他用户与您有相同的问题)。这正是fakeroot它所做的:它对需要它们的环境假装有效UIDGID为 0。

在实践中,您永远不会获得真正的root特权(susudo您提到的和相反)。

  • @mrid 注意“实际上你永远不会获得真正的 root 权限”。所以答案是否定的 (3认同)

Mor*_*kel 71

要清楚地看到 fakeroot 和真正的 sudo / su 之间的区别,只需执行以下操作:

$ fakeroot
# echo "Wow I have root access" > root.tst
# ls -l root.tst
-rw-rw-r-- 1 root root   23 Oct 25 12:13 root.tst
# ls -l /root
ls: cannot open directory /root: Permission denied
# exit
$ ls -l root.tst
-rw-rw-r-- 1 ubuntu ubuntu 23 Oct 25 12:13 root.tst
Run Code Online (Sandbox Code Playgroud)

只要您在 fakeroot shell 中,就好像您是 root 一样——只要您不尝试做任何真正需要 root 权限的事情。这正是包装工具制作在任何机器上都有意义的包装所需要的。

事实上,当你使用fakeroot进行打包时,你想要实现的就是让你在fakeroot下运行的工具看到你的文件是root所拥有的。不多也不少。所以实际上, su 或 sudo 无法获得正确的文件所有权。

  • 不好。我自己试过了。fakeroot 的主要原因是将所有权 root:root 放入构建的包中,而实际上不是 root。不过,已安装的软件包将具有适当的权限。 (7认同)
  • @JohannesSchaub-litb,不,这就是重点。这些文件不属于 root,但在“fakeroot” shell 中,它们_看起来像_它们是。当在此 shell 内创建 .deb 包时,将从文件系统中读取文件所有者(“fakeroot”拦截并返回“root”)并将其存储在包中。安装该软件包时,dpkg 需要 root 访问权限,因为该软件包指示该文件应由 root 拥有。 (3认同)
  • 在我阅读@ntzrmtthihu777 的评论之前,这一切都非常令人困惑! (2认同)
  • 抱歉,我听不懂描述。为什么不给这些工具打补丁,这样如果你不是root用户,他们就不会抱怨呢?作为一个相关问题:毕竟,您在 fakeroot 下创建的文件实际上并不属于 root 所有。这是否意味着当我安装这样的“.deb”文件时,我的所有“/usr”文件都归名为“fakeroot”的用户所有? (2认同)

Sha*_*baz 66

由于答案很难理解(对我自己而言)并且需要一些思考才能理解它(这个评论让我理解了它),我将给出一个希望更好的解释。

1. fakeroot 会发生什么

无非是你自己的用户发生了什么。绝对没有更多。如果您fakeroot(在调用时会为您提供一个新的 shell,就像sudo会那样),假装做您需要许可的事情,然后退出,绝对不会发生任何事情。

如果你仔细想想,这完全是在浪费时间。你为什么要做一些实际上不会发生的事情?这太疯狂了。你可以根本不做任何事情,也不会有任何区别,因为没有任何痕迹。

等一下...

2.fakeroot的踪迹

可能是留下的痕迹fakeroot。让我们看看MortenSickel 的回答中的命令,它非常好,值得点赞:

$ fakeroot
# echo "Wow I have root access" > root.tst
# ls -l root.tst
-rw-rw-r-- 1 root root   23 Oct 25 12:13 root.tst
# ls -l /root
ls: cannot open directory /root: Permission denied
# exit
$ ls -l root.tst
-rw-rw-r-- 1 ubuntu ubuntu 23 Oct 25 12:13 root.tst
Run Code Online (Sandbox Code Playgroud)

乍一看,使用起来fakeroot完全是浪费时间。最后,如果你没有使用fakeroot,你会得到同样的东西。

这里的微妙之处在于:

$ cat root.tst
Wow I have root access
Run Code Online (Sandbox Code Playgroud)

这意味着文件的内容仍然记得是根。您可能会说不使用fakeroot会产生相同的结果。你说得对,这个例子太简单了。

让我们再举一个例子:

$ fakeroot
# touch x
# touch y
# chown myuser:myuser x
# ls -l > listing
# exit
$ ls -l
total 4
-rw-rw-r-- 1 myuser myuser 152 Jan  7 21:39 listing
-rw-rw-r-- 1 myuser myuser   0 Jan  7 21:39 x
-rw-rw-r-- 1 myuser myuser   0 Jan  7 21:39 y
$ cat listing
total 0
-rw-rw-r-- 1 root   root   0 Jan  7 21:39 listing
-rw-rw-r-- 1 myuser myuser 0 Jan  7 21:39 x
-rw-rw-r-- 1 root   root   0 Jan  7 21:39 y
Run Code Online (Sandbox Code Playgroud)

让我们来看看发生了什么。我假装是root,这完全是无效的,并创造xy。我假装x属于myusery属于root。他们实际上都属于myuser(正如我们在最后看到的那样),但我只是假装是这样。

然后我创建了一个列表并将我的想象力保存到一个文件中。后来当我回顾文件时,我可以看到我想象的文件应该归谁所有。再说一次,它们实际上并不是由我想象的人拥有,我只是想象而已。

3. 所以……你为什么又想要那个?

你可能会说我真的不需要假装是 root 来创建该列表。我可以简单地创建列表,然后编辑它以反映我的想象力。你是对的,你不需要fakeroot那个。事实上,知道这fakeroot实际上并没有什么作用,你不可能获得任何你以前没有的能力。

但是,这就是fakeroot全部内容,编辑列表可能非常重要。与可以安装在系统上的软件包一样,您拥有tared、gziped、xzed、bzip2ed 或任何其他格式,可以将您的文件保存在一起并记住它们的权限和所有者。您可以轻松修改压缩文件并编辑文件的所有权吗?我不了解你,但我想不出办法。

是否可以构建一个工具,一旦所有内容都被压缩,它会修改压缩文件并以编程方式编辑所有权和权限?是的,可以。因此,您可以在压缩之前伪造所有权,或者在压缩之后更改它们。Debian 人认为前者更容易。

4. 为什么不直接使用sudo

首先,您不需要root权限来构建软件,也不需要root权限来压缩它们。因此,如果您不需要它,您必须真正成为 Windows 用户才能考虑获得该许可。但撇开讽刺不谈,你甚至可能没有 root 密码。

此外,假设您确实拥有 root 权限。假设您想假装一个文件应该只对根目录具有读访问权限。因此,您sudo实际上将文件所有者和权限更改为 ,从而root退出 root shell 并尝试打包所有内容。您失败了,因为现在您无法再读取该文件,因为您没有 root 访问权限。所以你必须以sudoroot 身份压缩和构建包。实际上,您必须以 root 身份执行所有操作。

这是坏TM

作为打包者,您不需要 root 权限,也不应该获得它。安装软件包时,您可能需要以Aroot身份安装一些文件 ( ),这就是您需要 root 权限的地方。所有fakeroot做是为了使这成为可能。它让打包A程序将归档程序列为 root 所有,以便当用户解压缩包时,归档程序需要 root 权限并创建A为 root 所有。

  • 写得真好,一目了然。 (8认同)
  • `因此,您可以在压缩之前伪造所有权,或者在压缩之后更改它们。Debian 人认为前者更容易。` 这对我很有帮助,因为我一直在想“为什么不修改它?”。 (2认同)
  • 谢谢,这消除了我在阅读@Morten 的回答后的困惑 (2认同)

小智 35

AFAIK,fakeroot 在一个环境中运行命令,在该环境中它似乎具有文件操作的 root 权限。这对于允许用户使用具有 root 权限/所有权的文件创建存档(tar、ar、.deb 等)非常有用。如果没有 fakeroot,则需要具有 root 权限才能创建具有正确权限和所有权的档案的组成文件,然后将它们打包,或者必须直接构建档案,而无需使用存档器。

fakeroot 的工作原理是将文件操作库函数(chmod()、stat() 等)替换为模拟真实库函数会产生的效果的函数,如果用户真的是 root。

简介:

 fakeroot [-l|--lib library] [--faked faked-binary] [--] [command]  
Run Code Online (Sandbox Code Playgroud)

在此处查看更多信息:fakeroot

  • 它并没有真正赋予超级用户权力,它只是伪造它——在其中运行的程序认为它具有 root 权限,而它实际上仍然使用用户的正常权限。 (11认同)
  • @userunknown 你也许可以绕过`rm` 的检查你是否有足够的权限,但内核本身不会让你这样做;`unlink` 系统调用将失败。不是由应用程序单独处理权限,或者您可以编写自己的应用程序而不检查权限并使用它做任何您想做的事情 (11认同)
  • `在其中运行的程序认为它具有 root 权限'和具有 root 权限的程序之间的区别在哪里?如果我可以做一个 `rm -rf /` 和程序,运行它认为我有 root 权限...... (3认同)

小智 12

我已经将它用于包构建脚本。我不确定运行脚本的人是否具有 root 级别访问权限,但脚本仍然需要生成一个 tar 文件,其中包含属于 root 的文件。最简单的方法是在 fakeroot 下运行包构建脚本,这会欺骗存档器相信文件属于 root,并将它们打包在存档中。这样,当包被解压到目标机器(在另一台机器上)时,文件不属于奇怪或不存在的用户。

想想看,我见过的唯一地方是构建某种档案:嵌入式系统的 rootfs、tar.gz 档案、rpm 包、.deb 包等。

  • `fakeroot` 是一个针对有漏洞的打包软件的变通工具:你没有理由需要 root 来创建这样的包,但是因为它们不允许你以任何其他方式指定文件权限,而不是事先将它们直接设置到文件系统中你没有选择 (2认同)