如果大家用过一些数据库客户端软件,会发现里面有一项是SSH,可以使用SSH通道来连接到远程主机的数据库,此时我们就可以使用内网IP来直连数据库了。不知道大家有多少是这么用数据库的,我想这么设定肯定是为了安全吧。
好么,现在问题来了,我想用程序连一下这个数据库该怎么办?那库只有内网IP,那只能用程序来模拟一个SSH通道了。
我在网上一直找相关的类库,一直没有找到,最后在神奇的stackoverflow上找到一个回答才知道有个类库叫做jsch,功能异常强大,我这水平一般,完全没有搞懂其他功能,只发现了一个对本次主题有用的功能——端口映射。其实原理很简单,就是你给定SSH登录信息,登录后产生一个Session会话,然后将服务器上的某个端口映射到本地,这样就可以使用本地连接来连接数据库了。
OK,先把这段代码地址贴出来。https://github.com/looly/common-tools/blob/master/src/main/java/com/baijob/commonTools/net/SSHUtil.java
好的,我们开始。先贴测试代码
package com.baijob.commonTools;
import com.baijob.commonTools.net.SSHUtil;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
public class CommonTest {
public static void main(String[] args) {
Session session = SSHUtil.openSession("跳板机外网IP", 22, "username", "123456");
try {
boolean bindPort = SSHUtil.bindPort(session, "数据库服务器内网IP", 3306, 3306);
} catch (JSchException e) {
e.printStackTrace();
}
}
}
这个类的使用方法异常简单分成两个步骤:
step1:调用openSession方法SSH连接到一个远程主机(我们称之为跳板机),端口、用户名、密码要有
step2:调用bindPort方法把跳板机可以登录的那台数据库服务器的端口映射到本地,第一个参数是SSH Session,第二个参数是数据库所在服务器的内网IP地址,第三个参数是远程的端口,第四个参数是本机的端口
经过简单的两步,就可以把远程数据库的3306端口映射到本地了(当然,本地这个端口是不能被占的)
step3:我们就可以用JDBC连接此数据库了,当然连接字符串是这样的:localhost:3306
其实不只连接数据库,我们可以使用此方式把服务器上任意端口映射下来使用(想想把80端口映射下来的赶脚)
其实在https://github.com/looly/common-tools/tree/master/src/main/java/com/baijob/commonTools/db/ds下已经自动集成了通过SSH tunnel连接数据库的方法,只要按照https://github.com/looly/common-tools/blob/master/src/main/resources/config/db-example.setting的方式配置数据库连接即可简单的操作数据库。这个后续再说。
最后为雅安祈福吧,不知道他们的每个夜晚是怎么过来的……
来源:oschina
链接:https://my.oschina.net/u/730640/blog/124287