【问题标题】:SSH Connection to MySQLSSH 连接到 MySQL
【发布时间】:2015-08-28 12:35:03
【问题描述】:

我遇到了一个问题,但我不确定哪里出了问题。我正在建立与远程服务器的 SSH 连接,并从那里尝试访问 MySQL 数据库。 SSH 连接正确连接,但是,在尝试访问 MySQL 数据库时,我不断收到错误消息。

在寻求帮助之前,我已经难以置信地搜索了将近一周

更新!!!

好的,所以我已经能够将其归结为与 JSCH 有关。我在外部使用 putty 建立了 SSH 连接并运行代码而没有实际使用 JSCH 来建立 SSH 连接,并且我能够完全访问数据库。在这一点上,对 JSCH 的任何帮助都会非常有帮助。

    int lport=3306;
    String rhost="SERVERNAME";
    String host="SERVERNAME";
    int rport=3306;
    String user="USERNAME";
    String password="SSHPass";
    String dbuserName = "DBUSER";
    String dbpassword = "DBPWD";
    String url = "jdbc:mysql://localhost:3306/dbname";
    String driverName="com.mysql.jdbc.Driver";
    Connection conn = null;
    Session session= null;
    try{
        //Set StrictHostKeyChecking property to no to avoid UnknownHostKey issue
        java.util.Properties config = new java.util.Properties(); 
        config.put("StrictHostKeyChecking", "no");
        JSch jsch = new JSch();
        session=jsch.getSession(user, host, 22);
        session.setPassword(password);
        session.setConfig(config);
        session.connect();
        System.out.println("Connected");
        int assinged_port=session.setPortForwardingL(lport, rhost, rport);
        System.out.println("localhost:"+assinged_port+" -> "+rhost+":"+rport);
        System.out.println("Port Forwarded");

        //mysql database connectivity
        Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection(url, dbuserName, dbpassword);
        System.out.println ("Database connection established");
        System.out.println("DONE");
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        if(conn != null && !conn.isClosed()){
            System.out.println("Closing Database Connection");
            conn.close();
        }
        if(session !=null && session.isConnected()){
            System.out.println("Closing SSH Connection");
            session.disconnect();
        }
    }
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.io.EOFException
MESSAGE: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

STACKTRACE:

java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1997)
    at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:573)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1044)
    at com.mysql.jdbc.Connection.createNewIO(Connection.java:2775)
    at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at Data.SQLConnection.getConnection(SQLConnection.java:49)
    at finalproject.Dashboard.jButton1ActionPerformed(Dashboard.java:391)
    at finalproject.Dashboard.access$200(Dashboard.java:37)
    at finalproject.Dashboard$4.actionPerformed(Dashboard.java:221)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6525)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6290)
    at java.awt.Container.processEvent(Container.java:2234)
    at java.awt.Component.dispatchEventImpl(Component.java:4881)
    at java.awt.Container.dispatchEventImpl(Container.java:2292)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
    at java.awt.Container.dispatchEventImpl(Container.java:2278)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

任何帮助将不胜感激。

【问题讨论】:

  • 尝试在命令行连接服务器 - 可能是防火墙问题
  • 同时使用 CMD 和 Putty 允许我进行连接,从那里我可以毫无问题地在 MySql Workbench 中提取数据库:( 日志服务器端也显示 SSH 连接。
  • 我不是 Java 专家,所以我不确定您的具体问题是什么,但我最近写了一个 comprehensive tutorial on securing MySQL via SSL。您可能会发现它很有帮助。
  • session.setPortForwardingL 是阻塞调用吗?莫非是在端口完全转发之前就发起了mysql连接?
  • @Erik Man 所以为了测试这一点,我在程序外部建立了 SSH 连接,试图看看我是否可以建立一个连接,但我收到了同样的错误。由于某种原因,它没有与 SQL db 一起使用。

标签: java mysql jdbc ssh


【解决方案1】:

WOOOOO 我成功了!所以我所做的(我不知道为什么会这样)是我刚刚创建了一个新的类来建立与 JSCH 的 SSH 连接。然后我把所有有趣的 SQL 东西放在另一个里面。在连接事件处理程序下的仪表板 gui 中,我首先添加了 JSCH 连接,然后连接到 SQL DB。 谢谢大家的帮助!你们都很棒!

【讨论】:

    猜你喜欢
    • 2021-08-07
    • 2016-06-27
    • 2014-11-24
    • 2015-10-02
    • 2014-02-18
    • 2014-09-11
    • 2016-08-13
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多