2016-07-26 18 views
0

Ich bin neu in ssh und ich habe eine Frage. Ich muss über SSH mit einem Gateway verbinden und innerhalb der SSH-Sitzung muss ich SSH zu einem anderen Server. Nur dann kann ich eine Verbindung zum mySQL-Server herstellen.Zugang mySql über mehrere ssh in Java

  1. ssh <gateway>
  2. ssh -L3306:db02:3306 [email protected]

Dann kann ich konfigurieren Putty und HeidySQL die mySQL-Datenbank zuzugreifen. So weit, so gut.

Aber jetzt möchte ich auf die mySQL-Datenbank über Java-Code zugreifen. Ich habe gegoogelt und einen Code gefunden, um Jsch zu benutzen.

Also, unten ist das Ergebnis des Codes. Aber wenn ich den Code ausführen, ist die Sitzung in Ordnung, Portforwarding ist in Ordnung.

Aber dieser Teil gibt mir eine Fehlermeldung:

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:"+nLocalPort, strDbUser, strDbPassword); 

This is the error: java.sql.SQLException: Access denied for user 'dbUser'@'gateway.appl.local' (using password: YES)

Es scheint, wie die Port-Forwarding nicht wegen der Fehler gemacht wird, dass es an das Gateway verbinden zeigt: ‚dbUser‘ @‘ Gateway .appl.local‘

Nach einem erfolgreichen Port-Forwarding es so etwas wie diese zeigen soll: dbUser'@'**db02**.appl.local

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

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.util.Properties; 

public class MySqlConnOverSSH { 
    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); 
    } 

    /** 
    * Java Program to connect to remote database through SSH using port forwarding 
    * @throws SQLException 
    */ 
    public static void main(String[] args) throws SQLException { 
     try 
     { 
      String strSshUser = "sshUserName";       // SSH loging username 
      String strSshPassword = "sshPassWord";    // SSH login password 
      String strSshHost = "10.20.0.234";   // hostname or ip or SSH server 
      int nSshPort = 22;         // remote SSH host port number 
      String strRemoteHost = "db02"; // hostname or ip of your database server 
      int nLocalPort = 3307;        // local port number use to bind SSH tunnel 
      int nRemotePort = 3306;        // remote port number of your database 
      String strDbUser = "dbUser";     // database loging username 
      String strDbPassword = "dbUserPW";     // database login password 

      MySqlConnOverSSH.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

Sie nicht wollen, dies zu tun, ist es schrecklich langsam sein wird – e4c5

+0

Was passiert, wenn Zwei Personen wollen die Portweiterleitung machen, die Sie in Ihrem zweiten Schritt beschreiben? –

+0

Jungs, ich bin total neu zu shh .. also, geben Sie eine Alternative, wie ich dies erreichen kann. Ich bin dankbar für jede kleine Hilfe in der richtigen Weise. – JesusPassion

Antwort

0

Dies wird sehr langsam sein, aber wenn Sie absolut haben, den Tunnel über beide Verbindungen ein:

on your local host: ssh -L3306:localhost:3306 [email protected] 
on host1:   ssh -L3306:localhost:3306 [email protected] 

Dann sollten Sie in der Lage sein, 3306 auf dem lokalen System zu verbinden und durch zu getunnelt 3306 auf db02. Wenn host1 auch mysql ausgeführt wird und Sie nicht wollen, mit ihm stören, verwenden Sie einen anderen Zwischenhafen, wie in

on your local host: ssh -L3306:localhost:3316 [email protected] 
on host1:   ssh -L3316:localhost:3306 [email protected] 
+0

HI Jim, wie sollte ich diese SSH-Befehle in Java-Code ausführen? Oder soll ich das mit Putty tun und dann über localhost auf den mySql-Server auf db02 zugreifen? btw: mySql läuft nicht auf host1 – JesusPassion

+0

Führen Sie diese in Putty, um den Tunnel einzurichten, dann greift Ihr Java-Code auf die DB bei localhost: 3306. –

+0

Ok .. Ich werde es versuchen. Danke und ich werde es euch wissen lassen. – JesusPassion