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
.为了避免这种情况,chmod
fakeroot 下不会删除用户的权限。
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
权限的文件!