String jumpserverHost = "ssh.example.com";
String jumpserverUsername = "sshuser";
// The hostname/IP address and port, you would use on the SSH server
// to connect to the database.
// If the database runs on the same machine as the SSH server, use "localhost".
String databaseHost = "database.example.com";
int databasePort = 3306;
String databaseUsername = "dbuser";
String databasePassword = "dbpass";
JSch jsch = new JSch();
// Public key authentication example
// (but you can use password authentication, if appropriate).
jsch.addIdentity("~/.ssh/id_rsa");
// Connect to SSH jump server (this does not show an authentication code)
Session session = jsch.getSession(jumpserverUsername, jumpserverHost);
session.connect();
// Forward randomly chosen local port through the SSH channel to database host/port
int forwardedPort = session.setPortForwardingL(0, databaseHost, databasePort);
// Connect to the forwarded port (the local end of the SSH tunnel)
// If you don't use JDBC, but another database client,
// just connect it to the localhost:forwardedPort
String url = "jdbc:mysql://localhost:" + forwardedPort;
Connection con = DriverManager.getConnection(url, databaseUsername, databasePassword);
6条答案
按热度按时间ippsafx71#
我的理解是,您希望访问在远程机器上运行的mysql服务器,并通过ssh隧道监听端口3306。
要使用命令行ssh客户端创建这样一个从本地计算机上的端口1234到远程计算机上的端口3306的隧道,您可以从本地计算机键入以下命令:
要在java中做同样的事情,可以使用jsch,ssh2的java实现。从其网站:
jsch允许您连接到sshd服务器并使用端口转发、x11转发、文件传输等,您可以将其功能集成到自己的java程序中。jsch是根据bsd风格的许可证进行许可的。
举个例子,看看
PortForwardingL.java
. 连接会话后,使用以下命令创建到mysql的jdbc连接jdbc:mysql://localhost:1234/[database]
作为连接url。ctrmrzij2#
我的详细代码如下:
62o28rlo3#
ifsvaxew4#
hivapdat5#
虽然现有的答案是正确的,但它们掩盖了其他代码膨胀中的重要代码。
这是通过ssh通道隧道jdbc(或任何其他)数据库连接所需的基本代码:
您还必须处理主机密钥验证。请参见:
如何在使用jsch sftp库时解析java unknownhostkey?
d5vmydt96#
首先,谢谢你的作品太好了!
不过,我想知道是否应该为每个(可能同时发生的)sql连接重用该会话,或者是否应该每次都创建一个新会话,并且仅在会话由于某种原因已过期时才刷新它。
目前,每次建立连接时,我都会在这里创建该控制器的一个新示例,然后使用从该控制器获得的连接执行sql查询,然后手动关闭它。
如果我能用try-with-resource使类可用并关闭它自己也会很好。我会调查的。因为我不知道´我不想错过关门的机会。
那个´事情是这样的,我现在正在连接数据库。
如果你想知道DBSETTINGSI控制器´我自己也做了,只需将设置放在本地sqlite db的文本列中,并为其分配一个键(即枚举)´s int值)。只是复制我从其他项目中重用的粘贴代码,所以这样做既简单又快速。