2016-03-11 3 views
1

Как это реализовать в Java-коде?Java SSH Соединение с MySQL

ssh -L 1234:localhost:3306 mysql.server.remote 

У меня есть Java настольное приложение с базой данных в общий сервер (Интернет), чтобы быть доступными отовсюду. Ребята, которые будут использовать программное обеспечение, не будут открывать терминалы для выполнения команд до и после использования программного обеспечения ...

Так что мне нужно решение для подключения моего приложения к базе данных при запуске приложения и удалении соединений (conn .close() и ssh), когда они закроют приложение. Для этого все это (код выше) должно быть внутри моего скрипта ... И это то, чего я не могу достичь ...

Я использовал JSch, и я успешно создал туннель SSH (на порту 22) , но никак не подключить MySQL ... Любая помощь приветствуется.

Весь код здесь:

public static void main(String[] args) throws SQLException { 

    String host="ssh.Mysite.com"; 
    String rhost="localhost"; 
    int rport=3306; 
    int lport=4321; 

    String user="userMysite.com"; 
    String password="passMysite.com"; 

    String dbuserName = "UserDB.com"; 
    String dbpassword = "PassDB.com"; 
    String url = "jdbc:mysql://localhost:3306/DB.com"; 
    String driverName="com.mysql.jdbc.Driver"; 
    Session session= null; 

    try{ 
    //ssh tunnel creation   
     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(); 
     int assinged_port=session.setPortForwardingL(lport, rhost, rport); 

    //mysql database connect     
     Class.forName(driverName).newInstance(); 
     dbConn = DriverManager.getConnection (url, dbuserName, dbpassword); 

String sql = "SELECT * FROM client ";  
    PreparedStatement ps = dbConn.prepareStatement(sql); 
    ResultSet rs = ps.executeQuery(); 
      while (rs.next()){ 
        System.out.println(rs.getString("name")); 
      } 

    }catch(JSchException e){ 
     e.printStackTrace();    
    }finally{ 
     if(dbConn != null && !dbConn.isClosed()){ 
      dbConn.close(); 
     } 
     if(session !=null && session.isConnected()){ 
      session.disconnect(); 
     } 
    } 
} 

Для тестирования я сделал следующий код:

String url = "jdbc:mysql://localhost:3306"; 
String driverName="com.mysql.jdbc.Driver"; 
Class.forName(driverName); 
Connection dbConn = DriverManager.getConnection (url, dbuserName, dbpassword); 

     try { 
      ResultSet rs = dbConn.getMetaData().getCatalogs(); 
         while (rs.next()) { 
          System.out.println("TABLE_CAT = " + rs.getString("TABLE_CAT")); 
         }   
     }catch(SQLException e){ 
         e.printStackTrace(); 
     } 

Результаты:

localhost:3306 => Печать мне все базы данных в локальном хосте моего компьютера ;

remote.server.mysql:3306 или remote.server.mysql:4321 или localhost:4321 => ОШИБКА

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

Спасибо!

+0

Как вы можете подключиться к mysql в своем коде? –

+0

измените его на 'jdbc: mysql: //mysql.server.remote: 3306/remoteDB' –

+0

dbConn = DriverManager.getConnection (" jdbc: mysql: // localhost: 3306/remoteDB, dbuserName, dbpassword "); - после того, как туннель создается –

ответ

0

Не могли бы вы попробовать запустить двоичный файл ssh с Java? Например:

Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec("ssh -L 1234:localhost:3306 mysql.server.remote"); 

Очевидно, для этого требуется система для установки ssh в PATH.