如何知道用户是root还是fakeroot?

时间:2013-09-07 16:54:21

标签: c busybox fakeroot

我想知道用户是否是root用户,而不关心该用户是否使用类似fakeroot的工具。

我尝试了getuid()geteuid()getlogin()这两项功能,但是当我启动fakeroot命令时,每个命令都会发送我自己的帐户信息,而不是root

对于此代码:

printf("%d %d %s\n", getuid(), geteuid(), getlogin());

这是我得到的:

% fakeroot ./busybox rm 
1000 1000 julien

当我想得到类似的东西时:

0 0 root

(登录就够了)

2 个答案:

答案 0 :(得分:4)

看起来您的二进制文件(busybox)是针对静态libc编译的。 fakeroot使用动态库预加载来拦截和替换对各种libc函数的调用,但这仅在您的二进制文件动态链接到libc时才有效。如果它是静态链接的,则函数调用绑定到二进制内部的实际调用,因此无法拦截它们。

答案 1 :(得分:3)

nneonneo得到了正确的理由,但这是解决方案:Fakeroot-ng。它使用ptrace和系统调用拦截,而不是LD_PRELOAD和库调用拦截,这使它与静态链接兼容,更加健壮,甚至能够处理从libc内部进行的调用(否则会不可上钩)。