Python#服务器信息清洗(Json)

用python获取服务器信息,输出json数据给前端

要求python版本>=3
python2版本的默认字符编码文件是ascii
python3版本的默认字符编码文件是utf-8

输出数据效果

{
    "基础硬件信息": {
        "主机名": "sun",
        "内核版本": "3.10.0-1127.19.1.el7.x86_64",
        "操作系统版本": "CentOS Linux release 7.8.2003 (Core)",
        "CPU版本": "Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz"
    },
    "CPU信息": {
        "Manufacturer(制造商)": " LENOVO",
        "Product Name(机器型号)": " 4180AF8",
        "Version(机器版本)": " ThinkPad T420",
        "Serial Number(序列号)": " P10XK8F",
        "UUID": " 29533481-510b-11cb-83e6-9e89b53f01dc",
        "Wake-up Type(唤醒方式)": " Power Switch",
        "SKU Number(SKN编号)": " Not Specified",
        "Family(产品家族)": " ThinkPad T420"
    },
    "内核信息": {
        "cpu版本信息": "Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz",
        "物理CPU颗数": "1",
        "每颗物理CPU 的核心数": "2",
        "cpu的总核心数": "2"
    },
    "内存信息": [
        {
            "Size(容量)": " 4096 MB",
            "Locator(插槽号)": " ChannelA-DIMM0",
            "Type(类型)": " DDR3",
            "Speed(速率)": " 1333 MT/s",
            "Manufacturer(厂商)": " Samsung",
            "Serial Number(序列号)": " 673343B6"
        },
        {
            "Size(容量)": " 4096 MB",
            "Locator(插槽号)": " ChannelB-DIMM0",
            "Type(类型)": " DDR3",
            "Speed(速率)": " 1333 MT/s",
            "Manufacturer(厂商)": " Kingston",
            "Serial Number(序列号)": " 17099F79"
        }
    ]
}

python脚本

#!/usr/bin/env python3
# Author: kakaops
# Email: 17852032278@139.com
# subprocess的getoutput()方法可以接收一个字符串的参数,这个参数会被认为是当前操作系统的命令去执行,并返回字符串类型的命令执行结果,假设命令出错,会返回相应的错误信息
# 导入json模块。实现字典数据换行输出

from subprocess import getoutput
import json

# 获取服务器硬件基础信息
def get_hardware():
    cmd_hostname = 'uname -n'
    cmd_kernel_v = 'uname -r'
    cmd_os_version = 'cat /etc/redhat-release'
    cmd_cpu = 'grep "model name" /proc/cpuinfo |uniq'

    hostname = getoutput(cmd_hostname)
    kernel_v = getoutput(cmd_kernel_v)
    os_version = getoutput(cmd_os_version)
    cpu_version = getoutput(cmd_cpu).split(': ')[1]
    return {'主机名': hostname,'内核版本': kernel_v,'操作系统版本': os_version,'CPU版本': cpu_version}

# 获取厂家和产品信息
def get_product():
    cmd_product = 'dmidecode -qt 1'
    product_info = getoutput(cmd_product).strip().split('\n\t')[1:]
    info_dict = {}
    for line in product_info:
    ¦   k ,v = line.split(":")
    ¦   if k == "Manufacturer":
    ¦   ¦   k = k+'(制造商)'
    ¦   ¦   info_dict[k] = v
    ¦   if k == "Product Name":
    ¦   ¦   k = k+'(机器型号)'
    ¦   ¦   info_dict[k] = v
    ¦   if k == "Version":
    ¦   ¦   k = k+'(机器版本)'
    ¦   ¦   info_dict[k] = v
    ¦   if k == "Serial Number":
    ¦   ¦   k = k+'(序列号)'
    ¦   ¦   info_dict[k] = v
    ¦   if k == "UUID":
    ¦   ¦   info_dict[k] = v
    ¦   if k == "Wake-up Type":
    ¦   ¦   k = k + '(唤醒方式)'
    ¦   ¦   info_dict[k]= v
    ¦   if k == "SKU Number":
    ¦   ¦   k = k + "(SKN编号)"
    ¦   ¦   info_dict[k] = v
    ¦   if k == "Family":
    ¦   ¦   k = k + "(产品家族)"
    ¦   ¦   info_dict[k] = v
    return info_dict

# 获取服务器cpu信息

# 物理cpu型号信息
def cpu_name():
    cmd = "grep 'model name' /proc/cpuinfo |uniq"
    cpu_name = getoutput(cmd).split(':')[1].strip()

# 查看物理CPU颗数
def cpu_pyc():
    cmd = "grep 'physical id' /proc/cpuinfo|sort|uniq -c |wc -l"
    cpu_pyc = getoutput(cmd)

# 查看每颗物理 CPU 的核心数
def cpu_cores_each():
    cmd = "grep 'cpu cores' /proc/cpuinfo |sort|uniq"
    cpu_cores_each = getoutput(cmd).split()[-1]

# cpu总的核心数
def cpu_cores_total():
    cmd = "grep 'model name' /proc/cpuinfo |uniq"
    cpu_name = getoutput(cmd).split(':')[1].strip()
    cmd = "grep 'physical id' /proc/cpuinfo|sort|uniq -c |wc -l"
    cpu_pyc = getoutput(cmd)
    n = int(cpu_pyc)
    cmd = "grep 'cpu cores' /proc/cpuinfo |sort|uniq"
    cpu_cores_each = getoutput(cmd).split()[-1]
    m = int(cpu_cores_each)
    p = m * n
    cpu_cores_total = str(p)
    return {"cpu版本信息": cpu_name,"物理CPU颗数": cpu_pyc,"每颗物理CPU 的核心数": cpu_cores_each,"cpu的总核心数": cpu_cores_total}

# 服务器内存信息
def get_mem():
    cmd = "dmidecode -qt 17"
    mem = getoutput(cmd).strip().split("\n\n")
    list_info = []
    for lines in mem:
    ¦   n = lines.split('\n\t')[1:]
    ¦   dict_info = {}
    ¦   for m in n:
    ¦   ¦   k, v = m.split(':')
    ¦   ¦   if k == "Size":
    ¦   ¦   ¦   k = k+"(容量)"
    ¦   ¦   ¦   dict_info[k] = v
    ¦   ¦   if k == "Locator":
    ¦   ¦   ¦   k = k+"(插槽号)"
    ¦   ¦   ¦   dict_info[k] = v
    ¦   ¦   if k == "Type":
    ¦   ¦   ¦   k = k+"(类型)"
    ¦   ¦   ¦   dict_info[k] = v
    ¦   ¦   if k == "Speed":
    ¦   ¦   ¦   k = k+"(速率)"
    ¦   ¦   ¦   dict_info[k] = v
    ¦   ¦   if k == "Manufacturer":
    ¦   ¦   ¦   k = k+"(厂商)"
    ¦   ¦   ¦   dict_info[k] = v
    ¦   ¦   if k == "Serial Number":
    ¦   ¦   ¦   k = k+"(序列号)"
    ¦   ¦   ¦   dict_info[k] = v
    ¦   list_info.append(dict_info)
    return (list_info)
# 加入下面代码,可以让这个函数库既可以本身执行,也可以被调用
def main():
    a = get_hardware()
    b = get_product()
    c = cpu_cores_total()
    d = get_mem()
    abcd = {"基础硬件信息": a,"CPU信息": b,"内核信息": c,"内存信息": d}
    print(json.dumps(abcd,ensure_ascii=False,indent=4))

# 加入下面代码,可以让这个函数库既可以本身执行,也可以被调用
if __name__ == '__main__':
    main()

注意几点

python的函数执行的时候,到了return就结束了
python的函数返回值在调用的时候,会执行一次函数体

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值