首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SSH java连接到DB

使用SSH java连接到DB
EN

Stack Overflow用户
提问于 2020-07-10 15:38:41
回答 1查看 769关注 0票数 0

我试着用java连接到Oracle DB,但是我遇到了错误,我搜索了很多次,我没有找到帮助我的东西。

当我尝试使用连接时,它的成功。

因此,我尝试编写java代码来访问DB,它成功地连接到SSH,但是当到达conn = DriverManager.getConnection时,我遇到了错误。

"java.sql.SQLException: Io异常: Oracle ORA-12650“

这是我的职责

代码语言:javascript
复制
public static Connection sshTunel() {
        String sshHost = "sshHost";
        String sshuser = "sshUser";
        String SshKeyFilepath =
            "pathOfKey";
        Session session;
        int localPort = 22;
        String remoteHost = "HostIp";
        int remotePort = 1521;
        String usr = "DB user";
        String pwd = "DB pass";
        try {
            java.util.Properties config = new java.util.Properties();
            JSch jsch = new JSch();
            session = jsch.getSession(sshuser, sshHost, 22);
            jsch.addIdentity(SshKeyFilepath, "ssh Pass");
            config.put("StrictHostKeyChecking", "no");
            config.put("Compression", "yes");
            config.put("ConnectionAttempts", "2");
            session.setConfig(config);
            session.connect();

            System.out.println("SSH Connected ...");

            int assinged_port =
                session.setPortForwardingL(localPort, remoteHost, remotePort);

            System.out.println("localhost:" + assinged_port + " -> " +
                               remoteHost + ":" + remotePort);
            System.out.println("Port Forwarded ...");
            try {
                Class.forName("oracle.jdbc.pool.OracleDataSource");

                conn =
DriverManager.getConnection("jdbc:oracle:thin:@remoteHost:1521/SID",
                            "DB User", "DB Pass");
            } catch (SQLException ex) {
                ex.printStackTrace();
                System.out.println("Error in connection");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-10 20:30:41

SSH连接到端口22。隧道的本地端口应该是不同的、无保留的端口,例如61521.

然后,为连接使用SQL*Net中的本地地址和端口。

因此,只显示有关部分:

代码语言:javascript
复制
    int localPort = 61521;
    String remoteHost = "HostIp";
    int remotePort = 1521;
    ...
    try {
        java.util.Properties config = new java.util.Properties();
        JSch jsch = new JSch();
        session = jsch.getSession(sshuser, sshHost, 22);
        ...
        session.setConfig(config);

        session.connect();

        System.out.println("SSH Connected ...");

        int assinged_port =
            session.setPortForwardingL(localPort, remoteHost, remotePort);

        System.out.println("localhost:" + assinged_port + " -> " +
                           remoteHost + ":" + remotePort);

        try {
            Class.forName("oracle.jdbc.pool.OracleDataSource");

            conn = DriverManager.getConnection(
                       "jdbc:oracle:thin:@localhost:61521/service_name",
                       "DB User", "DB Pass");
        } catch (SQLException ex) {
        ...

在屏幕截图中,我希望第一个主机值是您的远程主机,即代码中的任何`sshHost‘;SSH在端口22上联系的那个主机。第二个主机和端口值是SSH会话,而不是由您访问数据库侦听器的方式。(“localhost”有远程服务器;它将本地主机视为本地主机,并在环回地址127.0.0.1上到达)。WIth单选按钮选择,SSH连接正在分配它自己的本地端口,并连接到它,您不需要真正知道它有什么值。

在您的代码中,此调用:

代码语言:javascript
复制
jsch.getSession(sshuser, sshHost, 22);

这相当于SQL对话框中的第一个主机和端口。同样,sshHost是第一个主机框中的值。

然后这个电话:

代码语言:javascript
复制
session.setPortForwardingL(localPort, remoteHost, remotePort);

相当于screenhot屏幕中的第二个主机和端口部分。这里,remoteHost是主机值,概率是localhostremotePort是端口值,为1521。

与SQL设置不同的地方是localPort值。在selected中,将自动分配(因为您已经选择了“自动分配本地端口”)。在您的代码中,您指定的是您自己,而该值必须是一个非保留端口。

因此,对于相关部分,您所做的事情如下:

代码语言:javascript
复制
jsch.getSession(sshuser, 'your_remote_host', 22);
session.connect();
session.setPortForwardingL(61521, 'localhost', 1521);
DriverManager.getConnection(
                   "jdbc:oracle:thin:@localhost:61521/service_name"

对于localhost有两个引用,并且它们的含义似乎略有不同,这可能有点令人困惑。这是因为它是一个特殊的环回地址,驻留在计算机中(因此是“本地”)。您可以认为第一个(在setPortForwaringL中)是远程服务器对自身的内部引用;第二个(在getConnection()中)可以看作是PC对自身的内部引用。

更令人困惑的是,屏幕截图显示了两个主机值的localhost。如果这是您真正拥有的,那么它就没有多大意义,您应该根本不需要SSH。因此,我猜想您更改了真实值以隐藏它以供发布,只是选择了一个令人困惑的假值,而不是使用sshHosthostIP或类似的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62837731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档