目前,我们必须通过SSH隧道访问我们的Oracle数据库。为了做到这一点,我们必须确保在将应用程序部署到Tomcat / Glassfish / etc之前,在服务器上运行putty或等效的程序/脚本进行此调整。
有没有人找到一种方法让java透明地处理这个隧道?也许一个jdbc驱动程序比它自己包装另一个jdbc驱动器在Java中处理隧道?
答案 0 :(得分:2)
我的解决方案是在我的应用程序服务器启动时使用JCraft http://www.jcraft.com/jsch/中的Jsch打开隧道。应用程序服务器关闭时关闭隧道。我是通过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 :(得分:1)
我曾经使用Apache MINA SSHD进行项目,我记得有开放隧道的支持。
您可以查看http://mina.apache.org/sshd/了解详情。
此问题讨论了其他选项:SSH library for Java