java使用ssh调用shell命令获取KVM数据(KVM需要通过libvirt管理)(二)
来源:互联网 发布:有源码怎么做辅助 编辑:程序博客网 时间:2024/05/22 10:58
- jsch工具类:
package com.mdl;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.Properties;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;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; }}
- main函数:
package com.mdl;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.google.gson.Gson;import com.jcraft.jsch.JSchException;import com.jcraft.jsch.SftpException;import com.mdl.vo.KVM;import com.mdl.vo.NET;public class KVMCollectMain { public static void main(String[] args) throws SftpException { try { // 1.连接到指定的服务器 JSchUtils.connect("root", "mdl_12345", "172.*.*.45", 22); // 2.执行相关的命令,获取主机名称list String hostsStr = JSchUtils.execCmd("virsh list"); List<String> hostNameList = getHostNameList(hostsStr); // 3.执行相关的命令,获取每台主机基本信息 Map<String,KVM> hostInfoMap = getHostInfo(hostNameList); // 4.执行相关的命令,获取存储信息 String storeCommand = "virsh pool-list"; String storeStr = JSchUtils.execCmd(storeCommand); List<String> storeList = getStoreInfo(storeStr); // 5.执行相关的命令,获取每个存储池下面的主机信息 Map<String,List<Map<String,KVM>>> mStoreMap = getStoreDetailInfo(storeList); Map<String,Object> resMap = new HashMap<String,Object>(); // 6.执行相关的命令,获取网络信息 String networkCommand = "virsh net-list"; String networkStr = JSchUtils.execCmd(networkCommand); HashMap<String,NET> netMapInfo = getNetworkInfo(networkStr); resMap.put("kvm", hostInfoMap); resMap.put("store", mStoreMap); resMap.put("network", netMapInfo); Gson gs = new Gson(); String mStr = gs.toJson(resMap); System.out.println(mStr); // 4.关闭连接 JSchUtils.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++){ //字符串换行分割后,下标0-2的数值是表格名称和分割线 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 list * @return * @throws JSchException */ private static Map<String,KVM> getHostInfo(List<String> list) throws JSchException{ Map<String,KVM> map = new HashMap<String,KVM>(); for(int i=0;i<list.size();i++){ String commandStr = "virsh dominfo" + " " + list.get(i); String hostInfoStr = JSchUtils.execCmd(commandStr); map.put(list.get(i), getHostBaseInfo(hostInfoStr)); } return map; } /** * 获取存储池列表 * @return */ private static List<String> getStoreInfo(String str){ String[] strArr = str.split("\\n"); List<String> storeList = new ArrayList<String>(); List<String> mList; for(int j=3;j<strArr.length;j++){ //字符串换行分割后,下标0-2的数值是表格名称和分割线 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]); } } storeList.add(mList.get(0)); } return storeList; } /** * 获取所有存储池下的每个池中的主机信息 * @param storeList * @return * @throws JSchException */ private static Map<String,List<Map<String,KVM>>> getStoreDetailInfo(List<String> storeList) throws JSchException{ Map<String,List<Map<String,KVM>>> map = new HashMap<String,List<Map<String,KVM>>>();; for (String str : storeList) { String storeDetail = JSchUtils.execCmd("virsh vol-list --details" + " " + str); List<Map<String,KVM>> list = getStoreHostDetail(storeDetail); map.put(str, list); } return map; } /** * 每个存储池下面包含的主机及主机信息 * @param str * @return * @throws JSchException */ private static List<Map<String,KVM>> getStoreHostDetail(String str) throws JSchException{ String[] strArr = str.split("\\n"); Map<String,KVM> map = null; List<Map<String,KVM>> list = new ArrayList<Map<String,KVM>>(); List<String> mList; for(int j=3;j<strArr.length;j++){ //字符串换行分割后,下标0-2的数值是表格名称和分割线 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]); } } if(mList.get(0).indexOf(".")>0 && mList.get(0).split("\\.")[1].equals("img")){ map = new HashMap<String,KVM>(); String hostName = mList.get(0).split("\\.")[0]; String commandStr = "virsh dominfo" + " " + hostName; String hostInfoStr = JSchUtils.execCmd(commandStr); map.put(hostName, getHostBaseInfo(hostInfoStr)); list.add(map); } } return list; } /** * 获取网络信息 * @param str * @return * @throws JSchException */ private static HashMap<String,NET> getNetworkInfo(String str) throws JSchException{ String[] strArr = str.split("\\n"); List<String> netList = new ArrayList<String>(); List<String> mList; for(int j=3;j<strArr.length;j++){ //字符串换行分割后,下标0-2的数值是表格名称和分割线 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]); } } netList.add(mList.get(0)); } HashMap<String,NET> map = null; for (String mStr : netList) { String netCommand = "virsh net-info" + " " + mStr; String networkStr = JSchUtils.execCmd(netCommand); NET net = operNetInfo(networkStr); map = new HashMap<String,NET>(); map.put(mStr, net); } return map; } private static NET operNetInfo(String str){ NET net = new NET(); String[] strArr = str.split("\\n"); net.setActive(formatStr(strArr[3])); net.setUuid(formatStr(strArr[2])); net.setAutorun(formatStr(strArr[5])); net.setBridge(formatStr(strArr[6])); net.setEnduring(formatStr(strArr[4])); net.setName(formatStr(strArr[1])); return net; } /** * 去除字符串中间的空格 将中文:替换为英文: * * @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]; }}
- KVM实体:
package com.mdl.vo;public class KVM { String uuid; String InstanceRunningId;//运行时ID String InstanceName;//虚拟机实例名称 String InstanceState;//虚拟机状态 String OSType;//系统类型 String CPUNumber;//CPU数量(个) String CPUTime;//CPU时间(s) String MAXMemory;//最大使用内存(MB) String MemoryUsed;//已用内存(MB)// String DiskNumber;//硬盘数量(个) public String getUuid() { return uuid; } public void setUuid(String uuid) { this.uuid = uuid; } public String getInstanceRunningId() { return InstanceRunningId; } public void setInstanceRunningId(String instanceRunningId) { InstanceRunningId = instanceRunningId; } public String getInstanceName() { return InstanceName; } public void setInstanceName(String instanceName) { InstanceName = instanceName; } public String getInstanceState() { return InstanceState; } public void setInstanceState(String instanceState) { InstanceState = instanceState; } public String getOSType() { return OSType; } public void setOSType(String oSType) { OSType = oSType; } public String getCPUNumber() { return CPUNumber; } public void setCPUNumber(String cPUNumber) { CPUNumber = cPUNumber; } public String getCPUTime() { return CPUTime; } public void setCPUTime(String cPUTime) { CPUTime = cPUTime; } public String getMAXMemory() { return MAXMemory; } public void setMAXMemory(String mAXMemory) { MAXMemory = mAXMemory; } public String getMemoryUsed() { return MemoryUsed; } public void setMemoryUsed(String memoryUsed) { MemoryUsed = memoryUsed; }}
4.NET实体:
package com.mdl.vo;public class NET { private String name; private String uuid; private String active;//活跃 private String enduring ;//持久 private String autorun;//自启动 private String bridge;//桥接 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUuid() { return uuid; } public void setUuid(String uuid) { this.uuid = uuid; } public String getActive() { return active; } public void setActive(String active) { this.active = active; } public String getEnduring() { return enduring; } public void setEnduring(String enduring) { this.enduring = enduring; } public String getAutorun() { return autorun; } public void setAutorun(String autorun) { this.autorun = autorun; } public String getBridge() { return bridge; } public void setBridge(String bridge) { this.bridge = bridge; }}
相关命令:
1. 存储池列表:
virsh # pool-list 名称 状态 自动开始------------------------------------------- data 活动 是 mnt 活动 是
1.1 存储池data:
1.1.1 存储池data基本信息:
virsh # pool-info data名称: dataUUID: 669e2c02-62ce-4a4e-****-3e11ef2bc7bb状态: running持久: 是自动启动: 是容量: 1.55 TiB分配: 623.24 GiB可用: 966.74 GiB
1.1.2 存储池data详细信息:
virsh # vol-list --details data 名称 路径 类型 Capacity 分配------------------------------------------------------------------------------------------------------------------------------ bg-119.img /data/bg-119.img 文件 400.00 GiB 93.38 GiB bg-120.img /data/bg-120.img 文件 400.00 GiB 90.28 GiB bg-121.img /data/bg-121.img 文件 400.00 GiB 75.76 GiB bg-122.img /data/bg-122.img 文件 400.00 GiB 8.58 GiB bg-132.img /data/bg-132.img 文件 400.00 GiB 255.38 GiB bg-239.img /data/bg-239.img 文件 400.00 GiB 22.37 GiB bg-240.img /data/bg-240.img 文件 400.00 GiB 7.57 GiB bg-241.img /data/bg-241.img 文件 400.00 GiB 9.39 GiB centos7-dvd.iso /data/centos7-dvd.iso 文件 3.86 GiB 3.86 GiB centos7.img /data/centos7.img 文件 400.00 GiB 2.34 GiB HDP-pkg /data/HDP-pkg dir 0.00 B 0.00 B HDP-UTILS-1.1.0.21-centos7.tar.gz.filepart /data/HDP-UTILS-1.1.0.21-centos7.tar.gz.filepart 文件 14.70 MiB 14.70 MiB network /data/network 文件 337.00 B 4.00 KiB ocn_build_pkg /data/ocn_build_pkg dir 0.00 B 0.00 B virt-clone-centos7.sh /data/virt-clone-centos7.sh 文件 1007.00 B 4.00 KiB virt-install-centos7.sh /data/virt-install-centos7.sh 文件 496.00 B 4.00 KiB
1.2 存储池mnt信息:
1.2.1 存储池mnt基本信息:
virsh # pool-info mnt名称: mntUUID: 35a8f3a4-f0d4-4bbd-****-04d777c5452f状态: running持久: 是自动启动: 是容量: 1.55 TiB分配: 623.24 GiB可用: 966.74 GiB
1.2.2 存储池mnt详细信息:
virsh # vol-list --details mnt 名称 路径 类型 Capacity 分配--------------------------------------------------------------------------------- centos7-dvd.iso /mnt/centos7-dvd.iso 文件 3.86 GiB 3.86 GiB centos7.img /mnt/centos7.img 文件 400.00 GiB 2.34 GiB network /mnt/network 文件 333.00 B 4.00 KiB virt-clone-centos7.sh /mnt/virt-clone-centos7.sh 文件 1005.00 B 4.00 KiB
2 . 网络
2.1 列表:
virsh # net-list 名称 状态 自动开始 持久---------------------------------------------------------- default 活动 是 是
2.2 详情:
virsh # net-info default名称: defaultUUID: fb38ae16-a4e2-4875-****-d00cc9d36ba8活跃: 是持久: 是自动启动: 是桥接: virbr0
阅读全文
0 0
- java使用ssh调用shell命令获取KVM数据(KVM需要通过libvirt管理)
- java使用ssh调用shell命令获取KVM数据(KVM需要通过libvirt管理)(二)
- 使用libvirt管理kvm(API篇)
- 使用libvirt管理kvm(virsh篇)
- 使用libvirt管理kvm(virsh篇)
- 使用libvirt管理KVM虚拟机
- 使用libvirt管理kvm虚拟机
- 使用libvirt管理kvm虚拟机
- 使用libvirt管理kvm虚拟机
- 使用libvirt管理kvm虚拟机
- 通过python-libvirt管理KVM虚拟机-1
- 通过python-libvirt管理KVM虚拟机-2
- 使用 libvirt创建和管理KVM虚拟机
- 使用 libvirt创建和管理KVM虚拟机
- 虚拟化:使用libvirt管理kvm虚拟机
- 使用libvirt创建和管理KVM虚拟机
- 使用 libvirt创建和管理KVM虚拟机
- KVM Snapshot使用qemu-img, libvirt命令
- httpUtils
- ASP.NET Core MVC 配置全局路由前缀
- 使用java技术将数据导出到excel中
- ASP.NET Core MVC 中的 [Controller] 和 [NonController]
- Hadoop Journal Node 作用
- java使用ssh调用shell命令获取KVM数据(KVM需要通过libvirt管理)(二)
- FreeBSD 查看端口占用进行号并杀掉
- JAVA并发全景图1.1版本
- 不登录到MySQL执行SQL语句
- java反射详解之反射作用
- Redis
- 舞步学院为你解答,爱情新手常犯的六个错误
- Java中集合
- 三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别