我正在尝试连接到 MySQL 服务器,该服务器受到连接到给定服务器的限制。我试图在未物理连接的情况下通过此限制服务器进行连接。
通过命令行,这可以通过创建 SSH 连接来实现,之后我可以从命令行运行 MySQL 命令。例如:
ssh myUsername@Hostname
myUsername@Hostname's password:
[myUsername@Host ~]$ mysql -h mySQLHost -u mySQLUsername -p mySQLPassword
但是,我希望从 R 中连接到 MySQL 数据库,这样我就可以发送查询以将表读入我当前的 R session 中。通常我会在命令行中运行 R session ,但服务器上没有安装 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"'))
这会提示我输入密码,并读取表格(正如建议的那样 here )。但是,我不确定如何将其转换为 MySQL 连接。例如,我应该将管道作为 host
参数的一部分吗?这是我的第一个想法,但一直无法实现。
如有任何帮助,我们将不胜感激。
最佳答案
我使用 SSH 隧道与 Postgres 完成了类似的任务。实际上,您使用 SSH 隧道所做的就是“建立与远程服务器的连接,并使来自该服务器的端口可用作我本地计算机上的端口。”
你可以设置一个SSH tunnel在本地计算机上使用以下命令:
ssh -L local_port:lochalhost:remote_port username@remote_host
具体来说,您使用此命令所做的是创建一个本地端口转发 SSH 隧道,它使用您要直接连接到安装了数据库的机器上的端口(remote_port
) ,并将其作为 local_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
根据您在 R 中的确切 DBI
连接看起来像什么,您可能需要稍微编辑连接配置以使其连接到您新创建的隧道端口。我使用不同的本地主机端口的原因是它可以防止与本地版本的数据库发生冲突,如果你有的话。
关于r - R 脚本中的 SSH 获取 MySQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45877167/