在R脚本中使用SSH访问MySQL数据库

在R脚本中使用SSH访问MySQL数据库,r,linux,ssh,rmysql,R,Linux,Ssh,Rmysql,我正在尝试连接到MySQL服务器,这受到连接到给定服务器的限制。我正在尝试通过此服务器进行连接,但未进行物理连接 通过命令行,这可以通过创建SSH连接来实现,之后我可以从命令行运行MySQL命令。例如: ssh myUsername@Hostname myUsername@Hostname's password: [myUsername@Host ~]$ mysql -h mySQLHost -u mySQLUsername -p mySQLPassword dat <- read.ta

我正在尝试连接到MySQL服务器,这受到连接到给定服务器的限制。我正在尝试通过此服务器进行连接,但未进行物理连接

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

ssh myUsername@Hostname
myUsername@Hostname's password:
[myUsername@Host ~]$ mysql -h mySQLHost -u mySQLUsername -p mySQLPassword
dat <- read.table(pipe('ssh myUsername@Hostname "cat /path/to/your/file"'))
但是,我希望从R中连接到MySQL数据库,这样我就可以将查询发送到当前的R会话中读取表。通常我会在命令行中运行R会话,但服务器上没有安装R

例如,我有一段代码,当我物理连接到服务器时可以工作(填写的信息已更改):


myDB我使用SSH隧道实现了与Postgres类似的任务。实际上,您使用SSH隧道所做的是“建立到远程服务器的连接,并使该服务器的端口作为本地计算机上的端口可用。”

您可以在本地计算机上使用以下命令设置:

ssh -L local_port:lochalhost:remote_port username@remote_host
具体来说,您使用此命令所做的是创建一个本地端口转发SSH隧道,该隧道将在安装了数据库的计算机上直接连接到的端口(
remote\u Port
),并将其作为
Local\u Port
安全地发送到安装了R的计算机上

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

hostname: 192.168.1.3
username: mysql
server mysql port: 3306
您可以使用以下命令(在命令行中,或在R中使用
system2
)在计算机上创建到端口9000的隧道:

ssh -L 9000:localhost:3306 mysql@192.168.1.3

根据您的确切的
DBI
连接在R中的外观,您可能需要稍微编辑连接配置,使其连接到新创建的隧道端口。我之所以使用不同的localhost端口,是因为它可以防止与数据库的本地版本(如果有)发生冲突。

但这会导致R:
error in.local(drv,…):无法连接到数据库:错误:在“握手:读取初始通信包”时与MySQL服务器失去连接,系统错误:2
。隧道打开时命令行中的错误:
通道3:打开失败:连接失败:连接被拒绝
。你知道我做错了什么吗?我的本地主机和端口是否有问题?我猜托管数据库的服务器不允许网关端口转发。当服务器拒绝连接时,通常会看到该错误消息(通常是由于安全权限)。如果你有访问服务器的sudo权限,那么就启动并运行服务器吧。我无意中在服务器信息中留下了第一条评论:谢谢你的回复。我以前使用类似的隧道通过服务器使用的phpmyadmin门户访问MySQL服务器。尽管如此,我还是使用了一个稍微不同的隧道:
ssh-d8080userName@sshHost
。这起作用了。我用命令行打开了隧道:
ssh-l9000:localhost:3306userName@sshHost
。然后在R中,我认为这段代码应该可以工作:myDB啊,端口转发限制可能就是它。我会联系管理员询问是否是这样。谢谢你的帮助!
ssh -L 9000:localhost:3306 mysql@192.168.1.3