2009-12-28 7 views

답변

33

필자가 원격 컴퓨터에서 실행중인 mysql 서버에 액세스하여 수신 대기중인 경우 포트 3306을 SSH 터널을 통해 사용한다고 가정합니다.

명령 행 SSH 클라이언트를 사용하여 원격 컴퓨터의 포트 3306에 로컬 컴퓨터의 포트 1234에서 이러한 터널을 만들려면 로컬 컴퓨터에서 다음 명령을 입력합니다

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

하기 위해 Java에서와 동일한 것은 JSch, Java 구현 인 SSH2를 사용할 수 있습니다. 웹 사이트에서 :

JSch는 당신이 SSHD 서버에 연결 등 포트 포워딩, X11 포워딩, 파일 전송을 사용할 수 있습니다, 당신은 당신의 자신의 자바 프로그램으로 그 기능을 통합 할 수 있습니다. JSch는 BSD 스타일 라이센스에 따라 라이센스가 부여됩니다.

예를 들어, PortForwardingL.java을 살펴보십시오. 세션이 연결되면 연결 URL로 jdbc:mysql://localhost:1234/[database]과 같은 것을 사용하여 MySQL에 대한 JDBC 연결을 생성하십시오.

+0

예, 당신의 지시에 따라 ... 감사합니다 –

+0

그것은 나를 위해 일하지 않습니다 .. 세션이 연결된 후'localhost : [port]'에 연결하려고하면 자바, 어떤 예외를주지 않고 영원히 같은 시도하지만 데이터베이스에 연결할 수 없습니다. 도움을 주시면 감사하겠습니다. – harsh

10

내 세부 코드는 다음과 같습니다 :

package mypackage; 
import java.sql.*; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 

public class UpdateMySqlDatabase { 
    static int lport; 
    static String rhost; 
    static int rport; 
    public static void go(){ 
     String user = "ripon"; 
     String password = "wasim"; 
     String host = "myhost.ripon.wasim"; 
     int port=22; 
     try 
      { 
      JSch jsch = new JSch(); 
      Session session = jsch.getSession(user, host, port); 
      lport = 4321; 
      rhost = "localhost"; 
      rport = 3306; 
      session.setPassword(password); 
      session.setConfig("StrictHostKeyChecking", "no"); 
      System.out.println("Establishing Connection..."); 
      session.connect(); 
      int assinged_port=session.setPortForwardingL(lport, rhost, rport); 
      System.out.println("localhost:"+assinged_port+" -> "+rhost+":"+rport); 
      } 
     catch(Exception e){System.err.print(e);} 
    } 
    public static void main(String[] args) { 
     try{ 
      go(); 
     } catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
      System.out.println("An example for updating a Row from Mysql Database!"); 
      Connection con = null; 
      String driver = "com.mysql.jdbc.Driver"; 
      String url = "jdbc:mysql://" + rhost +":" + lport + "/"; 
      String db = "testDB"; 
      String dbUser = "wasim"; 
      String dbPasswd = "riponalwasim123"; 
      try{ 
      Class.forName(driver); 
      con = DriverManager.getConnection(url+db, dbUser, dbPasswd); 
      try{ 
      Statement st = con.createStatement(); 
      String sql = "UPDATE MyTableName " + 
        "SET email = '[email protected]' WHERE email='[email protected]'"; 

      int update = st.executeUpdate(sql); 
      if(update >= 1){ 
      System.out.println("Row is updated."); 
      } 
      else{ 
      System.out.println("Row is not updated."); 
      } 
      } 
      catch (SQLException s){ 
      System.out.println("SQL statement is not executed!"); 
      } 
      } 
      catch (Exception e){ 
      e.printStackTrace(); 
      } 
      } 
     } 
2
package framework.restapi.utils; 

import java.sql.*; 

import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; 

import java.sql.Connection; 
import java.util.ArrayList; 
import java.util.List; 

public class SQLConnection { 
    private static Connection connection = null; 
    private static Session session = null; 

    private static void connectToServer(String dataBaseName) throws SQLException { 
     connectSSH(); 
     connectToDataBase(dataBaseName); 
    } 

    private static void connectSSH() throws SQLException { 
     String sshHost = ""; 
     String sshuser = ""; 
     String dbuserName = ""; 
     String dbpassword = ""; 
     String SshKeyFilepath = "/Users/XXXXXX/.ssh/id_rsa"; 

     int localPort = 8740; // any free port can be used 
     String remoteHost = "127.0.0.1"; 
     int remotePort = 3306; 
     String localSSHUrl = "localhost"; 
     /***************/ 
     String driverName = "com.mysql.jdbc.Driver"; 

     try { 
      java.util.Properties config = new java.util.Properties(); 
      JSch jsch = new JSch(); 
      session = jsch.getSession(sshuser, sshHost, 22); 
      jsch.addIdentity(SshKeyFilepath); 
      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 + " -> " + remoteHost + ":" + remotePort); 
      System.out.println("Port Forwarded"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private static void connectToDataBase(String dataBaseName) throws SQLException { 
     String dbuserName = "sf2_showpad_biz"; 
     String dbpassword = "lOAWEnL3K"; 
     int localPort = 8740; // any free port can be used 
     String localSSHUrl = "localhost"; 
     try { 

      //mysql database connectivity 
      MysqlDataSource dataSource = new MysqlDataSource(); 
      dataSource.setServerName(localSSHUrl); 
      dataSource.setPortNumber(localPort); 
      dataSource.setUser(dbuserName); 
      dataSource.setAllowMultiQueries(true); 

      dataSource.setPassword(dbpassword); 
      dataSource.setDatabaseName(dataBaseName); 

      connection = dataSource.getConnection(); 

      System.out.print("Connection to server successful!:" + connection + "\n\n"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 


    private static void closeConnections() { 
     CloseDataBaseConnection(); 
     CloseSSHConnection(); 
    } 

    private static void CloseDataBaseConnection() { 
     try { 
      if (connection != null && !connection.isClosed()) { 
       System.out.println("Closing Database Connection"); 
       connection.close(); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 

    } 

    private static void CloseSSHConnection() { 
     if (session != null && session.isConnected()) { 
      System.out.println("Closing SSH Connection"); 
      session.disconnect(); 
     } 
    } 


    // works ONLY FOR single query (one SELECT or one DELETE etc) 
    private static ResultSet executeMyQuery(String query, String dataBaseName) { 
     ResultSet resultSet = null; 

     try { 
      connectToServer(dataBaseName); 
      Statement stmt = connection.createStatement(); 
      resultSet = stmt.executeQuery(query); 
      System.out.println("Database connection success"); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 

     return resultSet; 
    } 

    public static void DeleteOrganisationReferencesFromDB(String organisationsLike) { 
     try { 
      connectToServer("ServerName"); 
      Statement stmt = connection.createStatement(); 

      ResultSet resultSet = stmt.executeQuery("select * from DB1"); 

      String organisationsToDelete = ""; 
      List<String> organisationsIds = new ArrayList<String>(); 

      // create string with id`s values to delete organisations references 
      while (resultSet.next()) { 
       String actualValue = resultSet.getString("id"); 
       organisationsIds.add(actualValue); 
      } 

      for (int i = 0; i < organisationsIds.size(); i++) { 
       organisationsToDelete = " " + organisationsToDelete + organisationsIds.get(i); 
       if (i != organisationsIds.size() - 1) { 
        organisationsToDelete = organisationsToDelete + ", "; 
       } 
      } 

      stmt.executeUpdate(" DELETE FROM `DB1`.`table1` WHERE `DB1`.`table1`.`organisation_id` in (" + organisationsToDelete + ");"); 


     } catch (SQLException e) { 
      e.printStackTrace(); 
     } finally { 
      closeConnections(); 
     } 
    } 

    public static List<String> getOrganisationsDBNamesBySubdomain(String organisationsLike) { 
     List<String> organisationDbNames = new ArrayList<String>(); 
     ResultSet resultSet = executeMyQuery("select `DB`.organisation.dbname from `DB1`.organisation where subdomain like '" + organisationsLike + "%'", "DB1"); 
     try { 
      while (resultSet.next()) { 
       String actualValue = resultSet.getString("dbname"); 
       organisationDbNames.add(actualValue); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } finally { 
      closeConnections(); 
     } 
     return organisationDbNames; 
    } 

    public static List<String> getAllDBNames() { 
     // get all live db names incentral DB 
     List<String> organisationDbNames = new ArrayList<String>(); 
     ResultSet resultSet = executeMyQuery("show databases", "DB1"); 
     try { 
      while (resultSet.next()) { 
       String actualValue = resultSet.getString("Database"); 
       organisationDbNames.add(actualValue); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } finally { 
      closeConnections(); 
     } 
     return organisationDbNames; 
    } 

     public static void deleteDataBasesByName(List<String> DataBasesNamesList) { 
     try { 
      connectSSH(); 
      int dataBasesAmount = DataBasesNamesList.size(); 
      for (int i = 0; i < dataBasesAmount; i++) { 
       connectToDataBase(DataBasesNamesList.get(i)); 

       Statement stmt = connection.createStatement(); 
       stmt.executeUpdate("DROP database `" + DataBasesNamesList.get(i) + "`"); 

      } 

     } catch (SQLException e) { 
      e.printStackTrace(); 
     } finally { 
      CloseDataBaseConnection(); 
      closeConnections(); 
     } 
    } 
} 
5
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.util.Properties; 

import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.JSchException; 
import com.jcraft.jsch.Session; 

public class CTestDriver { 
    private static void doSshTunnel(String strSshUser, String strSshPassword, String strSshHost, int nSshPort, 
      String strRemoteHost, int nLocalPort, int nRemotePort) throws JSchException { 
     final JSch jsch = new JSch(); 
     Session session = jsch.getSession(strSshUser, strSshHost, 22); 
     session.setPassword(strSshPassword); 

     final Properties config = new Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     session.setConfig(config); 

     session.connect(); 
     session.setPortForwardingL(nLocalPort, strRemoteHost, nRemotePort); 
    } 

    public static void main(String[] args) { 
     try { 
      String strSshUser = "ssh_user_name"; // SSH loging username 
      String strSshPassword = "abcd1234"; // SSH login password 
      String strSshHost = "your.ssh.hostname.com"; // hostname or ip or 
                  // SSH server 
      int nSshPort = 22; // remote SSH host port number 
      String strRemoteHost = "your.database.hostname.com"; // hostname or 
                    // ip of 
                    // your 
                    // database 
                    // server 
      int nLocalPort = 3366; // local port number use to bind SSH tunnel 
      int nRemotePort = 3306; // remote port number of your database 
      String strDbUser = "db_user_name"; // database loging username 
      String strDbPassword = "4321dcba"; // database login password 

      CTestDriver.doSshTunnel(strSshUser, strSshPassword, strSshHost, nSshPort, strRemoteHost, nLocalPort, 
        nRemotePort); 

      Class.forName("com.mysql.jdbc.Driver"); 
      Connection con = DriverManager.getConnection("jdbc:mysql://localhost:" + nLocalPort, strDbUser, 
        strDbPassword); 
      con.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      System.exit(0); 
     } 
    } 
} 
+0

솔루션에 대한 세부 정보를 제공하십시오. –

+0

다른 호스트를 사용하여 원격 호스트에 연결하려는 경우, 즉 하나의 호스트에 연결하고 거기에서 기본 호스트에 연결할 때 보안의 목적으로 수행됩니다. – Ankur

관련 문제