java jdbc通過SSH隧道連接數據庫

java jdbc通過SSH隧道連接數據庫

例如要攔截數據庫a,不能直接連,必須通過ecs連接(Navicat配置ssh連接相當簡單,但是Java程序怎麼弄呢?)

實現步驟

  • 新建 springboot 或 maven項目(普通的java項目也可以,只是引入依賴沒那麼方便)
  • pom.xml 中新增依賴
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>
  • 建 SSH.properties,用來配置ssh服務器/數據庫服務器等,詳細見文件
#本地端口(就是本地訪問這個端口,會被轉發到所配置的數據庫服務器)
lport=10010


#SSH服務器ip
host=47.103.66.213
#SSH訪問端口
port=22
#SSH連接用戶名
user=root
#SSH連接密碼
password=
#祕鑰文件路徑(跟密碼只要配置其中一個即可,優先級高於password)
pem_file_path=/Users/stonewang/dev/pem/aaa.pem


# 遠程數據庫服務器(是數據庫的! 注意數據庫的賬號密碼不需要在這裏指定,在jdbc裏指定或springboot裏配置)
rhost=rm-uf6g910h266zyrc40.pg.rds.aliyuncs.com
#遠程數據庫服務端口
rport=3433
  • SSHService.java
package com.wyf.test.sshforword;

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * SSH端口轉發
 */
public class SSHService {
    static Integer lport;//本地端口
    static String rhost;//遠程數據庫服務器
    static int rport;//遠程數據庫服務端口

    static String user;//SSH連接用戶名
    static String password;//SSH連接密碼
    static String pem_file_path;//SSH連接密碼
    static String host;//SSH服務器
    static int port;//SSH訪問端口

    static {
        //讀取配置文件
        try {
            // 獲取hive.properties文件的路徑
            InputStream is = SSHService.class.getClassLoader().getResourceAsStream("SSH.properties");
            Properties prop = new Properties();
            prop.load(is);
            // 讀取配置文件的值
            lport = Integer.valueOf(prop.getProperty("lport"));
            rhost = prop.getProperty("rhost");
            rport = Integer.valueOf(prop.getProperty("rport"));
            user = prop.getProperty("user");
            password = prop.getProperty("password");
            pem_file_path = prop.getProperty("pem_file_path");
            host = prop.getProperty("host");
            port = Integer.valueOf(prop.getProperty("port"));

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void sshRun() {
        JSch jsch = new JSch();
        Session session = null;
        try {
            if (pem_file_path != null) {
                jsch.addIdentity(pem_file_path);
            }
            session = jsch.getSession(user, host, port);

            if (pem_file_path == null) {
                session.setPassword(password);
            }

            session.setConfig("StrictHostKeyChecking", "no");
            // step1:建立ssh連接
            session.connect();
            System.out.println(session.getServerVersion());//這裏打印SSH服務器版本信息
            //step2: 設置SSH本地端口轉發,本地轉發到遠程
            int assinged_port = session.setPortForwardingL(lport, rhost, rport);
            System.out.println("localhost:" + assinged_port + " -> " + rhost + ":" + rport);
        } catch (Exception e) {
            if (null != session) {
                //關閉ssh連接
                session.disconnect();
            }
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        sshRun();
    }

}

  • 啓動 SSHService.java 後項目會一直運行在後臺進行監聽

使用者如何連接

連接配置

spring.datasource.url=jdbc:postgresql://localhost:10010/mydb?currentSchema=my_schema
spring.datasource.username=my_user
spring.datasource.password=my_password
spring.datasource.driver-class-name=org.postgresql.Driver

注意:

1、連接的host是localhost,請求localhost的10010,都將被轉發到目的數據庫。

例子

@Test
public void testConnectDbBySSHTunnel() {
  User user = userMapper.selectById(1);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章