【问题标题】:Discover all installed R packages with a Java dependency (for security reasons)发现所有已安装的具有 Java 依赖项的 R 包(出于安全原因)
【发布时间】:2018-05-14 22:06:47
【问题描述】:

出于安全原因,我不得不在与 R 一起使用的机器上卸载 Java (JRE)。

我如何(轻松 :-)发现所有使用 Java 的已安装包?

编辑 14.12.2021: log4j-log4shell-cve-2021-44228-vulnerability 使这个问题(和答案)更加有趣 ;-)

【问题讨论】:

  • 所以您需要卸载jre 和所有其他可能正在使用它的软件?
  • 很抱歉使用“java”标签,这可能更像是一个 R 问题。是的,但是 R 主要在 C 中实现,大多数包(库)在 R、C 和 C++ 中实现。我只想卸载那些调用Java/JRE的R包
  • 啊!抱歉,这里帮不了你

标签: java r installation package rjava


【解决方案1】:

您可以使用installed.packages 来确定哪些包导入了rJava 包。您需要告诉installed.packages 包含包描述中的Imports 字段,然后检查哪些包导入rJava

LIBS = installed.packages(fields=c("Imports"))
JPacks = grep("Java", LIBS[,"Imports"], ignore.case=TRUE)
LIBS[JPacks, c("Package", "Imports")]
          Package    
RWeka     "RWeka"    
RWekajars "RWekajars"
          Imports                                                                
RWeka     "RWekajars (>= 3.9.0), rJava (>= 0.6-3), graphics, stats,\nutils, grid"
RWekajars "rJava (>= 0.6-3)"

【讨论】:

  • 很好的答案! rJava 是 R 中的包使用 Java 的唯一途径吗?
  • 知道的唯一方法:-)
【解决方案2】:

我还通过考虑rJAva 包中的其他类型的依赖关系扩展了@GSW 答案的解决方案:

libs       = installed.packages()

imports    = grep("Java", libs[,"Imports"],   ignore.case=TRUE)
depends    = grep("Java", libs[,"Depends"],   ignore.case=TRUE)
linking.to = grep("Java", libs[,"LinkingTo"], ignore.case=TRUE)
enhances   = grep("Java", libs[,"Enhances"],  ignore.case=TRUE)
# SystemRequirements may also contain Java dependencies but is not available in the matrix

libs[c(imports, depends, linking.to, enhances),
     c("Package", "Imports", "Depends", "LinkingTo", "Enhances")]

现在也可以找到例如。 xlsx:

         Package    Imports Depends           LinkingTo Enhances
xlsx     "xlsx"     NA      "rJava, xlsxjars" NA        NA      
xlsxjars "xlsxjars" NA      "rJava"           NA        NA      

2021 年 12 月 21 日编辑:如果您想查找所有直接依赖于 JAVA(例如,由于log4j 漏洞)的 CRAN 包(不仅是已安装的包),您可以使用:

# Dependencies external to the R system should be listed in the `SystemRequirements` field of the package's DESCRIPTION file.
# This also holds true until the package uses Java via the rJava package where the `Imports` or `Depends` declaration suffices:
# https://cran.r-project.org/doc/manuals/R-exts.html#Non_002dR-scripts-in-packages

CRAN.pkgs <- tools::CRAN_package_db()  # gets a list of all R packages at CRAN

imports    = grepl("Java", CRAN.pkgs$Imports,             ignore.case = TRUE)
depends    = grepl("Java", CRAN.pkgs$Depends,             ignore.case = TRUE)
linking.to = grepl("Java", CRAN.pkgs$LinkingTo,           ignore.case = TRUE)
enhances   = grepl("Java", CRAN.pkgs$Enhances,            ignore.case = TRUE)
sysreq     = grepl("Java", CRAN.pkgs$SystemRequirements,  ignore.case = TRUE)

CRAN.java.pkgs <- CRAN.pkgs[imports | depends | linking.to | enhances | sysreq,
                            c("Package", "Imports", "Depends", "LinkingTo", "Enhances", "SystemRequirements")]

NROW(CRAN.pkgs)         # more than 18.000 in 12/2021
NROW(CRAN.java.pkgs)    #              137 in 12/2021

CRAN.java.pkgs$Package  # show all packages found

【讨论】:

    猜你喜欢
    • 2018-03-04
    • 2023-03-18
    • 2014-09-20
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多