-1

在我的 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.

附加信息:

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.
4

2 回答 2

1

最可能的原因是您的busybox 是静态链接的。Fakeroot 使用 LD_PRELOAD,它在调用从程序传递到运行时库 (glibc) 时拦截调用。静态链接的可执行文件对于 LD_PRELOAD 是不可见的,因此对于 fakeroot 也是不可见的。

Fakeroot-ng 使用 ptrace 机制,在系统调用从程序传递到内核时拦截它们。因此,fakeroot-ng 可以捕获由静态链接程序执行的系统调用(这是我首先创建 fakeroot-ng 的原因之一)。

在 Mac 上,不允许静态链接运行时库。它们甚至不提供运行时库的静态版本。因此,fakeroot 在那里拦截系统调用没有问题(这是一件好事,因为 fakeroot-ng 没有 OS-X 版本,部分原因是上述原因)。

于 2017-08-20T11:59:56.333 回答
0

我猜为什么它不起作用:

open()也许 Ubuntu上的 busybox 使用fakeroot无法拦截。

解决方法

我安装fakeroot-ng在我的 Ubuntu 机器上,现在它按预期工作。

于 2017-08-02T19:14:48.243 回答