使用具有特定mysql主机的远程主机上的SSH隧道连接到MySql数据库

时间:2016-01-12 12:12:55

标签: java mysql database jdbc ssh

我使用Jsch连接到远程mysql数据库,其中ssh主机与mysql主机不同,如下图所示的上半部分所示: enter image description here

以下是我用于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 url。

2 个答案:

答案 0 :(得分:2)

这是错误的端口转发方式,这是问题的根本原因:

而不是:

int assinged_port = session.setPortForwardingL(localPort, remoteHost, remotePort);

应该是

int assinged_port = session.setPortForwardingL(localPort, localSSHUrl, remotePort);

现在连接正常。

答案 1 :(得分:1)

我知道这很旧,但是localSSHUrl实际上是您登录SSH时将使用的主机。

简而言之,当您尝试以本地用户身份连接到数据库时,这通常是“ localhost”。

int assigned_port = session.setPortForwardingL(localPort, “localhost”, remotePort);

许多示例都使用remote_host通过端口转发将SSH和数据库连接到数据库,但是如果您仅对数据库具有本地访问权限,它将无法连接。