从R中以sudo的身份运行系统命令



有时这样有效,有时无效。这似乎取决于系统是否需要提示输入密码。更普遍的问题是:有没有一种方法可以让用户从R中为shell命令提供输入?

system('sudo npm install gitbook -g')

请注意,我的具体案例是尝试安装node.js模块。然而,我认为您可以使用一个更琐碎的命令来复制它。

system('sudo mkdir testdir')

请注意,这有时会起作用,具体取决于sudo是否要求您重新输入密码。谢谢

我可以提出两种不同的解决方案:

  1. 使用gksudo,它将在图形界面中提示用户输入密码。以下是它在实践中的工作原理:

    system('gksudo ls')

    • PRO:

      • 它是安全的,你不必自己处理密码
    • 缺点:

      • 如果没有图形界面,它将无法工作
      • gksudo默认安装在我尝试过的linux品牌上,但YMMV:也许有些用户不会安装
  2. R中询问用户密码,并为其提供适当的sudo选项:-k始终询问密码,-S接受标准输入的密码。以下是它在实践中的工作原理:

    system('sudo -kS ls',input=readline("Enter your password: "))

    • PRO:

      • 它不依赖于任何其他程序
    • 缺点:

      • 我不喜欢密码被R操纵的想法:这看起来是个坏主意

除此之外,我不知道如何与从R启动的程序进行交互通信。

只是建立在@Jealie的回应之上。我相信1。在新版本的ubuntu中不起作用。

但我们可以让Rstudio处理密码:

system("sudo -kS ls", input = rstudioapi::askForPassword("sudo password"))

由于@jealie的答案中提到的gksudo实用程序不再维护(因此从Ubuntu 18.04开始就丢失了),因此必须依赖pkexec,如下所述:

system("pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY ls")

使用R更新的system2()功能的相同命令:

system2(command = "pkexec",
        args = "env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY ls",
        stdout = TRUE,
        stderr = TRUE)

要在只有一个密码提示的情况下按顺序运行多个命令,请将其与sudobash -c '...':结合使用

system2(command = "pkexec",
        args = paste0("env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY bash -c ",
                      "'sudo mkdir somedir; sudo ls -1l; sudo rm -R somedir'"),
        stdout = TRUE,
        stderr = TRUE)

最新更新