我正在尝试通过 SSH 隧道将 RStudio 会话连接到服务器(数字海洋)上的 PostgreSQL 数据库。我是 SSH 连接的新手,特别是使用 R。
系统信息:
在我的本地计算机上,我使用的是 Windows 10 x64。我已经安装了 PostgreSQL 13、R 4.0.3、OpenSSH Server 和 OpenSSHD Client(对于 Open SSH,我使用的是标准的 Windows 版本)。
在 Digital Ocean 服务器上,我有 Ubuntu 20.04.1、postgresql 12+214ubuntu0.1、openssh-server 1:8.2p1-4ubuntu0.2
一般背景:
首先,我已经生成了一个 .PEM 密钥对(我将把私钥的密码称为“passp”)私钥并在 Digital Ocean Server(从现在开始的 DO Server)中启用公钥。此外,DO 服务器已配置为允许 SSH 连接(例如 ip:123.456.789.01 和端口:1234)。
通过上面提到的配置,我能够将 PgAdmin 连接到 DO 服务器中的 Postgresql 数据库。我使用以下参数登录到数据库:
- 数据库名称 = “数据库”
- doserver_user = "根"
- db_user = "用户名"
- passqord = "密码"
我已经设法使用 CMD 应用程序从我的 PC 连接到 DO 服务器。我正在使用的命令如下:
ssh -i "C:/path/to/ssh/key" -L 5555:127.0.0.1:1234 [email protected]
当这个连接打开时,我当然可以访问 DO Server。为了验证本地端口 5555 是否正在运行,我运行了命令netstat -ao | find "5555"
并收到以下信息:
TCP 127.0.0.1:5555 hp-PC:0 LISTENING 14132
在迁移到 R 之前,我仔细检查了 sshd_config 文件以确保 TCPForwarding 是允许的,并且 ListenAdress 是为 localhost (127.0.0.1) 配置的。我在我的 PC 和 DO 服务器上做了这个检查。
完成所有这些后,我去了 RStudio 并尝试使用以下代码连接到 DO 服务器上的 Postgresql 数据库:
library(DBI) #DBI version 1.1.1
library(RPostgres) #RPostgres version 1.3.2.9000
con <- DBI::dbConnect(drv = RPostgres::Postgres(),
dbname= "db",
host = "127.0.0.1",
port = "5555",
user= "root",
password= "pwd")
我正在使用主机:“127.0.0.1”和端口“5555”,因为据我了解,它是正在侦听的端口,并且已经转发到 DO 服务器 IP (123.456.789.01)。
尝试和错误:
错误 1
我已经为 R 中的代码尝试了很多不同的选项,因此我遇到了几个错误。使用上面提到的初始代码,我收到以下错误:
Error: SSL error: wrong version number
expected authentication request from server, but received S
如果我将主机更改为“localhost”或将用户更改为“用户名”(我访问数据库的用户,而不是 DO 服务器),我也会收到相同的错误。
错误 2
我尝试在 R 代码中调用不同的端口(例如将端口更改为“5433”)以查看是否会发生某些事情并得到错误:
could not connect to server: Connection refused (0x0000274D/10061)
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5433?
如果我关闭来自 CMD 应用程序的连接,或者如果我将 Host 的值更改为另一个 IP(例如 host = 111.222.333.44),也会发生此错误。
错误 3
作为一个绝望的举动,我尝试直接从 RStudio 创建一个连接。为此,我使用了以下内容:
library(ssh) #ssh version 0.7.0
session <- ssh::ssh_connect(host= "[email protected]:22", keyfile = "C:/path/to/ssh/key")
ssh::ssh_tunnel(session, port = local_port, target = serv_host)
并得到了结果:
/ Waiting for connection on port 5555...
由于 R 是单线程的,我无法从同一个会话(会话 A)运行 DBI::dbConnect。所以我开始了一个新会话(会话 B)并运行 DBI::dbConnect,如上所述。结果是:
#Session A
- Waiting for connetion on port 1090... client connected!
Error: libssh failure at 'channel_open_forward': Socket error: No error
#Session B
#No result, just got stuck processing
问
我只想能够将我 PC 中的 RStudio 连接到 DO 服务器上的 Postgresql 数据库。我真的不介意这是通过指出我在配置或代码中做错了什么来完成的,或者是否有完全不同的方式来做到这一点。
我将非常感谢您能给我的所有建议。
显然,这有一个简单的解决方案,由Daniel Verité提供。
调用端口“5432”很重要,因为它是 Postgresql 监听服务器的默认端口(在本例中为 Digital Ocean)。因此我在 CMD 应用程序中的最终代码如下所示:
在哪里:
一旦我这样做了,R 就可以使用上面提到的代码毫无问题地连接。
psql 是 PostgreSQL 提供的交互式终端程序。您可以使用 psql 工具做很多事情,例如执行 SQL 语句、管理数据库对象等。
你可以检查这个:
您可以在此处查看有关 SSH 端口的更多信息