使用 fakeroot 更改权限时出现问题

使用 fakeroot 更改权限时出现问题

chmod我不明白为什么当我使用 运行命令时用户的权限没有改变fakeroot

最初,该文件具有以下权限:

-rwxr-xr-x  a.txt*

当我尝试使用 chmod 更改文件的权限时,它工作正常:

chmod 111 a.txt

---x--x--x  a.txt*

当我用它运行它时,它fakeroot似乎无法正常工作。它正确设置组和其他人的权限,但不设置用户的权限。无论chmod命令中的第一个值是什么,都会设置读取和写入的权限。

fakeroot chmod 111 a.txt

-rwx--x--x  a.txt*

我错过了什么吗?

答案1

Fakeroot 不会执行所有文件元数据更改,这就是要点:它仅假装在其下运行的程序。 Fakeroot 不会执行它不能执行的更改,例如更改所有者。它也不会进行会导致失败的更改。例如,以下代码以 root 身份运行时会成功,因为 root 始终可以打开文件,无论权限如何:

chmod 111 a.txt
cp a.txt b.txt

但是当以非 root 用户身份运行时,cp会失败,因为它无法读取a.txt.为了避免这种情况,chmodfakeroot 下不会删除用户的权限。

Fakeroot 确实假装对其正在运行的程序执行更改。

$ stat -c "Before: %A" a.txt; fakeroot sh -c 'chmod 111 a.txt; stat -c "In fakeroot: %A" a.txt'; stat -c "After: %A" a.txt
Before: -rwx--x--x
In fakeroot: ---x--x--x
After: -rwx--x--x

一般来说,在 fakeroot 内部完成的文件元数据更改不能保证在 fakeroot 调用后仍然存在。这才是重点。进行一次 fakeroot 调用,既执行元数据更改,又执行您想要对更改后的元数据执行的任何操作(例如打包存档)。

答案2

这是 的一个怪癖fakeroot,需要实现其根伪装功能;作为记录在代码注释中:

如果某个文件不可写,那么 root 仍然可以写入该文件(无论该文件的所有者是谁)。如果我们是 fakeroot,那么伪造这一点的唯一方法是始终使该文件对真实用户(启动 fakeroot 的用户)可写、可读等。目录的 exec 位也适用。

因此,fakeroot始终设置u=rwx并记录在其内部状态中请求的实际权限(您可以使用该-s选项将其保存到文件中;生成的文件是人类可读的)。实际上,

chmod 155 a.txt
fakeroot chmod 111 a.txt

将生成一个具有711权限的文件!

相关内容