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

手册页上说:


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


About.com说:


提供一个伪造的根环境。该软件包旨在启用以下功能:dpkg-buildpackage -rfakeroot,即无需成为软件包构建根用户。这是通过将LD_PRELOAD设置为libfakeroot.so来完成的,它为getuidchownchmodmknodstat等提供包装器,从而创建了伪根环境。如果您不了解其中的任何一项,就不需要fakeroot了!


我的问题是,它解决了简单的susudo不需要什么特殊用途?例如,要在ubuntu中重新打包所有已安装的软件包,请给出以下命令:

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


我们可以用sudo或su代替上述的falseroot来执行上述命令:

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


编辑:

运行:

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


给我这个错误:


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


任何原因?

评论

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

我认为About.com的摘录中的注释可以概括为:如果您不了解其中的任何内容,则不需要fakeroot!如果您无法想到fakeroot有用的情况,那么您实际上就不需要它。但是实际上这样做的人需要它完全理解用例。

#1 楼

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

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

评论


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

– rid
17-10-28在7:15

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

–sakisk
17-10-28在16:07

#2 楼

要清楚地知道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年10月3日在21:14

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

– hanetzer
2014-12-16 14:38

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

– Shahbaz
15年1月7日在20:24

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

– Johannes Schaub-小人
18-10-12在13:32

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

– Shahbaz
19年8月16日在6:12

#3 楼

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

1。 fakeroot中发生的事情

您自己的用户所发生的一切。绝对没有更多。如果您使用fakeroot(调用时会给您一个新的外壳,例如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的全部内容,编辑上市可能是不平凡的。由于可以在您的系统上安装软件包,因此具有tar ed,gzip ed,xz ed,bzip2 ed或任何其他格式,可以将文件保存在一起并记住其权限和所有者。您可以轻松地修改压缩文件并编辑文件所有权吗?我不了解您,但我想不出办法。

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

4。为什么不只使用sudo?首先,您不需要root特权来构建软件,也不需要root特权来压缩它们。因此,如果您不需要它,则必须真正是Windows用户才能考虑获得该权限。但讽刺的是,您甚至可能没有root密码。

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

这是BadTM。

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

评论


出色的写作,这很清楚。

–克里斯蒂安·朗(Christian Long)
15年7月24日在14:37

因此,您可以在压缩之前伪造所有权,或者在压缩之后更改所有权。 Debian人认为前者更容易。这对我有所帮助,因为我一直在思考“为什么以后不修改它?”。

–aaaaaa
18 Mar 6 '18 at 19:40

谢谢,这消除了我阅读@Morten的答案后所产生的困惑

– Johannes Schaub-小人
18-10-12在13:38

#4 楼

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

fakeroot通过将文件操作库函数(chmod(),stat()等)替换为模拟真实库函数将具有的效果(如果用户确实是root用户)的函数来工作。

简介:

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


在此处查看更多:fakeroot

评论


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

– gkt
2011-2-24在13:11

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

–PaŭloEbermann
2011-2-26在13:22

认为它具有root特权的程序与具有root特权的程序之间的区别在哪里?如果我可以执行rm -rf /程序,则运行它会认为我具有root特权...

–用户未知
2011-03-20 15:52

@userunknown您也许可以绕过rm检查您是否具有足够的权限,但是内核本身不允许您这样做。取消链接系统调用将失败。不能仅由应用程序来处理权限,或者您可以编写自己的应用程序来检查权限并对其进行任何操作

– Michael Mrozek
2012年10月7日在18:26

一个例子来阐明对fakeroot的需求将是非常棒的。我可以看到fakeroot的用途,但是我看不到为什么人们无法绕开root权限以至于伪造起来比较容易。

– Ehtesh Choudhury
13年4月9日在14:54

#5 楼

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

考虑一下,这是我唯一的位置已经看到这是用于构建某种存档的:嵌入式系统的rootfs,tar.gz存档,rpm软件包,.deb软件包等。

评论


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

– pqnet
2014年8月12日上午10:08

#6 楼

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

#7 楼

您可以使用fakeroot,而无需实际拥有root特权。如果您有su和/或sudo,则可以使用简单的rm -rf /销毁系统,但最多使用fakeroot可以删除主目录。

评论


那并不能解释对fakeroot的需求。您可以自己删除主目录。

– JMCF125
2013年9月16日下午13:34

#8 楼

简单的答案:

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