SpringBoot整合ssh,它允许你连接到一个s
分享于 点击 42490 次 点评:42
SpringBoot整合ssh,它允许你连接到一个s
背景:测试环境连接生产环境的数据库,无法本地调试环境:
JDK8 Maven:3.6.3 Springboot:2.1.4 jsch:0.1.55Jsch百度百科介绍:JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。 Jsch Maven依赖包:
<!-- https://mvnrepository.com/artifact/com.jcraft/jsch --> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency>
连接配置工具类:
1 import com.jcraft.jsch.JSch; 2 import com.jcraft.jsch.Session; 3 4 5 import java.util.Properties; 6 7 8 /** 9 * @author dcf 10 * @date 2022-09-23 17:51 11 **/ 12 public class SshConnectionTool { 13 //ssh连接的用户名 14 private final static String SSH_USER = “XXX"; 15 //ssh连接的密码 16 private final static String SSH_PASSWORD = “****"; 17 //ssh远程连接的ip地址 18 private final static String SSH_REMOTE_SERVER = “XXX.XXX.XXX.XXX"; 19 //ssh连接的端口号 20 private final static int SSH_REMOTE_PORT = 22; 21 //本地mysql发起连接的数据库IP地址 22 private final static String MYSQL_REMOTE_SERVER = "XXX.XXX.XXX.XXX"; 23 //本地数据库连接时用的端口号 24 private final static int LOCAl_PORT = 3310; 25 //远程数据库端口用的端口号 26 private final static int REMOTE_PORT = 3306; 27 28 29 private Session sesion; //ssh 会话 30 31 32 public void closeSSH () 33 { 34 sesion.disconnect(); 35 } 36 37 38 public SshConnectionTool () throws Throwable 39 { 40 41 42 JSch jsch = new JSch(); 43 44 45 sesion = jsch.getSession(SSH_USER, SSH_REMOTE_SERVER, SSH_REMOTE_PORT); 46 47 48 sesion.setPassword(SSH_PASSWORD); 49 50 51 //设置连接过程不校验known_hosts文件中的信息 52 Properties config = new Properties(); 53 config.put("StrictHostKeyChecking", "no"); 54 sesion.setConfig(config); 55 56 57 sesion.connect(); //ssh 建立连接! 58 59 60 //根据安全策略,您必须通过转发端口进行连接 61 sesion.setPortForwardingL(LOCAl_PORT, MYSQL_REMOTE_SERVER, REMOTE_PORT); 62 63 64 } 65 }
会话监听类:
1 import org.springframework.stereotype.Component; 2 3 4 import javax.servlet.ServletContextEvent; 5 import javax.servlet.ServletContextListener; 6 7 8 /** 9 * @author dcf 10 * @date 2022-09-23 17:55 11 **/ 12 @Component 13 public class SshContextListener implements ServletContextListener{ 14 15 16 private SshConnectionTool conexionssh; 17 public SshContextListener() { 18 super(); 19 } 20 /** 21 * @see ServletContextListener#contextInitialized(ServletContextEvent) 22 */ 23 @Override 24 public void contextInitialized(ServletContextEvent arg0) { 25 System.out.println("Context initialized ... !"); 26 try { 27 conexionssh = new SshConnectionTool(); 28 } catch (Throwable e) { 29 e.printStackTrace(); // 连接失败 30 } 31 } 32 33 34 /** 35 * @see ServletContextListener#contextDestroyed(ServletContextEvent) 36 */ 37 @Override 38 public void contextDestroyed(ServletContextEvent arg0) { 39 System.out.println("Context destroyed ... !"); 40 conexionssh.closeSSH(); // 断开连接 41 } 42 }
需要连接的mysql地址配置:
1 td-sql: 2 type: com.alibaba.druid.pool.DruidDataSource 3 driverClassName: com.mysql.cj.jdbc.Driver 4 jdbcUrl: jdbc:mysql://127.0.0.1:3310/test?allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai 5 username: name 6 password: password
注:mysql地址配置中的127.0.0.1,其实在连接配置工具类会话方法中默认的,当然里面有多个重载方法,根据不同的重载方法进行不同的配置mysql地址和端口号
1 public int setPortForwardingL(int lport, String host, int rport) throws JSchException { 2 return this.setPortForwardingL("127.0.0.1", lport, host, rport); 3 } 4 5 6 public int setPortForwardingL(String bind_address, int lport, String host, int rport) throws JSchException { 7 return this.setPortForwardingL(bind_address, lport, host, rport, (ServerSocketFactory)null); 8 } 9 10 11 public int setPortForwardingL(String bind_address, int lport, String host, int rport, ServerSocketFactory ssf) throws JSchException { 12 return this.setPortForwardingL(bind_address, lport, host, rport, ssf, 0); 13 }
友好交流,个人公众号:
相关文章
- 暂无相关文章
用户点评