2 Stimmen

Verbinden mit einer Oracle-DB in jdbc über einen SSH-Tunnel

Derzeit müssen wir über SSH tunneln, um auf unsere Oracle-Datenbank zuzugreifen. Dazu müssen wir sicherstellen, dass putty oder ein gleichwertiges Programm/Skript auf dem Server läuft, das diese Tunnelung vornimmt, bevor die Anwendung in Tomcat/Glassfish/etc. bereitgestellt wird.

Hat jemand einen Weg gefunden, um Java dieses Tunneling transparent zu handhaben? Vielleicht ein jdbc-Treiber als selbst wickelt eine andere jdbc-Laufwerk Handhabung der Tunneling für Sie rechts in Java?

2voto

benstpierre Punkte 31663

Meine Lösung war die Verwendung von Jsch von JCraft http://www.jcraft.com/jsch/ einen Tunnel zu öffnen, wenn mein Anwendungsserver hochfährt. Ich schließe den Tunnel, wenn der Anwendungsserver herunterfährt. Ich tue dies über einen Servlet-Kontext-Listener.

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);
    }
}

1voto

Peter Tillemans Punkte 34359

Ich habe vor einiger Zeit Apache MINA SSHD für ein Projekt verwendet und ich erinnere mich, dass es Unterstützung für das Öffnen von Tunneln gab.

Sie können sich informieren über http://mina.apache.org/sshd/ für weitere Informationen.

Weitere Optionen werden in dieser Frage erörtert: SSH-Bibliothek für Java

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X