【问题标题】:Run a system command as sudo from R?从 R 中以 sudo 身份运行系统命令?
【发布时间】:2014-04-20 19:59:27
【问题描述】:

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

system('sudo npm install gitbook -g')

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

system('sudo mkdir testdir')

请注意,这有时会根据sudo 是否要求您重新输入密码而起作用。谢谢。

【问题讨论】:

  • 这不是一个通用的解决方案,但您可以依赖gksudo(sudo 的图形界面)。
  • 我建议看看man sudo,-A 选项可能对你有用。
  • 你是如何运行 R 的?在我的终端中,如果我在通过system运行 sudo 时需要密码,系统会提示我输入密码
  • 我正在通过 R Studio 运行 R。我认为如果我最近进行了身份验证(比如在终端中),那么我不会收到输入密码的提示。大多数时候我都这样做,这就是为什么这个功能不起作用。这并不重要,更多的是为了方便。如果有人知道其他一些可以做类似事情的软件包,那将会很有帮助。我扫描了 devtools 和 installR(但这确实适用于 Windows),没有发现任何有用的东西。

标签: r


【解决方案1】:

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

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

    system('gksudo ls')

    • 专业版:

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

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

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

    • 专业版:

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

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

除此之外,我不知道以任何方式与从R 开始的程序进行交互通信。

【讨论】:

    【解决方案2】:

    只是为了建立@Jealie 的回应。我相信 1. 不会在新版本的 ubuntu 中工作。

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

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

    【讨论】:

      【解决方案3】:

      由于@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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-12
        • 2015-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        相关资源
        最近更新 更多