【问题标题】:SSH within R script to get to MySQL DatabaseR 脚本中的 SSH 以访问 MySQL 数据库
【发布时间】:2018-02-03 06:06:00
【问题描述】:

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

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

ssh myUsername@Hostname
myUsername@Hostname's password:
[myUsername@Host ~]$ 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 myUsername@Hostname "cat /path/to/your/file"'))

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

任何帮助将不胜感激。

【问题讨论】:

    标签: r linux ssh rmysql


    【解决方案1】:

    我使用 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 中的错​​误:Error in .local(drv, ...) : Failed to connect to database: Error: Lost connection to MySQL server at 'handshake: reading inital communication packet', system error: 2。并且在隧道打开的命令行中出现错误:channel 3: open failed: connect failed: Connection refused。你对我做错了什么有任何想法吗?我在本地主机和端口上做错了吗?
    • 我的猜测是托管数据库的服务器不允许网关端口转发。当服务器拒绝连接(通常是由于安全权限)时,您通常会看到该错误消息。如果您对服务器有 sudo 访问权限,请here's a decent guide 启动并运行它
    • 我不小心在服务器信息中留下了第一条评论:谢谢您的回复。我以前使用类似的隧道通过服务器使用的 phpmyadmin 门户访问 MySQL 服务器。虽然,我为此使用了一个稍微不同的隧道:ssh -D 8080 userName@sshHost。哪个有效。我用命令行打开了隧道:ssh -L 9000:localhost:3306 userName@sshHost。然后在 RI 中认为这段代码应该可以工作: myDB
    • 啊,可能是端口转发限制。我会联系管理员询问是否是这种情况。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2013-02-05
    • 2016-09-08
    • 2016-06-14
    • 1970-01-01
    • 2021-12-15
    • 2011-07-06
    • 2012-10-05
    相关资源
    最近更新 更多