R SSH隧道MySQL

时间:2013-10-23 19:55:22

标签: r ssh

我正在寻找一种方法,允许我使用SSH隧道连接到R中的MySQL服务器(而不是文件);我假设它需要RCurl和RODBC的组合,但我似乎无法让它正常工作。

我遇到this postthis post谈到利用SSH连接到特定文件或表格,但我希望将其用作执行不同SQL查询的Shiny应用程序的一部分基于来自用户的输入,这将需要连接到服务器而不是特定文件。

我假设代码看起来沿着x = scp("remote.ssh.host.com", "/home/dir/file.txt", "My.SCP.Passphrase", user="username")行,但是我会用"/home/dir/file.txt"语句替换odbcConnect()段,或者用特定的端口号替换它我想访问的数据库?

编辑:我用于常规odbcConnect()的行是odbcConnect(dsn, uid = "userid", pwd = "password")。问题的一部分是,我在Windows上开发它,但它将被部署到Linux服务器(由其他人处理)所以我很难弄清楚究竟需要在我的服务器中使用什么.R代码连接到数据库。

1 个答案:

答案 0 :(得分:4)

好的,所以要在Windows上进行测试,要么抓住Cygwin,要么安装OpenSSH,这样就可以在Windows中从命令行运行ssh,就像在Linux中一样。

在Windows框中运行ssh后,首先尝试通过SSH建立隧道。从命令行运行:

ssh -f <server_user>@<server_ip>  -L <unused_local_port>:localhost:<database_remote_port> -N 

显然,替换'&lt;&gt;'中的所有内容有适当的信息。它会询问密码,并记住这不是数据库密码,而是服务器本身的密码。值得注意的是,server_ip不一定是包含数据库的服务器,只是位于正确子网内且运行SSH服务器的任何服务器,而SSH服务器几乎都是Linux机器。

现在,设置ODBC连接,但使IP localhost 和端口 unused_local_port 除外。现在,尝试连接到R中的新ODBC连接。如果这有效,那么就在那里。

下一个问题是密码,因为您必须输入密码才能通过SSH连接,但在R中,您将无法在简单的system命令后输入密码。所以你必须设置一些公共/私有rsa密钥对。值得注意的是,这将使得任何有权访问您的用户/通过Windows框的人现在可以自动访问您的服务器,所以要小心。首先,生成SSH密钥:

ssh-keygen -t rsa

不要输入密码,并将其保存在默认位置。现在,在远程主机上创建公钥的目录,然后将公钥放在那里。

# This creates a directory on the other machine if it wasn't already there. (Type in your password on the remote machine)
ssh <server_user>@<server_ip> mkdir -p .ssh
# This adds your public key to the list of accepted ones:
cat ~/.ssh/id_rsa.pub | ssh <server_user>@<server_ip> 'cat >> .ssh/authorized_keys'

现在尝试从命令行再次创建隧道:

 ssh -f <server_user>@<server_ip>  -L <unused_local_port>:localhost:<database_remote_port> -N 

如果它没有要求您输入密码,则表示您已成功创建密钥对。现在,您已准备好从命令行运行ssh命令。但在你这样做之前,尝试杀死你的ssh命令,这样你就可以确保R实际上是在创建隧道,而你不仅仅是重用旧的。您可以通过Windows任务管理器(Ctrl + Alt + Esc)执行此操作,只需右键单击并结束处理ssh.exe。

所以,只需运行:

system('ssh -f <server_user>@<server_ip>  -L <unused_local_port>:localhost:<database_remote_port> -N')

然后连接到新的隧道ODBC连接。