有时这样有效,有时无效。这似乎取决于系统是否需要提示输入密码。更普遍的问题是:有没有一种方法可以让用户从R中为shell命令提供输入?
system('sudo npm install gitbook -g')
请注意,我的具体案例是尝试安装node.js模块。然而,我认为您可以使用一个更琐碎的命令来复制它。
system('sudo mkdir testdir')
请注意,这有时会起作用,具体取决于sudo
是否要求您重新输入密码。谢谢
我可以提出两种不同的解决方案:
-
使用
gksudo
,它将在图形界面中提示用户输入密码。以下是它在实践中的工作原理:system('gksudo ls')
-
PRO:
- 它是安全的,你不必自己处理密码
-
缺点:
- 如果没有图形界面,它将无法工作
gksudo
默认安装在我尝试过的linux品牌上,但YMMV:也许有些用户不会安装
-
-
在
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)
要在只有一个密码提示的情况下按顺序运行多个命令,请将其与sudo
和bash -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)