关于基于ganymed-ssh2源码包定义LinuxUtils工具类实现执行linux操作系统ssh命令、获取内存及CPU监控数据等代码示例

标签:ganymed-ssh2,LinuxUtils,linux工具类,linux,ssh命令,内存memoryUsage,cpuUsage     发布时间:2018-08-02   

一、前言

通过ganymed-ssh2源码包ch.ethz.ssh2.Connection、ch.ethz.ssh2.Session定义linux命令行ssh操作LinuxUtils工具类,实现ssh命令的exec执行、执行远程ip执行remoteExec、获取系统cpu实时监控cpuUsage性能参数、获取系统内存memoryUsage性能参数等。

二、示例代码

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.lang.Process;
import java.lang.Runtime;
import java.util.HashMap;
 
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
 
public class LinuxUtils
{
    public static final int CONSERVATIVE    = 0;
    public static final int AVERAGE     = 1;
    public static final int OPTIMISTIC  = 2;
 
    public static String exec(String command) {
        BufferedReader reader = null;
        try {
            Process process = Runtime.getRuntime().exec(command);
            reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            StringBuffer ret = new StringBuffer();
            String line;
            while ((line = reader.readLine()) != null) {
                ret.append(line + "\r\n");
            }
            reader.close();
            return ret.toString();
        catch (Exception e) {
            e.printStackTrace();
        finally {
            if (reader != nulltry { reader.close(); } catch (Exception e) { }
        }
        return "";
    }
 
    public static String remoteExec(String ip, String name, String password, String command) {
        Connection connection = null;
        Session session = null;
        BufferedReader reader = null;
        try {
            connection = new Connection(ip);  
            connection.connect();
            boolean isAuthenticated = connection.authenticateWithPassword(name, password);  
            if (isAuthenticated) {
                session = connection.openSession();  
                session.execCommand(command);  
                InputStream stdout = new StreamGobbler(session.getStdout());  
                reader = new BufferedReader(new InputStreamReader(stdout));
                StringBuffer ret = new StringBuffer();
                String line;
                while ((line = reader.readLine()) != null) {
                    ret.append(line + "\r\n");
                }
                return ret.toString();
            else {
                System.out.printf("ssh[%s@%s]: auth failed!", name, ip);
            }
        catch (Exception e) {
            e.printStackTrace();
        finally {
            if (reader != nulltry { reader.close(); } catch (Exception e) { }
            if (session != nulltry { session.close(); } catch (Exception e) { }
            if (connection != nulltry { connection.close(); } catch (Exception e) { }
        }
        return "";
    }
 
    /**
     * cpuUsage gives us the percentage of cpu usage
     
     * mpstat -P ALL out stream example:
     *
     *  Linux 3.2.0-30-generic (castarco-laptop)    10/09/12    _x86_64_    (2 CPU)                 - To discard
     *                                                                                              - To discard
     *  00:16:30     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle    - To discard
     *  00:16:30     all   17,62    0,03    3,55    0,84    0,00    0,03    0,00    0,00   77,93
     *  00:16:30       0   17,36    0,05    3,61    0,83    0,00    0,05    0,00    0,00   78,12
     *  00:16:30       1   17,88    0,02    3,49    0,86    0,00    0,01    0,00    0,00   77,74
     
     * @param measureMode Indicates if we want optimistic, convervative or average measurements.
     */
    public static Double cpuUsage (int measureMode) throws Exception {
 
        BufferedReader mpstatReader = null;
 
        String      mpstatLine;
        String[]    mpstatChunkedLine;
        Double      selected_idle;
 
        try {
            Runtime runtime = Runtime.getRuntime();
            Process mpstatProcess = runtime.exec("mpstat -P ALL");
 
            mpstatReader = new BufferedReader(new InputStreamReader(mpstatProcess.getInputStream()));
 
            // We discard the three first lines
            mpstatReader.readLine();
            mpstatReader.readLine();
            mpstatReader.readLine();
 
            mpstatLine = mpstatReader.readLine();
            if (mpstatLine == null) {
                throw new Exception("mpstat didn't work well");
            else if (measureMode == LinuxUtils.AVERAGE) {
                mpstatChunkedLine = mpstatLine.replaceAll(","".").split("\\s+");
                selected_idle = Double.parseDouble(mpstatChunkedLine[10]);
            else {
                selected_idle   = (measureMode == LinuxUtils.CONSERVATIVE)?200.:0.;
                Double candidate_idle;
 
                int i = 0;
                while((mpstatLine = mpstatReader.readLine()) != null) {
                    mpstatChunkedLine = mpstatLine.replaceAll(","".").split("\\s+");
                    candidate_idle = Double.parseDouble(mpstatChunkedLine[10]);
 
                    if (measureMode == LinuxUtils.CONSERVATIVE) {
                        selected_idle = (selected_idle < candidate_idle)?selected_idle:candidate_idle;
                    else if (measureMode == LinuxUtils.OPTIMISTIC) {
                        selected_idle = (selected_idle > candidate_idle)?selected_idle:candidate_idle;
                    }
                    ++i;
                }
                if (i == 0) {
                    throw new Exception("mpstat didn't work well");
                }
            }
        catch (Exception e) {
            throw e; // It's not desirable to handle the exception here
        finally {
            if (mpstatReader != nulltry { mpstatReader.close(); } catch (IOException e) { }
        }
 
        return  100-selected_idle;
    }
 
    /**
     * memoryUsage gives us data about memory usage (RAM and SWAP)
     */
    public static HashMap<String, Integer> memoryUsage () throws Exception {
        BufferedReader freeReader = null;
 
        String      freeLine;
        String[]    freeChunkedLine;
 
        HashMap<String, Integer> usageData = new HashMap<String, Integer>();
 
        try {
            Runtime runtime = Runtime.getRuntime();
            Process freeProcess = runtime.exec("free -k"); // We measure memory in kilobytes to obtain a greater granularity
 
            freeReader = new BufferedReader(new InputStreamReader(freeProcess.getInputStream()));
 
            // We discard the first line
            freeReader.readLine();
 
            freeLine = freeReader.readLine();
            if (freeLine == null) {
                throw new Exception("free didn't work well");
            }
            freeChunkedLine = freeLine.split("\\s+");
 
            usageData.put("total", Integer.parseInt(freeChunkedLine[1]));
 
            freeLine = freeReader.readLine();
            if (freeLine == null) {
                throw new Exception("free didn't work well");
            }
            freeChunkedLine = freeLine.split("\\s+");
 
            usageData.put("used", Integer.parseInt(freeChunkedLine[2]));
 
            freeLine = freeReader.readLine();
            if (freeLine == null) {
                throw new Exception("free didn't work well");
            }
            freeChunkedLine = freeLine.split("\\s+");
 
            usageData.put("swap_total", Integer.parseInt(freeChunkedLine[1]));
            usageData.put("swap_used", Integer.parseInt(freeChunkedLine[2]));
        catch (Exception e) {
            throw e;
        finally {
            if (freeReader != nulltry { freeReader.close(); } catch (IOException e) { }
        }
        return usageData;
    }
}