首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL-跳板机访问

SSH(Secure Shell)

SSH支持安全的远程登录,安全文件传输以及安全的TCP/IP和X11转发。它可以自动加密、验证和压缩传输的数据,所以是安全的方式。而本节只要运用的就是转发。

详细的信息可以查看WG标准 https://datatracker.ietf.org/group/secsh/about/。

本文使用的是插件,JSch是SSH2的纯Java实现。JSch允许你连接到sshd服务器并使用端口转发,X11转发,文件传输等操作。

操作流程如下

在自己电脑(window)上安装2台虚拟机(Centos7)A(192.168.1.113)和B(192.168.1.106--在此主机上安装MySQL)

确保window电脑可以通过Centos7的22端口访问到。

在虚拟机上安装MySQL(参照之前的文章),并设置远程访问。

springboot、JSch和MySQL驱动的版本(在pom文件中)

springboot:2.0.6.RELEASE

com.alibaba

druid-spring-boot-starter

1.1.10

org.mybatis.spring.boot

mybatis-spring-boot-starter

1.3.2

com.jcraft

jsch

0.1.55

mysql

mysql-connector-java

6.0.6

Mybatis的配置(在yml文件中)如下:

mybatis:

# 定义为自己的model包路径

type-aliases-package: com.my.ruyi.model

mapper-locations: classpath:mybatis/mapper/**

configuration:

cache-enabled: false

lazy-loading-enabled: true

aggressive-lazy-loading: true

multiple-result-sets-enabled: true

map-underscore-to-camel-case: true

auto-mapping-behavior: full

use-column-label: true

use-generated-keys: false

default-executor-type: simple

default-statement-timeout: 25000

MySQL跳板机的配置和数据库连接池的配置(yml文件中)

#MySQL跳板机

ssh-mysql:

#true为开启跳板机模式

enable:true

remote:192.168.1.113

port:22

username:root

password:123456

#设定安全级别noaskyes

#特别注意此处一定要加''单引号,否则解析成no-falseyes-true

strictKey:'no'

#真实的MySQL的host和port

sqlHost:192.168.1.106

sqlPort:3306

spring:

datasource:

druid:

#JDBC配置

driver-class-name:com.mysql.cj.jdbc.Driver

#若开启跳板机此处ip:port为本机地址127.0.0.1,端口给一个未被占用的端口

#若不开启跳板机此处ip:port为真实的MySQL的真实服务器

url:jdbc:mysql://127.0.0.1:3355/test?characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&serverTimezone=CTT

username:root

password:123Abc!#

#连接池参考https://github.com/alibaba/druid/wiki/DruidDataSource配置属性列表

initial-size:5

max-active:100

min-idle:1

max-wait:10000

validation-query:select'x'

validation-query-timeout:1

test-on-borrow:true

test-on-return:false

test-while-idle:true

自定义MySQL跳板机配置加载类

@Component

@ConfigurationProperties(prefix="ssh-mysql")

publicclassMySQLSSHSettings{

/**

* 是否开启SSH

*/

privatebooleanenable;

/**

* 跳板机的IP

*/

privateStringremote;

/**

* 跳板机的端口

*/

privateintport;

/**

* 跳板机的登录用户名

*/

privateStringusername;

/**

* 跳板机的登录密码

*/

privateStringpassword;

/**

* 安全检查级别

* 1. no 最不安全的级别,相对安全的内网测试时建议使用。

* 如果连接server的key在本地不存在,那么就自动添加到文件中(默认是known_hosts),并且给出一个警告。

* 2. ask 默认的级别,如果连接和key不匹配,给出提示,并拒绝登录

* 3. yes 最安全的级别,如果连接与key不匹配,就拒绝连接,不会提示详细信息

*/

privateStringstrictKey;

/**

* 真实的MySQL主机host

*/

privateStringsqlHost;

/**

* 真实的MySQL主机暴露的端口

*/

privateintsqlPort;

// 以下是set和get方法,自己生成一下

}

项目启动时加载配置类

@Configuration

publicclassSSHConnection{

privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(SSHConnection.class);

@Autowired

privateMySQLSSHSettingsmySQLSSHSettings;

privateSessionsqlSession=null;

@Value("$")

Stringurl;

intsqlLocalPort;

@PostConstruct

publicvoidinit() {

getMySQLSession();

}

/**

* SQL跳板转发session作成

* @return

*/

publicSessiongetMySQLSession() {

LOGGER.info("===============getMySQLSession start============");

try{

if(!mySQLSSHSettings.getEnable())returnnull;

JSchjSch=newJSch();

// 获取session

sqlSession=jSch.getSession(mySQLSSHSettings.getUsername(),mySQLSSHSettings.getRemote(),mySQLSSHSettings.getPort());

// 设置密码

sqlSession.setPassword(mySQLSSHSettings.getPassword());

// 设置安全级别

sqlSession.setConfig("StrictHostKeyChecking",mySQLSSHSettings.getStrictKey());

// 建立连接

sqlSession.connect();

// 通过SSH连接到MYSQL机器上

// 获取本地SQL端口号

String[]strings=url.split(":");

if(strings.length>=4) {

String[]split=strings[3].split("/");

sqlLocalPort=Integer.valueOf(split[]);

}

intforwardingL=sqlSession.setPortForwardingL(sqlLocalPort,mySQLSSHSettings.getSqlHost(),mySQLSSHSettings.getSqlPort());

LOGGER.info("===============getMySQLSession "+forwardingL+"============");

}catch(JSchExceptione) {

LOGGER.error(e.getMessage());

}

LOGGER.info("===============getMySQLSession end============");

returnsqlSession;

}

/**

* 关闭连接

*/

@PreDestroy

publicvoidstop() {

if(sqlSession!=null&&sqlSession.isConnected()) {

sqlSession.disconnect();

}

}

}

项目启动,如下图所示表示跳板机成功了。

------------------------------------------------------------------------------------

把代码自己撸一遍,会更有体会。

结束。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190203G0C60C00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券