2010-08-19 5 views
2

Actuellement, nous devons effectuer un tunnel sur SSH pour accéder à notre base de données Oracle. Pour ce faire, nous devons nous assurer que putty ou un programme/script équivalent est en cours d'exécution sur le serveur avant de déployer l'application sur Tomcat/Glassfish/etc.Connectez-vous à un oracle db en jdbc via un tunnel SSH

Est-ce que quelqu'un a trouvé un moyen de faire en sorte que java gère ce tunnel de façon transparente? Peut-être un pilote jdbc que lui-même enveloppe un autre lecteur jdbc gérant le tunneling pour vous en Java?

Répondre

2

Ma solution était d'utiliser jsch de Jcraft http://www.jcraft.com/jsch/ pour ouvrir un tunnel lorsque mon serveur d'application démarre. Je ferme le tunnel lorsque le serveur d'applications s'arrête. Je fais cela via un écouteur de contexte de servlet.

int findUnusedPort() { 
     final int startingPort = 1025; 
     final int endingPort = 1200; 
     for (int port = 1025; port < 1200; port++) { 
      ServerSocket serverSocket = null; 
      try { 
       serverSocket = new ServerSocket(port); 
       return port; 
      } catch (IOException e) { 
       System.out.println("Port " + port + "is currently in use, retrying port " + port + 1); 
      } finally { 
       // Clean up 
       if (serverSocket != null) try { 
        serverSocket.close(); 
       } catch (IOException e) { 
        throw new RuntimeException("Unable to close socket on port" + port, e); 
       } 
      } 
     } 
     throw new RuntimeException("Unable to find open port between " + startingPort + " and " + endingPort); 
    } 

private Session doSshTunnel(int tunnelPort) { 
    // SSH Tunnel 
    try { 
     final JSch jsch = new JSch(); 
     sshSession = jsch.getSession("username", "sshhost", 22); 
     final Hashtable<String, String> config = new Hashtable<String, String>(); 
     config.put("StrictHostKeyChecking", "no"); 
     sshSession.setConfig(config); 
     sshSession.setPassword("password"); 

     sshSession.connect(); 

     int assigned_port = sshSession.setPortForwardingL(tunnelPort, remoteHost, remotePort); 

     return sshSession; 
    } catch (Exception e) { 
     throw new RuntimeException("Unable to open SSH tunnel", e); 
    } 
} 
1

J'ai utilisé Apache MINA SSHD pour un projet il y a quelque temps et je me souviens qu'il y avait un support pour ouvrir des tunnels.

Vous pouvez consulter http://mina.apache.org/sshd/ pour plus d'informations.

D'autres options sont présentées sur cette quesiton: SSH library for Java

Questions connexes