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();
}
}
}
项目启动,如下图所示表示跳板机成功了。
------------------------------------------------------------------------------------
把代码自己撸一遍,会更有体会。
结束。
领取专属 10元无门槛券
私享最新 技术干货