如何使用IntelliJ和JDBC进行SSH隧道连接数据库?

16

我在使用IntelliJ和JDBC连接托管在服务器上的数据库时遇到了问题。在命令行中,命令如下:

ssh username@server -L 11100:ct1:28017 -N
成功创建了隧道并执行命令:

psql db_name -h localhost -p 11100 db_username

连接到数据库并成功使用。如何在IntelliJ Data Sources和SSH隧道工具中正确翻译此内容?

目前,对于SSH隧道设置,我有:

代理主机:服务器

端口:22

代理用户:用户名

对于常规选项卡,我有:

主机:localhost

端口:28017

数据库:db_name

用户:db_username

测试连接后,连接成功返回。在我的程序中,我有:

Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:28017/db_name", user, password);

URL参数是由IntelliJ生成的。然而,这会导致错误“拒绝连接到localhost:28017。”

有什么想法我做错了什么吗?


端口28017是否已打开? - Andremoniy
在服务器上,是的它是开放的。 - echoeida
看起来你本地使用端口11100进行SSH隧道连接,这就是你需要在连接字符串中指定的端口号(就像在psql db_name -h localhost -p 11100 db_username中一样)。 - Mark Rotteveel
3个回答

12

如果有人正在寻找不需要外部库的简单解决方案,这是我在IntelliJ中的设置:

  1. 打开数据库视图(View -> Tool Windows -> Database)。
  2. 添加新的数据源(右键点击,New -> Data Source -> Postgres/Mysql)。在主机中使用 127.0.0.1(不是 localhost, 有时 localhost 无法正确解析)。
  3. 填写其余的字段,如您在远程主机上配置的那样。

输入图片说明

现在,点击SSH/SSL选项卡并配置SSL隧道:

输入图片说明


你可以浏览数据库,但是如何从你的应用程序连接到它呢? - Mohit Singh
@MohitSingh 这取决于应用程序及其配置 - 它是Spring Boot、Node还是其他什么。你不会得到一个简短的回答。 - gmode
我的意思是这是否使得数据库在某个端口上可访问?OP的问题 ssh username@server -L 11100:ct1:28017 -N 将原先由于某个VPC而无法访问的数据库暴露在11100端口上。但是现在,无论应用程序栈或配置如何,都可以直接从应用程序连接到它。 - Mohit Singh
这在IntelliJ中对我有效。 - Just a Dev
你有没有想过如何在基于文件的数据库而不是监听服务器数据库上运行它?我原本以为Intellij使用的是类似sshfs的东西,而不是端口转发,因为我正在使用sqlite并且处于那种心态。最终我还是使用了sshfs。不过你的回答帮助我看清了预期的用途,谢谢。 - haventchecked

1

你是否使用像SSHJ(https://github.com/hierynomus/sshj)这样的Java客户端连接到SSH服务器?

你的DriverManager上的URL似乎有误,请尝试使用11100端口。


那似乎起作用了。我最終仍然使用Jsch库及其端口转发。 - echoeida

1
如果出现错误 Exhausted available authentication methods ❶,请确保提供必要的密码短语 ❷。这很容易被忘记,因为密码短语通常由操作系统钥匙环管理器自动提供,这使得似乎密钥没有密码短语。
❸ 中的凭据适用于Postgres。这些将无法使用对等身份验证。在我的情况下,我需要在 pg_hba.conf 中添加以下内容:
hostnossl  all  rdahl  127.0.0.1/32  md5

❹中的代理主机和用户是客户端所看到的 ssh 服务器。

JetBrains 的文档很奇怪,让我对其是否只是使用现有的 SSH 隧道还是创建一个新的 SSH 隧道产生了疑问。它会创建一个新的 SSH 隧道。

两个对话框中的测试连接按钮都触发相同的测试。

SSH credentials dialog Data sources general Data sources SSH


我已经成功地调整了数据库,但不确定如何在数据源中提供此URL。我正在运行一个Spring Boot应用程序,并需要在application.yaml中提供Datasource URL,请问有什么线索可以帮助我们完成吗? - M-sAnNan
对于通过默认端口隧道连接到本地主机的Postgres,我的猜测是jdbc:postgresql:database。其中,database是您的数据库名称。更多信息请参见:https://jdbc.postgresql.org/documentation/80/connect.html。 - Roger Dahl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接