5

我正在寻找一种允许我使用 SSH 隧道连接到 R 中的 MySQL 服务器(而不是文件)的方法;我假设它需要 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 代码中究竟需要使用什么连接到数据库。

4

1 回答 1

4

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

在 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和端口used_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 连接。

于 2013-10-23T21:23:48.277 回答