javajdbc通过SSH隧道连接数据库
java jdbc通过SSH隧道连接数据库
例如要拦截数据库a,不能直接连,必须通过ecs连接(Navicat配置ssh连接相当简单,但是Java程序怎么弄呢?)实现步骤
新建 springboot 或 maven项⽬(普通的java项⽬也可以,只是引⼊依赖没那么⽅便)
<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
#远程数据库服务端⼝
rport=3433
建 SSHService.java
package st.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 password;//SSH连接密码
static String pem_file_path;//SSH连接密码
static String host;//SSH服务器
static int port;//SSH访问端⼝
static{
//读取配置⽂件
try{
// 获取hive.properties⽂件的路径
InputStream is = ClassLoader().getResourceAsStream("SSH.properties");            Properties prop =new Properties();
prop.load(is);
// 读取配置⽂件的值
lport = Integer.Property("lport"));
rhost = Property("rhost");
rport = Integer.Property("rport"));
user = Property("user");
password = Property("password");
pem_file_path = Property("pem_file_path");
host = Property("host");
port = Integer.Property("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 = Session(user, host, port);
if(pem_file_path == null){
session.setPassword(password);
}
session.setConfig("StrictHostKeyChecking","no");
// step1:建⽴ssh连接
System.out.ServerVersion());//这⾥打印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){java的jdbc连接数据库
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);
}