busybox tar 忽略了 Ubuntu 上的 fakeroot,但它适用于 OS X



在我的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,现在它按预期工作。

最新更新