springboot如何通过SSH连接远程服务器
作者:平平常常一般牛
这篇文章主要介绍了springboot如何通过SSH连接远程服务器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
业务场景
处于对安全角度的考虑并且服务器不在同一个局域网下,服务器的访问地址不适合直接放到公网上,需要本地服务器通过ssh信道转发到远程服务器中。
springboot单体项目连接服务器。
解决方法
引入依赖
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.53</version> </dependency>
账号密码验证连接SSH
- SSH连接工具类
import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import java.util.Properties; /** * SSH连接远程服务器转发工具类 */ public class SshConnectionTool { //ssh连接的用户名 private final static String SSH_USER = "test"; //ssh连接的密码 private final static String SSH_PASSWORD = "123456"; //ssh远程连接的ip地址 private final static String SSH_REMOTE_SERVER = "12.34.56.78"; //ssh连接的端口号 private final static int SSH_REMOTE_PORT = 2721; //远程mysql连接的IP地址 private final static String MYSQL_REMOTE_SERVER = "124.543.789.111"; //本地数据库连接时用的端口号,和yml配置的端口一致 private final static int LOCAl_PORT = 3309; //远程数据库端口用的端口号 private final static int REMOTE_PORT = 31494; private Session sesion; //ssh 会话 public void closeSSH () { sesion.disconnect(); } public SshConnectionTool () throws Throwable { JSch jsch = new JSch(); sesion = jsch.getSession(SSH_USER, SSH_REMOTE_SERVER, SSH_REMOTE_PORT); sesion.setPassword(SSH_PASSWORD); //设置连接过程不校验known_hosts文件中的信息 Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); sesion.setConfig(config); sesion.connect(); //ssh 建立连接! //根据安全策略,您必须通过转发端口进行连接 sesion.setPortForwardingL(LOCAl_PORT, MYSQL_REMOTE_SERVER, REMOTE_PORT); } }
- SSH连接监视器
import org.springframework.stereotype.Component; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * SSH链接 监视器 */ @Component public class SshContextListener implements ServletContextListener { private SshConnectionTool conexionssh; public SshContextListener() { super(); } /** * @see ServletContextListener#contextInitialized(ServletContextEvent) */ public void contextInitialized(ServletContextEvent arg0) { System.out.println("Context initialized ... !"); try { conexionssh = new SshConnectionTool(); } catch (Throwable e) { e.printStackTrace(); // 连接失败 } } /** * @see ServletContextListener#contextDestroyed(ServletContextEvent) */ public void contextDestroyed(ServletContextEvent arg0) { System.out.println("Context destroyed ... !"); conexionssh.closeSSH(); // 断开连接 } }
- yml 连接池配置
url: jdbc:mysql://127.0.0.1:3309/test?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true username: root password: root type: com.alibaba.druid.pool.DruidDataSource
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。