在我的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.
最可能的原因是您的忙碌框是静态链接的。Fakeroot 使用 LD_PRELOAD,它会在调用从程序传递到运行时库 (glibc( 时拦截调用。静态链接的可执行文件对LD_PRELOAD不可见,因此对假根也不可见。
Fakeroot-ng 使用 ptrace 机制,当系统调用从程序传递到内核时,它会拦截系统调用。因此,fakeroot-ng可以捕获由静态链接程序执行的系统调用(这是我最初创建fakeroot-ng的原因之一(。
在 Mac 上,不允许静态链接运行时库。它们甚至不提供运行时库的静态版本。因此,fakeroot拦截那里的系统调用没有问题(这是一件好事,因为fakeroot-ng没有OS-X版本,部分原因是上述原因(。
我猜为什么它不起作用:
也许 Ubuntu 上的 busybox 使用了fakeroot
无法拦截的open()
。
解决方法:
我在 Ubuntu 机器上安装了fakeroot-ng
,现在它按预期工作。