【问题标题】:R and getpwuid()R 和 getpwuid()
【发布时间】:2012-03-29 08:59:45
【问题描述】:

我正在使用 apparmor 在 Ubuntu 11.10 上对 R 进行沙盒处理。我注意到的一件事是,对于 R 创建的每个 png 或 pdf 图,它都会显示警告:

(process:4589): GLib-WARNING **: getpwuid_r(): failed due to: Permission denied.

然而,即使对 /etc/passwd 的读取访问被拒绝,一切似乎都运行良好。我不打算给 R 这些权限,因为我想做的事情似乎没有必要。然而,反复出现的警告有点烦人。

R/src 中“getpwuid”的快速 grep 显示了它被调用的三个地方:

r-base-2.14.2/src/main/platform.c:  stpwd = getpwuid(sb.st_uid);
r-base-2.14.2/src/unix/sys-unix.c:  stpwd = getpwuid(getuid());
r-base-2.14.2/src/unix/sys-unix.c:  stpwd = getpwuid(geteuid());

但是,我并不清楚这是做什么的。

问题:

  • 为什么 R 需要访问 passwd 文件才能创建绘图?
  • 有什么方法可以阻止 R 在写入 png 或 pdf 设备时尝试调用 getpwuid_r()(无需重新编译 R)?

【问题讨论】:

  • 我很想在生成图像时看到strace(1) 的输出;我很难理解为什么 R 想要知道用户名、主目录、GECOS 或 shell,尽管 shell 最有可能是它所追求的。您的 R 配置文件是否需要对 /bin/bash/bin/dash 的执行访问权限? (免责声明:我是 AppArmor 团队的一员。)
  • R 确实读取了很多 ~/.R* 文件,甚至来自 ~/.R/* 也是如此。但我认为它只在启动时这样做。 OTOH ~/.Rhistory 等被附加,但同样 - 完整的文件名可能只计算一次。
  • 或者,如果您能建议我自己快速重现此内容的方法,那就太好了。我对 R 几乎一无所知(尽管有几次半心半意的学习尝试。)
  • 它真的是 R 源代码中的 getpwuid 调用之一吗?错误消息来自 GLib 和 getpwuid_r - 它可能是 GLib 中的调用,它来自使用 GLib 的图形库之一(如 libPNG)。真正的问题是为什么图形库需要访问 /etc/passwd...
  • 我刚刚尝试了 chmod o-r /etc/passwd 然后在 R 中创建了一个 png - 根本没有 GLib 警告。 strace'ing R 显示它经常访问 /etc/passwd。

标签: r apparmor


【解决方案1】:

R 内部函数 file.info(gdb 中的 do_fileinfo)似乎可以发现并返回有关文件的大量信息,包括用户名。

我假设它基本上对 R 中加载的每个文件都执行此操作,但它可能只是在包加载期间。

它使用 getpwuid 来执行此操作。

我现在在 R 中遇到性能问题 - 由于长时间的 NIS 响应延迟。它在包加载过程中多次查找同一个用户,这给我带来了各种各样的问题。

我希望它会缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2014-01-12
    • 1970-01-01
    • 2010-09-14
    相关资源
    最近更新 更多