从R运行sudo系统命令?

时间:2014-04-20 19:59:28

标签: r

有时这种方法有效,有时则无效。这似乎取决于系统是否需要提示输入密码。更普遍的问题是:用户是否有办法从R?

中为shell命令提供输入
system('sudo npm install gitbook -g')

请注意,我的具体情况是尝试安装node.js模块。但是,我认为您可以使用更简单的命令复制它。

system('sudo mkdir testdir')

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

3 个答案:

答案 0 :(得分:11)

我可以建议两种不同的解决方案:

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

    system('gksudo ls')

    • PRO:

      • 这是安全的,您不必自己处理密码。
      • ....
    • CONS:

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

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

    • PRO:

      • 它不依赖任何其他程序。
      • ....
    • CONS:

      • 我不喜欢密码被R操纵的想法:这看起来不错。
      • ....
  3. 除此之外,我不知道以任何方式与从R开始的程序进行交互式沟通。

答案 1 :(得分:0)

仅以@Jealie的回应为基础。我相信1.不适用于新版本的ubuntu。

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

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

答案 2 :(得分:0)

由于@jealie's answer中提到的gksudo实用程序不再得到维护(因此从Ubuntu 18.04开始缺少),因此必须依靠pkexec来代替here

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)