通过 ssh tunnel 连接 远程mysql数据库

来源:互联网 发布:达芬奇 调色软件 编辑:程序博客网 时间:2024/04/28 12:04

场景:远程MySQL 数据库 因为种种原因,本地不能直接连接到该数据库。但是,数据库服务器A与本地机器B间的另外一台机器C可以连上。这样的话,我们可以在C上设置SSH tunnel 来访问MySQL数据库。

通过navicat等工具连接MySQL的方法在网上有很多资料这里不再赘述。这里要说的是 ——如何实现将数据库服务器A上的3306端口绑定到本地B,然后来访问本地B端口,就像访问数据库服务器A上3306端口一样。

依赖包:jsch-0.1.53.jar (作用:将A机器上的3306端口绑定到本地)

import com.jcraft.jsch.JSch;import com.jcraft.jsch.JSchException;import com.jcraft.jsch.Session;public class testSSHTunnel {public static void main(String[] args) {        Connection conn = null;        Statement statement = null;        ResultSet resultSet = null;        ///////////        String sshUser = ""; //机器C上SSH tunnel username        String sshPass = "";  //机器C上SSH tunnel password        int sshPort = 22;  //机器C上SSH tunnel port        String sshHost = ""; //机器C的外网IP        //创建SSH回话        Session session = new JSch().getSession(sshUser, sshHost, sshPort);        session.setPassword(sshPass);        session.setConfig("StrictHostKeyChecking", "no");        session.connect();        //将数据库服务器A上的端口绑定到本地B        int localPort = 3306;        String remoteHost = "";  //数据库服务器A的内网IP        int remotePort = 3306;        try {            boolean flag = session.setPortForwardingL(localPort, remoteHost, remotePort);            if (!flag) {                System.out.println("SSHUtil 绑定端口失败");                return;            }        } catch (JSchException e) {            System.out.println("SSHUtil 绑定端口异常  ==>" + e.getMessage());        }        //以上已经将数据库端口绑定到本机3306端口        //连接本地3306端口        try {              Class.forName("com.mysql.jdbc.Driver");              conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/DB_INSTANCE", "DB_USERNAME", "DB_PASSWD");              statement = conn.createStatement();              String sql = "select xxx from xxx where xxx";              resultSet = statement.executeQuery(sql);              while (resultSet.next())                  System.out.println(resultSet.getString(1));          } catch (Exception e) {              e.printStackTrace();          } finally {              try {                resultSet.close();                statement.close();                conn.close();            } catch (SQLException e) {                e.printStackTrace();            }            sshSession.disconnect();        }     }}
0 0