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

SSH within R script to get to MySQL Database

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

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

ssh myUsername@Hostname
myUsername@Hostname's password:
[myUsername@Host ~]$ mysql -h mySQLHost -u mySQLUsername -p mySQLPassword

但是,我希望从 R 中连接到 MySQL 数据库,因此我可以发送查询以将 table 读入我当前的 R 会话。通常我会在命令行中 运行 一个 R 会话,但是服务器上没有安装 R。

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

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

本质上,我想 运行 通过管道执行相同的命令,以便 myDB 对象是一个有效的 mySQL 连接。

我一直在尝试从 R 中通过管道进入限制服务器,并且能够读取 csv 文件。例如:

dat <- read.table(pipe('ssh myUsername@Hostname "cat /path/to/your/file"'))

这会提示我输入密码,并且会读取 table(正如建议的 here)。但是,我不确定如何将其转换为 MySQL 连接。例如,我应该将管道作为 host 参数的一部分吗?这是我的第一个想法,但一直无法实现。

如有任何帮助,我们将不胜感激。

我使用 SSH 隧道与 Postgres 完成了类似的任务。实际上,您使用 SSH 隧道所做的就是 "establish a connection to the remote server, and make a port from that server available as a port on my local machine."

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

ssh -L local_port:lochalhost:remote_port username@remote_host

具体来说,您使用此命令所做的是创建一个本地端口转发 SSH 隧道,它使用您要直接连接到安装了数据库的计算机上的端口 (remote_port),并将其安全地发送到您安装了 R 的机器上 local_port.

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

hostname: 192.168.1.3
username: mysql
server mysql port: 3306

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

ssh -L 9000:localhost:3306 mysql@192.168.1.3

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