R SSH 隧道 MySQL

标签 r ssh

我正在寻找一种允许我使用 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 代码中究竟需要使用什么连接到数据库。

最佳答案

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

一旦你有 ssh在您的 Windows 机器上运行,然后尝试首先通过 SSH 建立隧道。从命令行运行:

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

显然,用适当的信息替换 '<>' 中的所有内容。它会要求输入密码,记住这不是数据库密码,而是服务器本身的密码。值得注意的是,server_ip 不必是上面有数据库的服务器,只要是位于正确子网内并运行 SSH 服务器的任何服务器,这几乎是所有 Linux 机器。

现在,建立一个 ODBC 连接,除了 IP 本地主机 ,以及端口 未使用的本地端口 .现在,尝试在 R 中连接到您的新 ODBC 连接。如果这可行,您就成功了。

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

如果它没有要求您输入密码,则您已成功创建 key 对。现在您已准备好运行 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 连接。

关于R SSH 隧道 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19551095/

相关文章:

regex - 如何使用正则表达式根据模式返回一小部分字符

r 当 root 相似时停止猜测名称

r - 安装可供所有用户使用的 R 软件包

java - 使用apachecamel删除远程目录

amazon-web-services - 强制 AWS EC2 实例对本地流量使用私有(private) IP

根据组平均值重新排序因子水平

r - 在ggplot中循环变量

.net - 使用SSH.NET恢复文件传输

docker - 使用 scp 在两个 docker 容器之间复制文件

windows - 如何在 mac 机器上通过 ssh 获取 windows 机器的 GUI 访问权限?