【发布时间】:2013-07-24 08:40:01
【问题描述】:
我想安装一个安全配置文件的包,该配置文件无权访问/tmp,但有自己的临时目录,例如/tmp/jeroen。然而,即使我尝试传递TMPDIR 环境变量,它仍然失败,因为它尝试使用/tmp。下面是一个使用RAppArmor 和unixtools 的玩具示例(有关测试配置文件,请参见here)
> library(RAppArmor)
> library(unixtools)
> dir.create("/tmp/jeroen")
> set.tempdir("/tmp/jeroen")
> setwd(tempdir());
> aa_change_profile("r-test")
Switching profiles...
> print(tempdir());
[1] "/tmp/jeroen"
> install.packages("plyr", lib="/tmp/jeroen", configure.vars="TMPDIR=/tmp/jeroen")
trying URL 'http://cran.rstudio.com/src/contrib/plyr_1.8.tar.gz'
Content type 'application/x-gzip' length 384462 bytes (375 Kb)
opened URL
==================================================
downloaded 375 Kb
Fatal error: cannot create 'R_TempDir'
The downloaded source packages are in
‘/tmp/jeroen/downloaded_packages’
查看kern.log 文件(记录安全消息)时,发现问题在于R CMD INSTALL 仍然尝试使用被拒绝的/tmp:
Jul 24 19:41:34 Jeroen-Antec kernel: [16270.696805] type=1400 audit(1374687694.097:599):
apparmor="DENIED" operation="mkdir" parent=5798 profile="r-test" name="/tmp/RtmpcUOJuQ/"
pid=5802 comm="R" requested_mask="c" denied_mask="c" fsuid=1000 ouid=1000
有什么方法可以让R CMD INSTALL 改用/tmp/jeroen?
【问题讨论】:
-
如果您要设置 TMPDIR 环境变量,我相信您必须在启动 R 时(或在 .Renviron 文件中)进行设置。例如你需要像这样启动 R
TMPDIR="/tmp/jeroen" R -
FWIW,
install.packages对tempdir()进行了 2 次调用;它可能有助于检查它何时被调用 -
@GSee 我希望
configure-vars选项能解决这个问题。该进程无权编辑.Renviron -
虽然我不知道这种特殊情况,但过去我不得不竭尽全力解决这个问题(从脚本中重新启动 R)。这是一个相关的R-devel post
-
@Jeroen 使用
Sys.setenv()在您的脚本中设置(然后重置)。环境变量由子进程继承。