2016-07-26 2 views
0

Я новичок в ssh, и у меня есть вопрос. Мне нужно подключиться через ssh к шлюзу и в рамках сеанса ssh я должен отправить ssh на другой сервер. Только тогда я могу подключиться к серверу mySQL.доступ mySql через несколько ssh в java

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

Тогда я могу настроить Putty и HeidySQL для доступа к базе данных MySQL. Пока, так хорошо.

Но теперь я хочу получить доступ к базе данных mySQL с помощью java-кода. Я googled и нашел некоторый код, чтобы использовать Jsch.

Итак, ниже приведен код. Но когда я запускаю код, сеанс в порядке, portforwarding - это нормально.

Но эта часть дает мне ошибку:

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)

Похоже, что перенаправление портов не выполняется из-за ошибки, которые он показывает, чтобы подключиться к шлюзу: «DBUser» @» шлюз .appl.local»

После успешным перенаправлении он должен показать что-то вроде этого: 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

вы не хотите, чтобы это сделать, это будет ужасно медленно – e4c5

+0

Что произойдет, если два человека хотят сделать пересылку порта, которую вы описываете на втором этапе? –

+0

Ребята, я совершенно новичок в shh .. так что дайте альтернативу, как я могу это сделать. Я благодарен за каждую небольшую помощь в правильном направлении. – JesusPassion

ответ

0

Это будет довольно медленным, но если вы абсолютно необходимо, настроить туннель через оба подключения:

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

Тогда вы должны быть в состоянии подключиться к 3306 на локальной системе и тоннельный до 3306 на db02. Если host1 также работает MySQL, и вы не хотите, чтобы взаимодействовать с ним, используйте другой промежуточный порт, как в

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

HI Jim, как я должен запускать эти команды ssh в java-коде? Или я должен сделать это с помощью Putty, а затем получить доступ к серверу mySql на db02 через localhost? btw: mySql не работает на host1 – JesusPassion

+0

Запустите их в putty для настройки туннеля, затем ваш код Java обращается к БД на localhost: 3306. –

+0

Хорошо. Я попробую. Спасибо, и я дам вам знать. – JesusPassion

Смежные вопросы