【发布时间】:2016-04-17 01:15:38
【问题描述】:
我使用Jsch连接远程mysql数据库,ssh主机和mysql主机不一样,如下图上半部所示:
以下是我用于 SSH 连接的代码:
private static void connectSSH() throws SQLException {
try {
java.util.Properties config = new java.util.Properties();
JSch jsch = new JSch();
jsch.setLogger(new MyLogger());
session = jsch.getSession(sshUser, sshHost, 22);
jsch.addIdentity(SshKeyFilepath, sshPassword);
config.put("StrictHostKeyChecking", "no");
config.put("ConnectionAttempts", "3");
session.setConfig(config);
session.connect();
System.out.println("SSH Connected");
Class.forName(driverName).newInstance();
int assinged_port = session.setPortForwardingL(localPort, remoteHost, remotePort);
System.out.println("localhost:" + assinged_port + " -> " + sshHost + ":" + remotePort);
System.out.println("Port Forwarded");
} catch (Exception e) {
e.printStackTrace();
}
}
并最终使用以下代码连接到数据库:
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:" + localPort, dbUser, dbPassword);
我能够成功地进行 SSH 连接,但是在下面的行中执行被挂起:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:" + localPort, dbUser, dbPassword);
我已经通过命令行连接仔细检查了我的 SSH 和数据库凭据我可以使用
连接到数据库mysql -h host1 -u "myusername" -p"mypasswordhere"
我想问题可能是由于远程主机上的 mysql 主机 不是 localhost 而是 host1 我不知道在哪里指定jdbc 网址。
【问题讨论】:
-
您在“挂起”时是否在本地和远程计算机上进行了 netstat?可能是防火墙/路由问题
-
在我的“本地”上挂起时显示“已建立”用于使用我的本地端口转发到远程机器的连接
-
所以隧道似乎没问题。你有你通过隧道进入的主机的 netstat 吗?
-
这样做了但是要寻找什么?
-
检查 target-ip mysql 和 target-port mysql 端口。 socket 应该来自 localhost (linux box),因为这是你的数据包离开隧道的地方
标签: java mysql database jdbc ssh