为什么我们需要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权限(UID和GID0) 出于不同的原因(安全、被忽视的权限等)。但是不可能获得root权限,因为您正在远程机器上工作(并且许多其他用户与您有相同的问题)。这正是fakeroot它所做的:它对需要它们的环境假装有效UID且GID为 0。
在实践中,您永远不会获得真正的root特权(su与sudo您提到的和相反)。
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 无法获得正确的文件所有权。
Sha*_*baz 66
由于答案很难理解(对我自己而言)并且需要一些思考才能理解它(这个评论让我理解了它),我将给出一个希望更好的解释。
无非是你自己的用户发生了什么。绝对没有更多。如果您fakeroot(在调用时会为您提供一个新的 shell,就像sudo会那样),假装做您需要许可的事情,然后退出,绝对不会发生任何事情。
如果你仔细想想,这完全是在浪费时间。你为什么要做一些实际上不会发生的事情?这太疯狂了。你可以根本不做任何事情,也不会有任何区别,因为没有任何痕迹。
等一下...
有可能是留下的痕迹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,这完全是无效的,并创造x和y。我假装x属于myuser和y属于root。他们实际上都属于myuser(正如我们在最后看到的那样),但我只是假装是这样。
然后我创建了一个列表并将我的想象力保存到一个文件中。后来当我回顾文件时,我可以看到我想象的文件应该归谁所有。再说一次,它们实际上并不是由我想象的人拥有,我只是想象而已。
你可能会说我真的不需要假装是 root 来创建该列表。我可以简单地创建列表,然后编辑它以反映我的想象力。你是对的,你不需要fakeroot那个。事实上,知道这fakeroot实际上并没有什么作用,你不可能获得任何你以前没有的能力。
但是,这就是fakeroot全部内容,编辑列表可能非常重要。与可以安装在系统上的软件包一样,您拥有tared、gziped、xzed、bzip2ed 或任何其他格式,可以将您的文件保存在一起并记住它们的权限和所有者。您可以轻松修改压缩文件并编辑文件的所有权吗?我不了解你,但我想不出办法。
是否可以构建一个工具,一旦所有内容都被压缩,它会修改压缩文件并以编程方式编辑所有权和权限?是的,可以。因此,您可以在压缩之前伪造所有权,或者在压缩之后更改它们。Debian 人认为前者更容易。
sudo?首先,您不需要root权限来构建软件,也不需要root权限来压缩它们。因此,如果您不需要它,您必须真正成为 Windows 用户才能考虑获得该许可。但撇开讽刺不谈,你甚至可能没有 root 密码。
此外,假设您确实拥有 root 权限。假设您想假装一个文件应该只对根目录具有读访问权限。因此,您sudo实际上将文件所有者和权限更改为 ,从而root退出 root shell 并尝试打包所有内容。您失败了,因为现在您无法再读取该文件,因为您没有 root 访问权限。所以你必须以sudoroot 身份压缩和构建包。实际上,您必须以 root 身份执行所有操作。
这是坏TM。
作为打包者,您不需要 root 权限,也不应该获得它。安装软件包时,您可能需要以Aroot身份安装一些文件 ( ),这就是您需要 root 权限的地方。所有fakeroot做是为了使这成为可能。它让打包A程序将归档程序列为 root 所有,以便当用户解压缩包时,归档程序需要 root 权限并创建A为 root 所有。
小智 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
小智 12
我已经将它用于包构建脚本。我不确定运行脚本的人是否具有 root 级别访问权限,但脚本仍然需要生成一个 tar 文件,其中包含属于 root 的文件。最简单的方法是在 fakeroot 下运行包构建脚本,这会欺骗存档器相信文件属于 root,并将它们打包在存档中。这样,当包被解压到目标机器(在另一台机器上)时,文件不属于奇怪或不存在的用户。
想想看,我见过的唯一地方是构建某种档案:嵌入式系统的 rootfs、tar.gz 档案、rpm 包、.deb 包等。
| 归档时间: |
|
| 查看次数: |
112803 次 |
| 最近记录: |