2017-08-25 78 views
1

我试图连接到一个MySQL服务器,该服务器被连接到给定的服务器所限制。我试图通过这个限制服务器连接,而没有物理连接。在R脚本内部的SSH进入MySQL数据库

通过命令行可以创建SSH连接,之后我可以从命令行运行MySQL命令。例如:

ssh [email protected] 
[email protected]'s password: 
[[email protected] ~]$ mysql -h mySQLHost -u mySQLUsername -p mySQLPassword 

不过,我想从R内连接到MySQL数据库,这样我就可以发送查询表中读入我的当前R会话。通常我会在命令行中运行R会话,但服务器没有安装R。

例如,我有此代码段,当我物理连接到服务器(填写信息改变),那个工作:

myDB <- dbConnect(MySQL(), user="mySQLUsername", password="mySQLPassword", dbname="myDbname", host="mySQLHost") 

从本质上说,我想通过一个管道来运行这个相同的命令,所以myDB对象是一个可用的mySQL连接。

我一直在试图从R内部管道进入限制服务器,并且已经能够读取一个csv文件。例如:

dat <- read.table(pipe('ssh [email protected] "cat /path/to/your/file"')) 

这促使我要我的密码,并且表读取(如建议它会here)。但是,我不确定如何将其转换为MySQL连接。例如,我应该使管道部分的参数为host?这是我的第一个想法,但一直无法做到这一点。

任何帮助,将不胜感激。

回答

2

我使用SSH隧道完成了Postgres的类似任务。实际上,你对SSH隧道所做的工作是“建立到远程服务器的连接,并将该服务器的端口作为本地计算机上的端口使用”。

ssh -L local_port:lochalhost:remote_port [email protected]_host 

具体来说,你用这个命令做的是建立一个本地端口转发SSH隧道是什么,它走的是端口:

您可以使用本地计算机上运行以下命令建立一个SSH tunnel您将直接连接到安装了数据库的计算机上(remote_port),并将其安全地发送到您安装了R的计算机上,作为local_port

例如,对于具有下列选项的数据库服务器:

hostname: 192.168.1.3 
username: mysql 
server mysql port: 3306 

你可以使用下面的命令(在命令行,或R中使用system2)上创建一个隧道端口9000的机:

ssh -L 9000:localhost:3306 [email protected] 

根据您的具体DBI连接的样子在R,你可能需要稍微编辑连接配置,使其连接到新创建的隧道口。我使用不同的本地主机端口的原因是,它防止与本地数据库版本发生冲突,如果你有一个。

+0

但是这会导致R中的错误:'.local错误(drv,...): 无法连接到数据库:错误:在'握手:读取inital通信数据包'时丢失与MySQL服务器的连接,系统错误:2'。并且在隧道打开的情况下命令行中出现错误:“通道3:打开失败:连接失败:连接被拒绝”。你有什么想法,我做错了什么?我在做本地主机和端口有问题吗? – kneijenhuijs

+1

我的猜测是承载数据库的服务器不允许网关端口转发。当服务器拒绝连接时(通常是由于安全权限),您通常会看到该错误消息。如果你有sudo访问服务器,[这里是一个体面的指南](http://blog.trackets.com/2014/05/17/ssh-tunnel-local-and-remote-port-forwarding-explained- with-examples.html)启动并运行 –

+0

重新加载第一条评论,因为我不小心遗留在服务器信息中: 感谢您的回复。我以前使用类似的隧道通过服务器使用的phpmyadmin门户访问MySQL服务器。尽管如此,我使用了一个稍微不同的隧道:'ssh -D 8080 userName @ sshHost'。哪些工作。我用命令行打开了隧道:'ssh -L 9000:localhost:3306 userName @ sshHost'。然后在RI认为这个代码应该工作:myDB < - dbConnect(MySQL(),user =“mySQLUsername”,password =“mySQLPassword”,dbname =“myDbname”,host =“127.0.01”,port = 9000) – kneijenhuijs