使用R在远程Linux服务器上以编程方式运行命令

时间:2019-05-31 16:44:33

标签: r amazon-web-services rstudio-server

我能够在R上使用shell()命令来写出获得对AWS EC2 Linux服务器的访问权限的指令。

shell("chmod 400 rstudio.pem")

shell("ssh -i \"rstudio.pem\" ec2-user@[address number here].us-east-2.compute.amazonaws.com")

但是一旦我从R获得对Linux服务器的访问权限,然后尝试运行

shell("sudo yum -y update")

它不会运行,只是停留了一段时间的思考模式,然后我收到一条错误消息:“子进程未运行。单击确定以终止它。”

一旦我从计算机上运行的R获得访问权限,如何在Linux服务器上运行命令?

1 个答案:

答案 0 :(得分:0)

您遇到的问题是,对shell的每次调用都是在其自己的进程中执行的。因此,在第一个进程中打开的ssh命令不是接收在后续shell调用中发出的命令的命令。

假设底层shell是bash,则可以使用以下示例进行演示:

# echo PID of shell
system('echo $$') # 20859
system('echo $$') # 20860

如果您打算使用R作为调用ssh的入口点,则可以在调用ssh时传递命令以远程执行。这使用ssh在单个调用中连接并运行所有命令。

例如从远程主机获取磁盘使用情况

command <- 'ssh -i "rstudio.pem" ec2-user@[address number here].us-east-2.compute.amazonaws.com df -H'
system(command)

我希望您的命令如下所示:

command <- 'ssh -i "rstudio.pem" ec2-user@[address number here].us-east-2.compute.amazonaws.com sudo yum -y update'
system(command)

如果要运行一系列命令,可以尝试将它们列出为输入。依次将它们通过stdin传递给ssh。这有点特殊的行为,但可能足以满足您的目的。

inputs <- c('echo "Starting Command"', 'df -h', 'echo "All done."')
command <- 'ssh -i "rstudio.pem" ec2-user@your.aws.ec2.address'
system(command, input=inputs)