java使用ssh调用shell命令获取KVM数据(KVM需要通过libvirt管理)

3 篇文章 0 订阅
3 篇文章 0 订阅

1.查询所有的主机(运行和未运行的):

[root@localhost ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 1     bg-119                         running
 2     bg-120                         running
 3     bg-121                         running
 4     bg-132                         running
 -     bg-122                         关闭
 -     bg-239                         关闭
 -     bg-240                         关闭
 -     bg-241                         关闭
 -     centos7                        关闭

2.查询单个的某台主机的基本信息:

[root@localhost ~]# virsh dominfo bg-119
Id:             1
名称:       bg-119
UUID:           bb8e2dab-111f-4151-****-924ec2f7376b
OS 类型:    hvm
状态:       running
CPU:          4
CPU 时间:   112076.1s
最大内存: 16777216 KiB
使用的内存: 16777216 KiB
持久:       是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

3.java中通过ssh调用shell命令获取数据:

3.1 maven添加jsch的jar包

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.53</version>
</dependency>

3.2 java代码(shell命令返回的数据为字符串,通过一些列解析获取对应值)

package com.mdl;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import com.google.gson.Gson;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
import com.purvar.vo.KVM;

public class JSchUtils {

    private static JSch jsch;
    private static Session session;

    /**
     * 连接到指定的IP
     * 
     * @throws JSchException
     */
    public static void connect(String user, String passwd, String host, int port) throws JSchException {
        jsch = new JSch();// 创建JSch对象
        session = jsch.getSession(user, host, port);// 根据用户名、主机ip、端口号获取一个Session对象
        session.setPassword(passwd);// 设置密码

        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);// 为Session对象设置properties
        session.connect();// 通过Session建立连接
    }

    /**
     * 关闭连接
     */
    public static void close() {
        session.disconnect();
    }

    /**
     * 执行相关的命令
     * 
     * @throws JSchException
     */
    public static String execCmd(String command) throws JSchException {
        String resultStr = "";
        BufferedReader reader = null;
        Channel channel = null;
        try {
            if (command != null) {
                channel = session.openChannel("exec");
                ((ChannelExec) channel).setCommand(command);
                // ((ChannelExec) channel).setErrStream(System.err);
                channel.connect();

                InputStream in = channel.getInputStream();
                reader = new BufferedReader(new InputStreamReader(in));
                String buf = null;
                while ((buf = reader.readLine()) != null) {
                    resultStr = resultStr + "\n" + buf;
                    System.out.println("resultStr---" + resultStr);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSchException e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            channel.disconnect();
        }
        return resultStr;
    }

    public static void main(String[] args) throws SftpException {
        try {
            // 1.连接到指定的服务器
            connect("root", "mdl_12345", "172.*.*.45", 22);

            // 2.执行相关的命令,获取主机名称list
            String hostsStr = execCmd("virsh list");
            List<String> hostNameList = getHostNameList(hostsStr);
            List<KVM> hostInfoList = new ArrayList<KVM>();

            // 3.执行相关的命令,获取每台主机基本信息
            for(int i=0;i<hostNameList.size();i++){
                String commandStr = "virsh dominfo" + " " + hostNameList.get(i);
                String hostInfoStr = execCmd(commandStr);
                hostInfoList.add(getHostBaseInfo(hostInfoStr));
            }

            Gson gs = new Gson();
            String mStr = gs.toJson(hostInfoList);
            System.out.println(mStr);

            // 4.关闭连接
            close();
       } catch (JSchException e) {
            e.printStackTrace();
        }
    }

    /**
     * 返回主机名的list
     * @param str
     * @return
     */
    private static List<String> getHostNameList(String str){
        String[] strArr = str.split("\\n");
        List<String> hostList = new ArrayList<String>();
        List<String> mList;
        for(int j=3;j<strArr.length;j++){
            mList = new ArrayList<String>();
            String[] arr = strArr[j].split(" ");
            for(int i=0;i<arr.length;i++){
                if(!arr[i].equals("")){
                    mList.add(arr[i]);
                }
            }
            hostList.add(mList.get(1));
        }
        return hostList;
    }

    /**
     * 返回主机的基本信息
     * @param str
     * @return
     */
    private static KVM getHostBaseInfo(String str){
        KVM kvm = new KVM();
        String[] strArr = str.split("\\n");
        kvm.setUuid(formatStr(strArr[3]));
        kvm.setInstanceRunningId(formatStr(strArr[1]));// 运行时ID
        kvm.setInstanceName(formatStr(strArr[2]));// 虚拟机实例名称
        kvm.setInstanceState(formatStr(strArr[5]));// 虚拟机状态
        kvm.setOSType(formatStr(strArr[4]));// 系统类型
        kvm.setCPUNumber(formatStr(strArr[6]));// CPU数量(个)
        kvm.setCPUTime(formatStr(strArr[7]));// CPU时间(s)
        kvm.setMAXMemory(formatStr(strArr[8]));// 最大使用内存
        kvm.setMemoryUsed(formatStr(strArr[9]));// 已用内存
        // String DiskNumber = "";//硬盘数量(个)
        return kvm;
    }

    /**
     * 去除字符串中间的空格 将中文:替换为英文:
     * 
     * @param str
     * @return
     */
    private static String formatStr(String str) {
        String result;
        if (str.indexOf(":") > 0) {
            result = str.replaceAll(" ", "").replaceAll(":", ":");
        } else {
            result = str.replaceAll(" ", "");
        }

        return result.split("\\:")[1];
    }


}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值