【问题标题】:How to know if user is root or fakeroot?如何知道用户是 root 还是 fakeroot?
【发布时间】:2013-09-07 16:54:20
【问题描述】:

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

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

对于此代码:

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

这是我得到的:

% fakeroot ./busybox rm 
1000 1000 julien

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

0 0 root

(登录就够了)

【问题讨论】:

  • 根据fakeroot 的定义,您不应该以编程方式产生差异;至少如果二进制文件是动态链接的(我猜fakeroot 使用LD_PRELOAD 技巧)。
  • @BasileStarynkevitch 那么为什么当我输入fakeroot whoami 时会得到root
  • 这有点奇怪——fakeroot 应该拦截get*uid 调用。 busybox 是针对静态 libc 编译的吗?
  • 在我的机器上,fakeroot idfakeroot whoami 都给出了 root 答案。
  • @nneonneo Ah s***... 是的,这就是为什么,但我必须静态编译它(它用于学校项目),他们给了我这个例子,看看它是否有效。 ..

标签: c busybox fakeroot


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    nneonneo 得到了正确的原因,但解决方案如下:Fakeroot-ng。它使用ptrace 和系统调用拦截,而不是LD_PRELOAD 和库调用拦截,这使得它与静态链接兼容,更加健壮,甚至能够处理来自libc 内部的调用(否则将无法挂钩) .

    【讨论】:

    • 哦,真可爱。我认为ptrace 魔法是可能的;很高兴知道有人真的做到了。
    • 顺便说一句,由于体系结构之间的系统调用差异以及缺乏支持 Linux 支持的所有拱门的资源,它现在相当有限,但是使用新的“seccomp2”ptrace 接口,可以进行系统调用拦截并以几乎与架构无关的方式进行过滤。调整 Fakeroot-ng 以使用 seccomp2 方法将使其更加便携和实用。
    • @nneonneo 谢谢大家,我不知道你们两个中的哪一个得到了我的答案,完美运行(尽管必须在 sudo 中启动);)
    • @R.. 有你的答案。我只是给出了原因:)
    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    相关资源
    最近更新 更多