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

Posted

技术标签:

【中文标题】在具有特定 mysql 主机的远程主机上使用 SSH 隧道连接到 MySql 数据库【英文标题】:Connecting to MySql database with SSH tunneling on remote host with specific mysql host 【发布时间】: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),因为这是你的数据包离开隧道的地方 【参考方案1】:

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

代替:

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

应该是的

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

现在连接运行良好。

【讨论】:

我也有类似的问题。你能发布整个代码sn-p吗? 嗨,阿尼鲁德。我也面临同样的问题。你能告诉我什么是 localSSHUrl 吗?【参考方案2】:

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

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

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

很多例子使用remote_host通过端口转发来连接SSH和数据库,但是如果你只有本地访问数据库,就会连接失败。

【讨论】:

以上是关于在具有特定 mysql 主机的远程主机上使用 SSH 隧道连接到 MySql 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何在远程服务器上获取 mysql 主机名

mysql 从远程数据库转储到本地主机输出文件

Ansible 从远程主机添加或删除MySQL数据库

如何在阿里云主机上安装mysql

Mysql 远程自动化备份

尝试连接到远程 MySQL 主机(错误 2003)