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