linux中需要什么`fakeroot`命令

linux中需要什么`fakeroot`命令

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

手册页说:

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

About.com 说道:

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

我的问题是,它解决了一个简单的susudo没有解决的特殊目的吗?例如,为了重新打包 ubuntu 中所有已安装的软件包,我们给出以下命令:

$ fakeroot -u dpkg-repack `dpkg --get-selections | grep install | cut -f1`

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

$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`

编辑:

跑步:

$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`

给我这个错误:

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

有什么理由吗?

答案1

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

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

答案2

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

1. fakeroot 中会发生什么

只不过是您自己的用户发生的情况而已。绝对没有更多了。如果你fakeroot(当调用时会给你一个新的 shell,就像sudo会的那样),假装做你需要许可的事情,然后退出,绝对不会发生任何事情。

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

等一下...

2.fakeroot的踪迹

那里可以留下痕迹fakeroot。我们来看看里面的命令莫滕西克尔的回答这非常好,值得点赞:

$ 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

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

这里微妙的事情是这样的:

$ cat root.tst
Wow I have root access

这意味着文件的内容仍然记得是根目录。您可能会说不使用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

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

然后我创建了一个列表并将我的想象力保存到一个文件中。稍后,当我回头查看该文件时,我可以看到我想象的文件应该属于谁。再说一遍,它们实际上并不属于我想象中的人所有,我只是简单地想象一下。

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

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

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

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

4.为什么不直接使用sudo

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

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

这是坏TM

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

答案3

要清楚地看到 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

只要您处于 fakeroot shell 中,看起来就像您是 root 一样——只要您不尝试执行任何真正需要 root 权限的操作。这正是包装工具制作在任何机器上都有意义的包装所需要的。

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

答案4

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

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

相关内容