我正在寻找一种方法,允许我使用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服务器(由其他人处理)所以我很难弄清楚究竟需要在我的服务器中使用什么.R代码连接到数据库.
好的,要在 Windows 上测试它,要么获取 Cygwin,要么安装OpenSSH,ssh这样您就可以在 Windows 中从命令行运行,就像在 Linux 中一样。
在 Windows 机器上运行后ssh,首先尝试通过 SSH 建立隧道。从命令行运行:
ssh -f <server_user>@<server_ip> -L <unused_local_port>:localhost:<database_remote_port> -N
Run Code Online (Sandbox Code Playgroud)
显然,将“<>”中的所有内容替换为适当的信息。它将要求输入密码,请记住这不是数据库密码,而是服务器本身的密码。值得注意的是,server_ip 不一定是带有数据库的服务器,只要是位于正确子网内并且运行 SSH 服务器的任何服务器即可,这几乎是所有 Linux 机器。
现在,设置 ODBC 连接,除了将 IP 设置为localhost,并将端口设置为used_local_port。现在,尝试在 R 中连接到新的 ODBC 连接。如果成功,那么您就成功了一半。
下一个问题是密码,因为您必须输入密码才能通过 SSH 连接,但在 R 中,您将无法在简单的system命令后输入密码。所以你必须设置一些公共/私有 rsa 密钥对。值得注意的是,这将使任何能够访问您的 Windows 机器上的用户/密码的人现在都可以自动访问您的服务器,所以要小心。首先,生成 SSH 密钥:
ssh-keygen -t rsa
Run Code Online (Sandbox Code Playgroud)
不要创建密码,并将其保存在默认位置。现在,在远程主机上为您的公钥创建目录,并将您的公钥放入其中。
# 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'
Run Code Online (Sandbox Code Playgroud)
现在尝试从命令行再次创建隧道:
ssh -f <server_user>@<server_ip> -L <unused_local_port>:localhost:<database_remote_port> -N
Run Code Online (Sandbox Code Playgroud)
如果它没有要求您输入密码,则您已成功创建密钥对。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')
Run Code Online (Sandbox Code Playgroud)
然后连接到新的隧道 ODBC 连接。