2014-11-05 19 views
35

在R中,调用系统命令有3种主要机制:system,system2shell(它似乎与system共享一个联机帮助页)。没有一个提供了非常可靠的跨平台方式来运行系统命令,而不会发生shell阻塞 - 如果shell进行干预,我们需要担心shell注入攻击,确保引用是正确的,等等。系统调用时无需调用R中的shell

某些语言提供对C级execvp函数(例如Perl的system PROGRAM LIST机制)的直接访问,当我想确保数组中的字符串恰好是子进程将在其参数中看到的字符串时,这非常有用,而不是四处寻找嵌入的空白,引号等适当的引用例程,并担心他们将在不同的平台和不同版本的shell上执行什么操作。

在R中是否有类似的无壳系统调用机制,可能在某个CRAN包中?和/或是否有任何建立这样的机制的胃口,如果没有一个呢?

+0

非常有趣的问题,我想知道答案。然而,就目前而言,这个问题可能被解释为要求一种工具(非主题)或主要是基于意见的工具。我不会投票结束,但也许您可以应用一些编辑来避免这些结果? – Andrie 2014-11-05 21:44:54

+0

@Andrie在最后一段不是第一个问题吗? – 2014-11-05 21:53:02

+0

@PauloCardoso,Andrie指出,最后一段*中的第一个问题是*“请求工具”。我想用一段简单的代码将一个字符串传递给'execvp'会很容易... – 2014-11-05 22:55:41

回答

1

下面的代码运行中的R命令无壳互动:

library(inline) 
cfun <- cfunction(sig = signature(), 
      includes = "#include <unistd.h>", 
body = 'execl("/bin/date", "date", 0, 0, (char *)0);') 
cfun() 

我敢肯定,这是一个坏主意,因为我认为它会在执行过程完成时终止R过程。叉子怎么样?

基本封装并行C函数mc_fork使用C系统命令fork来实现此目的,使用管道进行进程间通信。我不知道MinGW会如何在Windows上运行,但由于它位于基本软件包中,它看起来很可能会起作用,尽管可能采用了非常不同的下游机制。

在R源parallel我看到R-devel/src/library/parallel/src/fork.c

SEXP mc_fork(SEXP sEstranged) 
... 
pid = fork(); 
0

扩展在@Jack Wasey的直觉:

library(inline) 
cfun <- cfunction(sig = signature(), 
      includes = "#include <unistd.h>", 
body = ' 
pid_t fk = fork(); 
if (!fk) { 
    execl("/bin/date", "date", 0, 0, (char *)0); 
} else if (fk == -1) { 
    perror("fork"); 
} 
return(R_NilValue); 
') 
cfun() 

...使用fork,以防止当前进程的劫持(在至少在Linux中),但安全地返回给R,没有什么可以显示的。