R SSH隧道MySQL

5
我正在寻找一种方法,可以使用SSH隧道连接到MySQL服务器(而不是文件),并在R中执行操作;我认为这需要结合RCurl和RODBC来完成,但我似乎无法使其正常工作。
我看到了这篇文章这篇文章,它们讨论了如何利用SSH连接到特定的文件或表,但我希望将其作为Shiny应用程序的一部分使用,该应用程序将根据用户输入执行不同的SQL查询,这将需要连接到服务器而不是特定的文件。
我猜测代码应该类似于这样: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服务器上,因此我正在努力弄清楚在我的server.R代码中需要使用什么来连接到数据库。

哦,R运行在什么操作系统上?如果您正在Windows上运行,您可以首先使用PuTTy设置隧道,然后连接到隧道。如果您在Mac OS或Linux上,则可以通过SSH命令设置隧道,并从R中调用该命令。 - nograpes
另外,当您不需要隧道时,您通常使用哪条线连接到MySQL服务器? - nograpes
@nograpes,我刚刚添加了一个编辑来解决你的两个意见。 - Corey Christensen
1个回答

4

好的,要在Windows上测试这个功能,你可以选择安装Cygwin或者安装OpenSSH,这样你就可以像在Linux中一样,在Windows命令行中运行ssh

一旦你在Windows上成功运行了ssh,那么首先尝试通过SSH建立一个隧道。在命令行中输入以下命令:

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

显然,将“<>”中的所有内容替换为适当的信息。它会要求输入密码,请记住这不是数据库密码,而是服务器本身的密码。值得注意的是,server_ip不必是具有数据库的服务器,只要在正确的子网内运行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连接。


一个小提示:通过Windows任务管理器终止ssh.exe进程可能无法正常工作。使用Cygwin,您可以运行ps命令,识别正在运行SSH隧道的进程,然后使用kill <pid>命令结束该进程。 - nograpes
1
RStudio在Windows上已经包含了SSH。从RStudio关于Git/SVN的支持页面: "RStudio在RStudio\bin\msys_ssh目录中包含Msys SSH客户端的一个版本。该目录会被自动添加到PATH(只针对RStudio而不是全局),并且也可以在使用Tools -> Shell命令打开的命令提示符窗口中使用该目录。" - dnlbrky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接