java实现SSH远程链接服务器导出Excel并发送到指定邮箱

Wesley13
• 阅读 437

最近做的一些客户项目需要每天给account executive每天发数据,因自己懒的每天去发送所以写了一个小工具,实现了远程SSH连接服务器后从数据库导出数据为Excel并发送到指定邮箱。用linux做了一个定时器,每天固定时间点发送,偷个懒,下边是关键代码,其他用到的工具类都是简单使用,所以就不贴了。

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.mail.MessagingException;
import javax.mail.internet.AddressException;


public class SQLConnection {
    private static Connection connection = null;
    private static Session session = null;
    private static String driverName = "com.mysql.jdbc.Driver";
    private static int localPort = 8740;// any free port can be used
    private static String mailUser = "***";
    private static String mailPwd = "***";
    private static String mail = "***";
    private static String mailSmtp = "smtp.qq.com";
    private static String rootPath;
    private static SystemConfig sysConfig;
    
    private static void connectToServer(SSHConfig sshConfig) throws SQLException {
        connectSSH(sshConfig);
        connectToDataBase(sshConfig);
    }
    
    /**
     * 连接SSH
     * @param sshConfig
     * @throws SQLException
     */
    private static void connectSSH(SSHConfig sshConfig) throws SQLException {
        if(session != null)
        {
            return;
        }
        try 
        {
            java.util.Properties config = new java.util.Properties();
            JSch jsch = new JSch();
            session = jsch.getSession(sshConfig.getSshUserName(), sshConfig.getSshHost(), sshConfig.getSshProt());
            session.setPassword(sshConfig.getSshPassword());
            
            config.put("StrictHostKeyChecking", "no");
            config.put("ConnectionAttempts", "3");
            session.setConfig(config);
            session.connect();

            System.out.println("SSH Connected");

            Class.forName(driverName).newInstance();

            int assinged_port = session.setPortForwardingL(localPort, sshConfig.getDbHost(), sshConfig.getDbProt());

            System.out.println("localhost:" + assinged_port + " -> " + sshConfig.getDbHost() + ":" + sshConfig.getDbProt());
            System.out.println("Port Forwarded");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 通过ssh连接数据库
     * @param sshConfig
     * @throws SQLException
     */
    private static void connectToDataBase(SSHConfig sshConfig) throws SQLException {
        if(connection != null)
        {
            return;
        }
        String localSSHUrl = "localhost";
        try {

            // mysql database connectivity
            MysqlDataSource dataSource = new MysqlDataSource();
            dataSource.setServerName(localSSHUrl);
            dataSource.setPortNumber(localPort);
            dataSource.setUser(sshConfig.getDbUser());
            dataSource.setAllowMultiQueries(true);

            dataSource.setPassword(sshConfig.getDbPassword());
            dataSource.setDatabaseName(sshConfig.getDbDataBaseName());

            connection = dataSource.getConnection();

            System.out.print("Connection to server successful!:" + connection + "\n\n");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 关闭SSH连接与数据库连接
     */
    private static void closeConnections() {
        CloseDataBaseConnection();
        CloseSSHConnection();
    }
    
    /**
     * 关闭数据库
     */
    private static void CloseDataBaseConnection() {
        try {
            if (connection != null && !connection.isClosed()) {
                System.out.println("Closing Database Connection");
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
    
    /**
     * 切换SSH配置
     * 自动关闭上一个SSH连接等
     * @param config
     * @throws SQLException 
     */
    public static void switchoverConfig(SSHConfig config) throws SQLException
    {
        closeConnections();
        connectToServer(config);
    }
    
    /**
     * 关闭SSH
     */
    private static void CloseSSHConnection() {
        if (session != null && session.isConnected()) {
            System.out.println("Closing SSH Connection");
            session.disconnect();
        }
    }

    /**
     * 查询数据结果集
     * @param query
     * @return
     */
    public static ResultSet executeMyQuery(String query) {
        ResultSet resultSet = null;
        try {
            Statement stmt = connection.createStatement();
            resultSet = stmt.executeQuery(query);
            System.out.println("Database connection success");
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return resultSet;
    }
    
    public static void sendEmail(SSHConfig config)
    {
        try 
        {
            connectToServer(config);
            String date = DateUtils.getStrYesterdayDate();
            
            String sql = config.getSql().replace("{startDate}", date).replace("{endDate}", date);
            
            System.out.println(sql);
            ResultSet rs = executeMyQuery(sql);
            
            ResultSetMetaData rsmd = rs.getMetaData();
            
            int titleCount = rsmd.getColumnCount();
            
            String[][] titleName = new String[titleCount][2];
            
            for(int i = 0;i < titleCount;i++)
            {
                titleName[i][0] = rsmd.getColumnName(i + 1);
                titleName[i][1] = rsmd.getColumnName(i + 1);
            }
            
            List<Map<String,String>> dataMapList = new ArrayList<Map<String,String>>();
            Map<String,String> objectMap = null;
            
            while(rs.next()) {  
                objectMap = new HashMap<>();
                
                for(int i = 0;i < titleCount;i++)
                {
                    objectMap.put(titleName[i][0], rs.getString(i + 1));
                }
                
                dataMapList.add(objectMap);
            }
            
            ExportExcel excel = null;
            
            String title = config.getTitle() + DateUtils.getStrDate();
            String content = title + "数据 ,发送时间 :" + DateUtils.getStrDateTime();
            
            excel = new ExportExcel("Sheet1", titleName, dataMapList);
            String filePath = rootPath + title + ".xls";
            
            excel.save(rootPath, title + ".xls");
            
            MailUtil.send(config.getToEmail(), mail, title, content, mailSmtp, mailUser, mailPwd,"自动发送", filePath);
            System.out.println("source send Email!");
        } catch (Exception s) {
            s.printStackTrace();
        }
    }
    
    /** 
     * 获取指定时间对应的毫秒数 
     * @param time "HH:mm:ss" 
     * @return 
     */  
    private static long getTimeMillis(String time) {  
        try {  
            DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");  
            DateFormat dayFormat = new SimpleDateFormat("yy-MM-dd");  
            Date curDate = (Date) dateFormat.parse(dayFormat.format(new Date()) + " " + time);  
            return curDate.getTime();  
        } catch (ParseException e) {  
            e.printStackTrace();  
        }  
        return 0;  
    }  
    
    public static void main(String[] args) {
        
        sysConfig = SystemConfig.instants();
        
        rootPath = sysConfig.getValue("rootPath");
        
        SSHConfig config = new SSHConfig();
        
        config.setSshHost(sysConfig.getValue("sshHost"));
        config.setSshProt(sysConfig.getIntValue("sshProt"));
        config.setSshUserName(sysConfig.getValue("sshUserName"));
        config.setSshPassword(sysConfig.getValue("sshPassword"));
        
        config.setDbHost(sysConfig.getValue("dbHost"));
        config.setDbProt(sysConfig.getIntValue("dbProt"));
        config.setDbUser(sysConfig.getValue("dbUser"));
        config.setDbPassword(sysConfig.getValue("dbPassword"));
        config.setDbDataBaseName(sysConfig.getValue("dbDataBaseName"));
        
        config.setTitle(sysConfig.getValue("title"));
        config.setSql(sysConfig.getValue("sql"));
        config.setToEmail(sysConfig.getValue("toEmail"));
        
        sendEmail(config);
        /*
        Runnable runnable = new Runnable() {  
            public void run() {  
                try {  
                    Thread.sleep(50);  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
                System.out.println("This is a echo server. The current time is " +  System.currentTimeMillis() + ".");  
                
            }  
        };  
        
        long oneDay = 24 * 60 * 60 * 1000;  
        long initDelay  = getTimeMillis("12:29:00") - System.currentTimeMillis();  
        
        System.out.println(initDelay);
        System.out.println(oneDay);
        
        initDelay = initDelay > 0 ? initDelay : oneDay + initDelay;  
        
        
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();  
        // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间  
       // service.scheduleAtFixedRate(runnable, 1, 1, TimeUnit.MINUTES);  
        
        service.scheduleAtFixedRate(  
                runnable,  
                initDelay,  
                oneDay,  
                TimeUnit.MILLISECONDS); 
                */
    }
    
}
点赞
收藏
评论区
推荐文章
菜鸟阿都 菜鸟阿都
2年前
python实现邮件发送
前言使用python的第三方库yagmail实现邮件发送的功能yagmail官网文档:第一步:申请一个邮箱作为发送邮箱此处以网易邮箱为例,因为使用python代码实现邮件的发送,需要开启邮箱的授权密码功能,用生成的授权密码作为发送邮件的密码,以下步骤为开启网易邮箱的授权密码功能。第二步:安装yagmail库languagepipinstally
Wesley13 Wesley13
2年前
JAVA导出EXCEL表格
hi~好久不见小伙伴们,最近比较忙,没什么时间写,今天给大家分享的是JAVA如何导出EXCEL表格,因为最近有做这样一个功能,所以分享出来,如有不对之处,敬请指正。在许多企业办公系统中,经常会有用户要求,需要对数据进行统计并且可以直接下载Excel文件,这样子的话,既然客户提出了要求,我们就应该去满足吖,毕竟客户是上帝嘛,那么我们如何去实现呢?且看我
Stella981 Stella981
2年前
EasyExcel写入百万级数据到多sheet
EasyExcel是什么?快速、简单避免OOM的java处理Excel工具一、项目需求    从mongo库中查询数据,导出到excel文件中。但是动态导出的excel有多少列、列名是什么、有多少sheet页都需要动态获取。所以生成的excel也必须是动态生成,不能通过注解配置对象映射。而且写入的数据量,有可能达到100W级,使用传统的PO
Stella981 Stella981
2年前
JXLS生成excel并自定义单元格样式
   本人最近需要每天统计数据表,并每周一发送统计结果的邮件,所以写了个springboot老自动完成工作。项目地址为:https://github.com/707293891/springboot(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2F7072938
Wesley13 Wesley13
2年前
UTF
  最近工作中需要将一些数据写入CSV文件中,并要使用Excel打开进行查看。测试时发现,导出的CSV文件用Excel打开后,中文字符全部是乱码。写入CSV文件的是UTF8编码的数据,文件在Linux中查看是没有问题的,在Windows上用Excel打开却有乱码。在查阅资料后发现,windows系统中文本文档的编码格式用BOM来指定,在文件的开头要写入字符
Wesley13 Wesley13
2年前
6、SSH远程管理服务实战
1.SSH基本概述SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输。确保了数据传输安全。那SSH服务主要功能有哪些呢?1.提供远程连接服务器的服务、2.对传输的数据进行加密那么除了SSH协议能提供远程连接服务,Telnet也能提供远程连接服务,那么分别的区别是什么呢?ssh服务会对传输数据
Stella981 Stella981
2年前
EasyExcel引入
好久没更了,都在有道云上面记录,没时间搬过来。easyexcel是最近项目做优化涉及的一个改善点吧。简介        导出是后台管理系统的常用功能,当数据量特别大的时候会内存溢出和卡顿页面,曾经自己封装过一个导出,POI百万级大数据量EXCEL导出采用了分批查询数据来避免内存溢出和使用SXSSFWorkbook方式缓存数据到文件上以解决
Stella981 Stella981
2年前
Redis cluster eval的使用
对于eval有一个很大的约束在集群模式下,即lua所用到的key必须在该节点上因此可以借助solt来发送到指定的key存在的节点上 因此需要redisclient正确处理key方法1:  通过client显示指定key 发送到对应的节点上,lua代码不参与redis缓存每次发送到redis的lua代码都是新的因为把用到的东西都
Wesley13 Wesley13
2年前
Mysql使用xtrabackup备份失败处理
  在生产环境中使用的是xtrabackup,对mysql进行备份,每天0点开始备份,周日是全量备份,其他时间是基于周日做的增量备份,通过脚本实现,每天备份完成后会发送短信,突然有一天,备份全部失败,手动执行也无法备份,报错的日志如下:/usr/bin/xtrabackupversion2.4.8basedonMySQLserver
Stella981 Stella981
2年前
SpirngBoot后台使用QQ邮箱发送验证码实现全过程
SpirngBoot后台使用QQ邮箱发送验证码在学校自己搞项目的时候想多搞点功能,短信验证码又要收费,所以搞个白嫖邮箱验证哈哈哈哈而在百度查资料的时候,发现大佬们都喜欢只给一两句关键代码,这让我这种菜鸟就比较为难,所以我自己不断一点点百度并整理了这份资料,并且自己也将功能实现了,在此分享给大家,