• 使用JSch访问服务端日志


    有些操作,需要短信验证码,就要每次到服务端查看日志。有些同事不知道如何查看,就写了页面方便大家调用查看服务端日志。

    1.Service层

    1.1Service接口

    package com.csj2018.o2o.service;
    
    import java.io.IOException;
    
    import com.jcraft.jsch.JSchException;
    
    public interface WangLog {
        String[] getMessage(String command) throws JSchException,IOException;
    }
    

    1.2.Service实现类

    package com.csj2018.o2o.service.impl;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import org.springframework.stereotype.Service;
    
    import com.csj2018.o2o.service.WangdaLog;
    import com.jcraft.jsch.ChannelExec;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.JSchException;
    import com.jcraft.jsch.Session;
    @Service
    public class WangLogImpl implements WangLog{
    	private String host = "IP地址";
        private int port = 22;
        private String username = "用户名";
        private String password = "密码";
    	@Override
    	public String[] getMessage(String command) throws IOException {
    		StringBuilder sb = new StringBuilder();
    		// 创建JSch
            JSch jSch = new JSch();
            // 获取session
            Session session;
    		try {
    			session = jSch.getSession(username, host, port);
    			session.setPassword(password);
    	        session.setConfig("StrictHostKeyChecking", "no");
    
    	        // 启动连接
    	        session.connect();
    	        ChannelExec exec = (ChannelExec)session.openChannel("exec");
    	        exec.setCommand(command);
    	        exec.setInputStream(null);
    	        exec.setErrStream(System.err);
    	        InputStream in = exec.getInputStream();
    	        exec.connect();
    
    	        byte[] tmp = new byte[1024];
    	        while(true){
    	            while(in.available() >0){
    	                int i = in.read(tmp,0,1024);
    	                if(i<0){
    	                    break;
    	                }
    	                sb.append(new String(tmp,i));
    	            }
    	        	
    	            if(exec.isClosed()){
    	                if(in.available()>0){
    	                    continue;
    	                }
    	                System.out.println("exit_statux:"+exec.getExitStatus());
    	                break;
    	            }
    	            try{Thread.sleep(1000);}catch(Exception ee){}
    	        }
    
    	        exec.disconnect();
    	        session.disconnect();
    		} catch (JSchException e) {
    			e.printStackTrace();
    		}
    		return sb.toString().split("
    ");
    	}
        
    }
    

    1.3测试Service层

    package com.csj2018.o2o.service;
    
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.List;
    
    import org.junit.Ignore;
    import org.junit.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import com.csj2018.o2o.BaseTest;
    import com.jcraft.jsch.JSchException;
    
    public class WangLogTest extends BaseTest{
    	@Autowired
    	private WangLog wangLog;
    	@Test
    	public void test() throws JSchException, IOException {
    		String[] logs = wangLog.getMessage("cd /data/logs/message-service/; grep value message-service.log |tail -n 10;");
    		for(String s:logs) {
    			System.out.println(s);
    		}
    	}
    }
    

    2.controller层

    package com.csj2018.o2o.web.shopadmin;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.csj2018.o2o.entity.Area;
    import com.csj2018.o2o.entity.Param;
    import com.csj2018.o2o.service.AreaService;
    import com.csj2018.o2o.service.WangLog;
    import com.csj2018.o2o.service.YYGHParamService;
    import com.csj2018.o2o.util.HttpServletRequestUtil;
    import com.csj2018.o2o.web.superadmin.AreaController;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.jcraft.jsch.JSchException;
    
    @Controller
    @RequestMapping("/superadmin")
    public class Getparam {
    	Logger logger = LoggerFactory.getLogger(AreaController.class);
        @Autowired
        private WangLog wangLog;
        @RequestMapping(value="/wangmessage", method=RequestMethod.POST)
        @ResponseBody
        private Map<String,Object> getMessageLog(@RequestBody Map<String,String> request){
    		Map<String, Object> modelMap = new HashMap<>();
    		try {
    			String command = request.get("command");
    			System.out.println(command);
    			String[] logs= wangdaLog.getMessage(command);
    			logger.info("日志:"+Arrays.toString(logs));
    			modelMap.put("logs", logs);
    			modelMap.put("success", true);
    		}catch (JSchException e) {
    			modelMap.put("success", false);
    			modelMap.put("errMsg", e.toString());
    		}catch (IOException e) {
    			modelMap.put("success", false);
    			modelMap.put("errMsg", e.toString());
    		}
        	return modelMap;
        	
        }
    }
    

    3.前端

    3.1 webapp/wang.html

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>SUI Mobile Demo</title>
    <meta name="description"
    	content="MSUI: Build mobile apps with simple HTML, CSS, and JS components.">
    <meta name="author" content="查看外部浏览器日志">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1">
    <link rel="shortcut icon" href="/favicon.ico">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no">
    
    <!-- Google Web Fonts -->
    
    <link rel="stylesheet"
    	href="//g.alicdn.com/msui/sm/0.6.2/css/sm.min.css">
    <link rel="stylesheet"
    	href="//g.alicdn.com/msui/sm/0.6.2/css/sm-extend.min.css">
    
    <script>
    	//ga
    </script>
    <script>
    	var _hmt = _hmt || [];
    	(function() {
    		var hm = document.createElement("script");
    		hm.src = "//hm.baidu.com/hm.js?ba76f8230db5f616edc89ce066670710";
    		var s = document.getElementsByTagName("script")[0];
    		s.parentNode.insertBefore(hm, s);
    	})();
    </script>
    
    </head>
    <body>
    	<div class="page-group">
    		<div id="page-label-input" class="page">
    			<header class="bar bar-nav">
    				<h1 class="title">log查看</h1>
    			</header>
    			<div class="content">
    				<div class="list-block">
    					<ul>
    						<!-- 字符串 -->
    						<li>
    							<div class="item-content">
    								<div class="item-inner">
    									<div class="item-title label">log查看</div>
    									<div class="item-input">
    										<textarea id="command" rows="10" cols="50" placeholder='请输入命令。命令之间以";"间隔'></textarea>
    									</div>
    								</div>
    							</div>
    						</li>
    					</ul>
    				</div>
    				
    				<div class="content-block">
    					<div class="row">
    						<div class="col-35" style="padding-left:100px;">
    							<!-- android解密 -->
    							<a  href="#" class="button button-big button-fill button-success" id="getlog">获取日志</a>
    						</div>
    					</div>
    				</div>
    				<div class="item-content">
    					<ul>
    						<li>
    							<text>结果字符串</text>
    							<div class="item-inner" id="result" style="word-wrap:break-word;word-break:break-all;padding-left: 5px;padding-right: 5px; wrap-content;">
    							</div>
    						</li>
    					</ul>
    				</div>				
                </div>
    			</div>
    		</div>
    
    	</div>
    	<script type='text/javascript'
    		src='//g.alicdn.com/sj/lib/zepto/zepto.min.js' charset='utf-8'></script>
    	<script type='text/javascript'
    		src='//g.alicdn.com/msui/sm/0.6.2/js/sm.min.js' charset='utf-8'></script>
    	<script type='text/javascript'
    		src='//g.alicdn.com/msui/sm/0.6.2/js/sm-extend.min.js' charset='utf-8'></script>
    	<script type='text/javascript'
    		src='./resources/js/shop/wang.js' charset="utf-8"></script>
    
    </body>
    </html>
    

    3.2 webapp/resources/js/shop/wang.js

    /**
     * 
     */
    /**
     * 
     */
    $(function(){
    	var logUrl = '/o2o/superadmin/wangmessage';
    	getShopInitInfo();
    	function getShopInitInfo(){
    	
    	$('#getlog').click(function(){
    		var formData = {command:$('#command').val()};
    		$.ajax({
    			url:logUrl,
    			type:'POST',
    			data:JSON.stringify(formData),
    			contentType:'application/json',
    			processData:false,
    			cache:false,
    			success:function(data){
    				if(data.success){
    					$.toast("提交成功!");
    					//获取响应内容
    //					alert(JSON.stringify(data.decrypt));
    					var logs = data.logs;
    					var temp = '<ul>';
    					for(i=0;i<logs.length;i++){
    						temp += '<li><text>'+logs[i]+'</text></li>';
    					}
    					temp +='</ul>';
    //					$.toast(data.logs);
    					$('#result').html(temp);
    					//填充
    				}else{
    					$.toast("提交失败:"+data.errMsg);
    				}
    			}
    		});
    	});
    	
    	}
    })
    

    3.3 验证

    参考博客:
    https://www.cnblogs.com/xiaoliu66007/p/11084208.html
    https://www.cnblogs.com/jing1617/p/7132100.html

  • 相关阅读:
    Oracle从入门到精通(笔记)
    MongoDB教程(笔记)
    深入浅出Oracle:DBA入门、进阶与诊断案例(读书笔记2)
    深入浅出Oracle:DBA入门、进阶与诊断案例(读书笔记1)
    获取本周、本季度、本月、上月的开始日期、结束日期
    TortoiseSVN新人使用指南
    Eclipse创建java web工程
    supersock问题
    UDP错误10054:远程主机强迫关闭了一个现有的连接
    【转】javascript深入理解js闭包
  • 原文地址:https://www.cnblogs.com/csj2018/p/12517265.html
Copyright © 2020-2023  润新知