【问题标题】:Sending system command with arguments in R在 R 中发送带有参数的系统命令
【发布时间】:2019-07-30 17:32:19
【问题描述】:

我正在尝试在 R 中编写一个函数,该函数允许我使用 Libreoffice 自动查看数据框。这个想法是,当我想查看数据时,该函数将编写一个临时 csv 文件并用 R 打开它。这是我拥有的代码:

view <- function(data) {
    FILE = "/home/spreadSheetView/temp.csv"
    write.csv(data, file = FILE, row.names = F)
    system(command = "export $(dbus-launch); \
                      export NSS_USE_SHARED_DB=ENABLED; \
                      libreoffice --calc /home/spreadSheetView/temp.csv")
}

并且代码有效。但是,在Libreoffice 中打开文件时,我不想使用文件的绝对目录,而是想使用$FILE${FILE} 之类的东西,最后一行代码将如下所示:

libreoffice --calc $FILE")

遗憾的是,程序无法以这种方式找到文件。您能否建议是否有使用这种方法的方法?谢谢!

【问题讨论】:

标签: r bash ess


【解决方案1】:

你可以使用

command = paste(
      "export $(dbus-launch); \
       export NSS_USE_SHARED_DB=ENABLED; \
       libreoffice --calc",
     FILE )
system(command)

【讨论】:

  • 这种方式无法防止通过文件名进行的shell注入攻击,是吗?
  • 至少使用shQuote
  • @CharlesDuffy - 好点。我曾假设文件名是由 OP 自己生成的,所以不太容易受到恶意攻击。但是,如果存在外部参与者将代码注入 FILE 的风险,那么您是正确的,您的方法更好。
【解决方案2】:

此社区 Wiki 答案取自先前出现在问题中的自我回答:


代码基于@CharlesDuffy 的回答并进行了一些修改,因为我无法使/bin/shexport 一起使用。

view <- function(data) {
    FILE = "/home/spreadSheetView/temp.csv"
    write.csv(data, file = FILE, row.names = F)
    system2(command = "export",
        args = c("$(dbus-launch) NSS_USE_SHARED_DB=ENABLED; ",
                 "libreoffice --calc \"$1\" ",
                  FILE))
}

【讨论】:

  • 这应该行不通——它确实暗示system2() 的行为并不像其文档声称的那样等同于直接execve() 调用。
  • 我再次测试了这个功能,它对我来说很好用。我没有看到所有的 ENV 变量都被打印出来了,dbus-lauch 也没有错误。
  • export 不是外部命令;它纯粹是一个内置的shell。做正确的execve() 的东西根本不能运行。我确实相信你它有效,但它有效意味着有一些非常错误的地方。
猜你喜欢
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2014-09-07
相关资源
最近更新 更多