我想安装一个具有安全配置文件的包,该包无权访问/tmp,但有自己的临时目录,例如/tmp/jeroen. 但是,即使我尝试传递TMPDIR环境变量,它仍然失败,因为它尝试使用/tmp. 下面是使用RAppArmor和unixtools的玩具示例(有关测试配置文件,请参见此处)
> 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’
Run Code Online (Sandbox Code Playgroud)
在查看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
Run Code Online (Sandbox Code Playgroud)
有什么办法,我可以告诉R CMD INSTALL使用/tmp/jeroen呢?
@hadley 在评论中给出了正确的答案:为了确保install.packages使用自定义临时目录,需要执行以下操作
Sys.setenv(TMPDIR="/tmp/jeroen")
Run Code Online (Sandbox Code Playgroud)
此外:
configure.vars="TMPDIR=/tmp/jeroen"
Run Code Online (Sandbox Code Playgroud)
这样,包的提取和安装都可以避免使用系统或用户默认的临时目录。