我能够在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服务器上运行命令?
答案 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)