在Linux中需要`fakeroot`命令是什么


92

为什么我们完全需要fakeroot命令?我们不能简单地使用sudoor su命令吗?

手册页显示:

fakeroot-在具有root特权的环境中运行命令以进行文件操作

About.com说:

提供伪造的根环境。该软件包旨在实现以下功能:dpkg-buildpackage -rfakeroot即,消除成为软件包构建根的必要性。这是通过设置LD_PRELOADlibfakeroot.so,围绕提供包装getuidchownchmodmknodstat,...,从而创建一个虚拟根环境。如果您不了解其中任何一项,则不需要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)

有什么原因吗?


6
出于安全原因,最好避免以root用户身份执行可以由普通用户执行的所有操作,即使您可以运行sudosu因为它是您的计算机。fakeroot有两种用法:1)愚弄程序以使您相信您确实是root用户,即使不需要,某些编写不佳的专有软件也可能会需要它(通常是Windows开发人员改用Linux); 2)它允许模拟文件模式和所有权更改,而您不会否则,它主要是创建tar具有正确权限和所有权的文件,例如在打包软件时很有用。
pqnet

1
我认为About.com摘录中的注释可以概括为:如果您不了解其中任何一项,则不需要fakeroot如果您无法想到fakeroot有用的情况,那么您根本就不需要它。但是实际上确实需要它的人完全了解用例。
Christopher Schultz

Answers:


68

假设您是在远程服务器上工作的开发人员/程序包维护人员等。您想要更新软件包的内容并重新构建它,从kernel.org下载并自定义内核并构建它,等等。在尝试执行这些操作时,您会发现某些步骤要求您具有root权限(UID并且GID0)出于不同的原因(安全性,忽略的权限等)。但是root,由于您在远程计算机上工作,因此无法获得权限(许多其他用户与您有同样的问题)。正是fakeroot这样做的:它对需要它们的环境假装了有效UIDGID为0的环境。

实际上,您永远不会获得真正的root特权(susudo您提到的相反)。


所以,我不能fakeroot用来更改系统设置?因为我们将要运行的命令会认为它以root身份运行,并且可以执行我们希望执行的所有操作。不是吗
MRID

3
@mrid注意“实际上,您永远不会获得真正的root特权”。所以答案是不对的
sakisk

52

要清楚地看到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无法获得正确的文件所有权。


造假者不危险吗?如果我用suid位和rx perm创建文件,则该文件将由root拥有,任何人都可以以root身份执行!还是将suid位置设置不起作用?
Frizlab 2014年

7
不好。我自己尝试过了。fakeroot的主要原因是将所有权root:root放入构建的软件包中,而无需实际成为root。但是,已安装的软件包将具有适当的烫发。
hanetzer 2014年

2
直到我读到@ ntzrmtthihu777的评论,这一切都非常令人困惑!
Shahbaz

抱歉,我不明白说明。为什么不修补工具,以使它们在您不是root用户时也不会抱怨?一个相关的问题:毕竟,您在fakeroot下创建的文件实际上不是root拥有的。这是否意味着当我安装这样的.deb文件时,我的所有/usr文件都归谁叫谁的用户拥有fakeroot
Johannes Schaub-litb

@ JohannesSchaub-litb,不,这就是重点。这些文件不是由root拥有的,而是在fakerootshell 内看起来像它们。在此shell内创建.deb包时,将从文件系统中读取文件所有者(该文件系统fakeroot拦截并返回root)并存储在包中。安装软件包时,dpkg然后需要root用户访问权限,因为软件包指示该文件应归root用户所有。
Shahbaz

45

由于答案(对我自己)难以理解,并且花了一些时间才能理解(此评论使我理解了),因此我将给出一个更好的解释。

1.在fakeroot中会发生什么

只不过是您自己的用户所发生的事情。绝对没有。如果您fakeroot(被调用时会给您提供一个新的shell,就像sudo这样),假装做您需要许可的工作,然后退出,则绝对不会发生任何事情。

如果您考虑一下,那完全是浪费时间。您为什么要做一些实际上不会发生的事情?太疯狂了 您可能根本没有做任何事情,也不会有任何区别,因为没有任何痕迹。

等一下...

2.假根的踪迹

可能是留下的痕迹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

乍一看,似乎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属于myusery属于root。它们实际上都属于myuser(最后我们可以看到),但是我只是假装这样。

然后,我创建了一个清单,并将我的想象力保存到文件中。稍后,当我回顾该文件时,可以看到我认为文件应归谁所有。再说一次,它们实际上并不是我想象的人所有,我只是简单地想像而已。

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

您可能会说,我真的不需要假冒自己的根来创建该列表。我可以简单地创建清单,然后对其进行编辑以反映我的想象力。没错,您不需fakeroot要这样做。实际上,知道这fakeroot实际上并没有做任何事情,就不可能获得以前没有的任何能力。

但是,这是什么fakeroot是一回事,编辑上市可能是平凡的。与可以在您的系统上安装的软件包一样,您具有tared,gziped,xzed,bzip2ed或任何其他格式可以将文件保存在一起并记住其权限和所有者。您可以轻松地修改压缩文件并编辑文件所有权吗?我不认识你,但我想不出办法。

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

4.为什么不只是使用sudo

首先,您不需要root用户特权即可构建软件,也不需要root用户特权即可对其进行压缩。因此,如果您不需要它,则必须真正成为Windows用户才能考虑获得该权限。但讽刺的是,您甚至可能没有root密码。

此外,假设您具有root权限。假设您要假装文件应该仅对根目录具有读取权限。因此sudo,实际上您将文件所有者和权限更改为root,就退出了root shell并尝试打包所有内容。您失败是因为现在由于您没有root用户访问权限而无法再读取文件。因此,您必须以sudo根用户身份压缩和构建软件包。实际上,您必须以root用户身份执行所有操作。

这是不好的TM

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


5
出色的写作,这很清楚。
克里斯蒂安·朗

1
So either you could fake the ownerships before compressing, or change them after. Debian people decided the former is easier.这对我有所帮助,因为我一直在思考“为什么以后不修改它?”。
aaaaaa

1
谢谢,这
消除

33

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

fakeroot的工作原理是:通过模拟真实库函数(如果用户确实是root用户)产生的效果,来代替文件操作库函数(chmod(),stat()等)。

剧情简介:

 fakeroot [-l|--lib library] [--faked faked-binary] [--] [command]  

在这里查看更多:fakeroot


@MaskTheSmokin:因此,fakeroot仅在文件操作操作方面为您提供超级用户权限。
gkt 2011年

@ gkt.pro:我想是的。

10
它并没有真正赋予超级用户权力,它只是伪造了它-运行在其中的程序认为它具有root特权,而实际上仍在使用用户的正常特权。
圣保罗Ebermann

2
the program running in it thinks it has root privileges和具有root特权的程序之间的区别在哪里?如果我可以执行rm -rf /和程序,则运行它会认为我具有root权限...
用户未知

10
@userunknown您可能可以绕过rm,以检查您是否具有足够的权限,但是内核本身不允许您执行此操作。该unlink系统调用会失败。并不是仅由应用程序来处理权限,否则您就可以编写自己的应用程序来检查权限并对其执行任何操作
Michael Mrozek

11

我已将其用于打包构建脚本。我不确定运行该脚本的人员是否具有root级访问权限,但是该脚本仍需要生成一个tar文件,其中包含属于root的文件。最简单的方法是在fakeroot下运行程序包构建脚本,该脚本欺骗存档程序,使他们认为文件属于root,然后将其打包到存档中。这样,当将包解压缩到目标计算机(完全在另一台计算机上)时,文件不属于奇怪的用户或不存在的用户。

考虑一下,我唯一看到的地方是构建某种存档:嵌入式系统的rootfs,tar.gz存档,rpm软件包,.deb软件包等。


1
fakeroot是用于错误包装软件的解决方法:没有理由需要root用户来创建此类软件包,但是由于它们不允许您以其他方式指定文件许可权,而无需事先将它们直接设置到文件系统中选择
pqnet

3

一种常见用法是找出发生故障的二进制文件真正要访问的文件。也就是说,找出并修复或解决由硬编码路径和不正确的异常处理导致的错误。


1

您可以在没有实际root特权的情况下使用fakeroot。如果您拥有su和/或sudo可以使用一个简单的销毁系统rm -rf /,但是最多只能使用fakeroot删除主目录。


2
那不能解释对的需要fakeroot。您可以自己删除主目录。
JMCF125 2013年

1

简单的答案:

su和sudo以root身份运行命令。除了部分沙箱安排之外,fakeroot不会这样做。

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.