好的,所以要在 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 连接。