it-swarm.cn

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

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

手册页显示:

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

About.com说:

提供伪造的根环境。该软件包旨在启用以下功能:dpkg-buildpackage -rfakeroot,即无需成为软件包构建的root用户。这是通过设置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)

有什么原因吗?

102
gkt

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

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

70
sakisk

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

56
MortenSickel

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

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(最后我们可以看到),但是我只是pretended就像这样。

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

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

您可能会说,我真的不需要假冒自己的根来创建该列表。我可以简单地创建清单,然后对其进行编辑以反映我的想象力。没错,您不需要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权限,也不应该获得它。安装软件包时,您可能需要以root用户身份安装一些文件(A),这是您需要root权限的地方。 fakeroot所做的只是使这成为可能。它使打包程序将A列出为归档程序的root用户,因此,当用户对程序包进行解压缩时,归档程序需要root权限并创建A归root用户所有。

49
Shahbaz

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

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

简介:

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

在这里检查更多: fakeroot

33
herbalessence

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

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

11
Dysaster

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

3
Eero Ketonen

简单的答案:

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

1
jdmayfield

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

1
gabrielhidasy