【问题标题】:R SSH Tunnel MySQLR SSH 隧道 MySQL
【发布时间】:2013-10-24 05:23:48
【问题描述】:

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

我遇到了this postthis post,它们谈论使用 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 调用该命令。
  • 另外,当您不需要需要隧道时,您能否添加您通常用来连接到 MySQL 服务器的线路?
  • @nograpes 我刚刚添加了一个编辑来解决您的两个 cmets。

标签: r ssh


【解决方案1】:

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

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

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

显然,用适当的信息替换“”中的所有内容。它会要求输入密码,记住这不是database 密码,而是服务器本身的密码。值得注意的是,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 &lt;pid&gt;
  • Windows 上的 RStudio 已经包含 SSH。来自RStudio support page on Git/SVN:“RStudio 在 RStudio\bin\msys_ssh 目录中包含一个 Msys SSH 客户端版本。此目录会自动添加到 PATH(仅适用于 RStudio,而不是系统范围),并且在 PATH 中也可用用于使用 Tools -> Shell 命令打开的命令提示符窗口。”
猜你喜欢
  • 2012-03-06
  • 2018-02-22
  • 2018-10-06
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 2014-12-13
  • 2017-07-10
相关资源
最近更新 更多