簡體   English   中英

使用 SSH java 連接到數據庫

[英]connect to DB using SSH java

我嘗試連接到 java 中的 Oracle DB,但我遇到了錯誤,我搜索了很多次我沒有找到對我有幫助的東西。

當我嘗試使用 SQL 開發人員連接時,它成功了。

所以我嘗試編寫 java 代碼來訪問數據庫,它成功連接到 SSH 但是當我到達conn = DriverManager.getConnection時遇到錯誤:

“java.sql.SQLException:Io 異常:Oracle 錯誤 ORA-12650”

這是我的 function

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

在此處輸入圖像描述

在此處輸入圖像描述

SSH 連接到端口 22。隧道的本地端口應該是不同的非保留端口,例如 61521。

然后使用 SQL*Net URL 中的本地地址和端口進行連接。

所以只顯示相關部分:

    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) {
        ...

在您的 SQL Developer 屏幕截圖中,我希望第一個 Host 值是您的遠程主機,即您的代碼中實際存在的任何“sshHost”; 其中 SSH 在端口 22 上聯系。第二個主機和端口值SSH session 到達數據庫偵聽器的方式,而不是您。 ('localhost' 是遠程服務器;被視為本地主機,並到達環回地址 127.0.0.1)。 通過單選按鈕選擇,SSH 連接正在分配自己的本地端口,並連接到該端口,您並不需要知道它有什么值。

在您的代碼中,此調用:

jsch.getSession(sshuser, sshHost, 22);

這相當於 SQL 開發者對話框中的第一個主機和端口。 同樣, sshHost是第一個主機框中的值。

然后這個電話:

session.setPortForwardingL(localPort, remoteHost, remotePort);

相當於 SQL Developer 屏幕截圖中的第二個主機和端口部分。 這里, remoteHost是 Host 值,可能是localhost remotePort是端口值,即 1521。

這與 SQL 開發人員設置的不同之處在於localPort值。 在自動分配的 SQL 開發人員中(因為您選擇了“自動分配本地端口”)。 在您的代碼中,您指定的是您自己,並且該值必須是非保留端口。

因此,只需相關部分,您就可以執行以下操作:

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 對自身的內部引用。

更令人困惑的是,您的屏幕截圖顯示了兩個 Host 值的localhost 如果這就是你真正擁有的,那么它沒有多大意義,你根本不需要 SSH。 因此,我想您更改了真實值以隱藏它以進行發布,並且只是選擇了一個令人困惑的假值,而不是使用sshHosthostIP或類似的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM