Centos Ubuntu RedOS系统类型下查看系统信息

文章目录

一、项目背景

公司项目想展示当前部署系统的:操作系统,软件版本、IP、主机名。

二、页面

三、说明

说明点1:查询系统类型及IP实际流程是,程序执行linux命令获取结果信息的过程。

说明点2:查询系统类型命令

java 复制代码
hostnamectl | awk -F': +' '/Static hostname|Operating System/ {printf "%s,", $2}' | sed 's/,$//'

说明点3:目前项目支持查询3种不同类型的系统:Centos、Ubuntu、Res OS

说明点4:其中ip、os和hostname是从服务器查询出来的;version是从配置文件或者适配包读取的;

说明点5:IP其实是从网络接口中获取的信息,比如linux执行iFconfig即可获取网络接口信息,在每个接口的输出中,inet 行表示该接口的 IPv4 地址,inet6 行表示 IPv6 地址

CentOS 系统

  • 常见命名

    • 传统上使用 ethX(如 eth0, eth1)
    • 新版本(如 CentOS 7 及以上)可能使用 enoX 或 ensX 这样的命名方式。
      Ubuntu 系统
  • 常见命名:

    • 新版本的 Ubuntu 通常使用 enpX(如 enp0s3, enp0s8)。
      Red Hat 系统
  • 常见命名:

    • 新版本的 Red Hat 和 Fedora 系统通常使用 ensX(如 ens33, ens160)。

结论:

  • 对于 CentOS,你可以检查 eth, eno, 和 ens 开头的接口。
  • 对于 Ubuntu,检查 enp 开头的接口。
  • 对于 Red Hat 和 Fedora,检查 ens 开头的接口。

这种方式可以确保你能够捕获到常见的网络接口命名,并获取相应的 IPv4 地址。

四、代码

1.SysInfo

java 复制代码
package com.hero.lte.ems.sysconf.model;

import javax.xml.bind.annotation.XmlAttribute;

/**
 * ems系统基本信息
 *
 * @author w17231
 * @date 2017年4月13日
 */
public class SysInfo {
    /**
     * ems对外通信IP
     */
    private String emsCommIp;

    /**
     * ems系统IP
     */
    private String emsSysIp;

    /**
     * 系统语言
     */
    private String locale;

    /**
     * 产品名称
     */
    private String productName;

    /**
     * 进程名称
     */
    private String processName;

    /**
     * 产品版本
     */
    private String productVersion;

    private String ftpRootPath;

    private String ftpUploadPath;

    private String verification;

    private String ftpPatchPath;
    /**
     * 制造商
     */
    private String manufacturer;

    /**
     * 产品描述
     */
    private String description;

    private String systemVersion;

    private String systemRoot;

    public String getEmsCommIp() {
        return emsCommIp;
    }

    public void setEmsCommIp(String emsCommIp) {
        this.emsCommIp = emsCommIp;
    }

    public String getEmsSysIp() {
        return emsSysIp;
    }

    public void setEmsSysIp(String emsSysIp) {
        this.emsSysIp = emsSysIp;
    }

    public String getLocale() {
        return locale;
    }

    public void setLocale(String locale) {
        this.locale = locale;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    @XmlAttribute
    public String getProductVersion() {
        return productVersion;
    }

    public void setProductVersion(String productVersion) {
        this.productVersion = productVersion;
    }

    public String getManufacturer() {
        return manufacturer;
    }

    public void setManufacturer(String manufacturer) {
        this.manufacturer = manufacturer;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getProcessName() {
        return processName;
    }

    public void setProcessName(String processName) {
        this.processName = processName;
    }

    public String getFtpRootPath() {
        return ftpRootPath;
    }

    public void setFtpRootPath(String ftpRootPath) {
        this.ftpRootPath = ftpRootPath;
    }

    public String getFtpUploadPath() {
        return ftpUploadPath;
    }

    public void setFtpUploadPath(String ftpUploadPath) {
        this.ftpUploadPath = ftpUploadPath;
    }

    public String getVerification() {
        return verification;
    }

    public void setVerification(String verification) {
        this.verification = verification;
    }

    public String getSystemVersion() {
        return systemVersion;
    }

    public void setSystemVersion(String systemVersion) {
        this.systemVersion = systemVersion;
    }

    public String getSystemRoot() {
        return systemRoot;
    }

    public void setSystemRoot(String systemRoot) {
        this.systemRoot = systemRoot;
    }

    public String getFtpPatchPath() {
        return ftpPatchPath;
    }

    public void setFtpPatchPath(String ftpPatchPath) {
        this.ftpPatchPath = ftpPatchPath;
    }

    @Override
    public String toString() {
        return "SysInfo{" +
                "emsCommIp='" + emsCommIp + '\'' +
                ", emsSysIp='" + emsSysIp + '\'' +
                ", locale='" + locale + '\'' +
                ", productName='" + productName + '\'' +
                ", processName='" + processName + '\'' +
                ", productVersion='" + productVersion + '\'' +
                ", ftpRootPath='" + ftpRootPath + '\'' +
                ", ftpUploadPath='" + ftpUploadPath + '\'' +
                ", ftpPatchPath='" + ftpPatchPath + '\'' +
                ", verification='" + verification + '\'' +
                ", manufacturer='" + manufacturer + '\'' +
                ", description='" + description + '\'' +
                ", systemVersion='" + systemVersion + '\'' +
                ", systemRoot='" + systemRoot + '\'' +
                '}';
    }
}

2.EmsSysConfig

java 复制代码
package com.hero.lte.ems.configuration;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hero.lte.ems.sysconf.model.InstallInfo;
import com.hero.lte.ems.sysconf.model.SysInfo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

@Configuration
public class EmsSysConfig {

    @Bean(name = "sysInfo")
    public SysInfo getSysInfo() {
        SysInfo sysInfo = new SysInfo();
        DynamicConfig dynamicConfig = DynamicConfigLoader.load("server.properties");
        sysInfo.setEmsCommIp(dynamicConfig.getString("system.transport.ip"));
        sysInfo.setEmsSysIp(dynamicConfig.getString("service.host"));
        sysInfo.setProcessName(dynamicConfig.getString("service.name"));
        sysInfo.setProductName(dynamicConfig.getString("service.productName"));
        sysInfo.setSystemVersion(dynamicConfig.getString("service.version"));
        sysInfo.setFtpRootPath(dynamicConfig.getString("system.ftprootpath"));
        sysInfo.setFtpUploadPath(dynamicConfig.getString("system.uploadpath"));
        sysInfo.setFtpPatchPath(dynamicConfig.getString("system.ftppatchpath"));
        sysInfo.setLocale(dynamicConfig.getString("system.language"));
        sysInfo.setVerification(dynamicConfig.getString("verification"));
        sysInfo.setSystemRoot(dynamicConfig.getString("system.root"));
        return sysInfo;
    }

3.HostInformationController

java 复制代码
package com.hero.lte.ems.sysmanager.resources;

import com.hero.lte.ems.common.spring.SpringContextHolder;
import com.hero.lte.ems.sysconf.model.SysInfo;
import com.hero.lte.ems.sysmanager.entity.HostInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping(value = "lte/ems/sysmanager/host")
@Api(value = "HostInformationController",tags={"系统信息"})
public class HostInformationController {

    private static Logger logger = LoggerFactory.getLogger(HostInformationController.class);

    public static String CENTOS_SYSTEM = "CentOS";
    public static String UBUNTU_SYSTEM = "Ubuntu";
    public static String REDOS_SYSTEM = "RED OS";

    @RequestMapping(value = "info", method = RequestMethod.GET)
    @ApiOperation("系统信息")
    public HostInfo getMailConfig() throws Exception
    {
        SysInfo sysInfo = SpringContextHolder.getBean(SysInfo.class);
        List<String> list = getAllHostIp();
        final StringBuilder ip = new StringBuilder("");
        if(list!=null&&list.size()>0){
            list.forEach(o->{
                ip.append(o+"/");
            });
            ip.deleteCharAt(ip.length()-1);
        }
        HostInfo hostInfo = new HostInfo();
        //hostInfo.setIp(sysInfo.getEmsCommIp());
        Map<String, String> map = getHostnameAndSystem();
        hostInfo.setIp(ip.toString());
        hostInfo.setVersion(sysInfo.getSystemVersion());
        hostInfo.setHostname(map.get("hostname").equals("n/a") ? "localhost" : map.get("hostname"));
        hostInfo.setOs(map.get("os"));
        return hostInfo;
    }

    public Map<String, String> getHostnameAndSystem() {
        Map<String, String> map = new HashMap<>();
        InputStream in = null;
        BufferedReader read = null;
        Process pro = null;
        String cmd = "hostnamectl | awk -F': +' '/Static hostname|Operating System/ {printf \"%s,\", $2}' | sed 's/,$//'";
        String[] cmds = null;
        try {
            String result = getSingleResult(cmd, cmds, pro, in, read);
            logger.info("result:{}", result);
            String[] split = result.split(",");
            map.put("hostname", split[0]);
            map.put("os", split[1]);
        } catch (IOException | InterruptedException e) {
            logger.error("-getHostnameAndSystem-Exception:{}", e);
            return null;
        } finally {
            try {
                if (pro != null) {
                    pro.destroy();
                }
                if (read != null) {
                    read.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException e) {
                logger.error("-getHostnameAndSystem-finally-IOException:{}", e);
            }
        }
        return map;
    }

    public static String getSingleResult(String cmd, String[] cmds, Process pro, InputStream in, BufferedReader read) throws IOException, InterruptedException {
        cmds = new String[]{"/bin/sh", "-c", cmd};
        logger.info("-cmd:{}", cmd);
        pro = Runtime.getRuntime().exec(cmds);
        if (pro.waitFor() == 0) {
            String line = "";
            in = pro.getInputStream();
            read = new BufferedReader(new InputStreamReader(in));
            while ((line = read.readLine()) != null) {
                logger.info("-line:{}", line);
                return line;
            }
        }
        return null;
    }

    /**
     * 获取该主机上所有网卡的ip
     */
    public static ArrayList<String> getAllHostIp(){
        ArrayList<String> hostAddress = new ArrayList<>();
        try{
            String systemType = createSystemMonitor();

            // 获得本机的所有网络接口
            Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();
            while (nifs.hasMoreElements()) {
                NetworkInterface nif = nifs.nextElement();
                //查询Centos系统参数
                if(systemType.equals(CENTOS_SYSTEM) && nif.getName().startsWith("eth") || nif.getName().startsWith("eno")) {
                    // 获得与该网络接口绑定的 IP 地址,一般只有一个
                    Enumeration<InetAddress> addresses = nif.getInetAddresses();
                    while (addresses.hasMoreElements()) {
                        InetAddress addr = addresses.nextElement();
                        if (addr instanceof Inet4Address) { // 只关心 IPv4 地址
                            hostAddress.add(addr.getHostAddress());
                        }
                    }
                } else if(systemType.equals(UBUNTU_SYSTEM) && nif.getName().startsWith("enp")) {
                    //查询ubuntu系统参数,获得与该网络接口绑定的 IP 地址,一般只有一个
                    Enumeration<InetAddress> addresses = nif.getInetAddresses();
                    while (addresses.hasMoreElements()) {
                        InetAddress addr = addresses.nextElement();
                        if (addr instanceof Inet4Address) { // 只关心 IPv4 地址
                            hostAddress.add(addr.getHostAddress());
                        }
                    }
                } else if(systemType.equals(REDOS_SYSTEM) && nif.getName().startsWith("ens")) {
                    logger.info("nif.getName():{}", nif.getName());
                    //查询redos系统参数,获得与该网络接口绑定的 IP 地址,一般只有一个
                    Enumeration<InetAddress> addresses = nif.getInetAddresses();
                    while (addresses.hasMoreElements()) {
                        InetAddress addr = addresses.nextElement();
                        if (addr instanceof Inet4Address) {
                            hostAddress.add(addr.getHostAddress());
                        }
                    }
                }
            }


        }catch(Exception e){
            e.printStackTrace();
        }
        return hostAddress;
    }

    public static String createSystemMonitor() {
        String systemType = "";
        InputStream in = null;
        BufferedReader read = null;
        Process pro = null;
        String cmd = "hostnamectl | awk -F': +' '/Static hostname|Operating System/ {printf \"%s,\", $2}' | sed 's/,$//'";
        String[] cmds = null;
        try {
            String result = getSingleResult(cmd, cmds, pro, in, read);
            String[] split = result.split(",");
            String os = split[1];
            if (os.contains(CENTOS_SYSTEM)) {
                systemType = CENTOS_SYSTEM;
            } else if (os.contains(UBUNTU_SYSTEM)) {
                systemType = UBUNTU_SYSTEM;
            } else if (os.contains(REDOS_SYSTEM)) {
                systemType = REDOS_SYSTEM;
            }
        } catch (IOException | InterruptedException e) {
            logger.error("-createSystemMonitor-Exception:{}", e);
            return null;
        } finally {
            try {
                if (pro != null) {
                    pro.destroy();
                }
                if (read != null) {
                    read.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException e) {
                logger.error("-createSystemMonitor-finally-IOException:{}", e);
            }
        }
        return systemType;
    }

}

4.HostInfo

java 复制代码
package com.hero.lte.ems.sysmanager.entity;

public class HostInfo {

    private String os = "CentOS Linux release 7.7.1908 (Core)";;

    private String version;

    private String ip;

    private String hostname = "localhost.localdomain";

    public String getOs() {
        return os;
    }

    public void setOs(String os) {
        this.os = os;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getHostname() {
        return hostname;
    }

    public void setHostname(String hostname) {
        this.hostname = hostname;
    }

    @Override
    public String toString() {
        return "HostInfo{" +
                "os='" + os + '\'' +
                ", version='" + version + '\'' +
                ", ip='" + ip + '\'' +
                ", hostname='" + hostname + '\'' +
                '}';
    }
}
相关推荐
davenian20 分钟前
< 自用文 rclone > 在 Ubuntu 24 访问 Google Drive 网络内容
linux·ubuntu·rclone
s9123601011 小时前
Rust Ubuntu下编译生成环境win程序踩坑指南
windows·ubuntu·rust
单车少年ing1 小时前
linux两个特殊的宏 _RET_IP_ 和_THIS_IP_ 实现
linux·arm
Lucas6491 小时前
项目上线流程梳理(Linux宝塔面板)
linux·运维·服务器·项目部署
手插口袋谁也不爱♡1 小时前
远程访问你的家庭NAS服务器:OpenMediaVault内网穿透配置教程
linux·运维·服务器
为美好的生活献上中指1 小时前
java每日精进 4.29【框架之自动记录日志并插入如数据库流程分析】
java·linux·数据库
mljy.2 小时前
Linux《进程概念(中)》
linux
JhonKI2 小时前
【Linux网络】深入解析I/O多路转接 - Select
linux·运维·网络
伤不起bb2 小时前
Nginx 核心功能
linux·服务器·nginx