目录

项目中通过SSH链接mysql数据库

目录

项目中通过SSH链接mysql数据库~

本文章解决的问题 :当你没有数据库公网权限但是拥有与该数据库内网通信的服务器的链接权限时,可通过该服务器SSH跳转链接到mysql服务器,本文章是具体代码实现。

1,引入jsch依赖坐标:

        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.53</version>
        </dependency>

2,需要添加两个配置文件:

链接配置:

package com.example.demo.sshConfig;

/**

- @author liuwenpo
- @className: SSHConnection
- @description: TODO
- @date 2022/3/31
  */

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

import java.util.Properties;

public class SSHConnection {

    // 自定义的映射端口,需要和yml中的port保持一致
    private final static int LOCAl_PORT = 3307;

    // SSH远程服务器配置
    private final static String SSH_REMOTE_SERVER = "被链接的服务器ip";
    private final static int SSH_REMOTE_PORT = SSH远程服务器端口号;
    private final static String SSH_USER = "SSH远程服务器账号";
    private final static String SSH_PASSWORD = "SSH远程服务器密码";

    // 远程数据库配置
    private final static String MYSQL_REMOTE_SERVER = "被链接的数据库ip";
    private final static int REMOTE_PORT = 3306;

    private Session sesion; //represents each ssh session

    // 测试连接
    public static void main(String[] args) throws Throwable {
        System.out.println(new SSHConnection());
    }

    public SSHConnection() throws Throwable {

        JSch jsch = new JSch();
        // 需要用到了开启
        // jsch.setKnownHosts(S_PATH_FILE_KNOWN_HOSTS);
        //jsch.addIdentity(S_PATH_FILE_PRIVATE_KEY);

        sesion = jsch.getSession(SSH_USER, SSH_REMOTE_SERVER, SSH_REMOTE_PORT);
        sesion.setPassword(SSH_PASSWORD);

        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        sesion.setConfig(config);
        // 去连接
        sesion.connect(); //ssh connection established!
        //  设置转发
        sesion.setPortForwardingL(LOCAl_PORT, MYSQL_REMOTE_SERVER, REMOTE_PORT);

        System.out.println("SSHConnection--运行OK");
    }

    public void closeSSH() {
        sesion.disconnect();
    }

}

监听配置:

package com.example.demo.sshConfig;

/**

- @author liuwenpo
- @className: SSHWebListener
- @description: TODO
- @date 2022/3/31
  */

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class SSHWebListener implements ServletContextListener {

    private SSHConnection sshConnection;

    public SSHWebListener() {
        super();
    }

    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("SSHWebListener initialized ... !");
        try {
            sshConnection= new SSHConnection();
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("SSHWebListener destroyed ... !");
        sshConnection.closeSSH();
    }

}

3,yml 配置文件需要添加的配置:



# datasource

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3307/sshtest?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useServerPrepStmts=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai
username: root
password: 123456

注意 :yml 中的数据库链接 ip,就用本机 ip,端口号要与 SSHConnection 配置文件中的 LOCAl_PORT 保持一致,否则无法映射链接

原理 :先通过本机连接到远程服务器,再通过本机的链接信息映射中转链接远程 mysql 数据库。