在我的mac机器上,这只是按预期工作:
#!/bin/sh -euf
touch test.sh
chown 888:888 test.sh
busybox tar -czvf out.tar.gz test.sh
调用:
$ fakeroot -- ./generateArchive.sh
$ busybox tar -tzvf out.tar.gz
-rw-r--r-- 888/888 0 2017-08-02 20:52:50 test.sh
但是在我的虚拟ubuntu机器上,我得到了:
$ fakeroot -- ./generateArchive.sh
$ busybox tar -tzvf out.tar.gz
-rwxrwxr-x marco/marco 215 2017-08-02 20:53:32 test.sh
为什么ubuntu上的busybox没有"掉线"伪造的所有权?
当我使用tar
代替busybox tar
时,它适用于ubuntu。
其他信息:
Mac (10.12.5):
fakeroot version 1.20.2
BusyBox v1.20.0.git (2017-05-17 10:01:40 CEST) multi-call binary.
Ubuntu (14.04.5 LTS):
fakeroot version 1.20
BusyBox v1.21.1 (Ubuntu 1:1.21.0-1ubuntu1) multi-call binary.
答案 0 :(得分:1)
最有可能的原因是您的busybox是静态链接的。 Fakeroot使用LD_PRELOAD,它在从程序传递到运行时库(glibc)时拦截调用。静态链接的可执行文件对LD_PRELOAD是不可见的,因此对于fakeroot是不可见的。
Fakeroot-ng使用ptrace机制,当它们从程序传递到内核时拦截系统调用。因此,fakeroot-ng可以捕获由静态链接程序执行的系统调用(这是我首先创建fakeroot-ng的原因之一)。
在Mac上,不允许静态链接运行时库。它们甚至不提供运行时库的静态版本。因此,fakeroot没有问题拦截系统调用(这是一件好事,因为fakeroot-ng没有OS-X版本,部分原因是上述原因)。
答案 1 :(得分:0)
我猜到它为什么不起作用:
也许Ubuntu上的busybox使用open()
fakeroot
无法拦截。
解决方法强>:
我在我的Ubuntu机器上安装了fakeroot-ng
,现在它按预期工作了。