用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的函数返回值在调用的时候,会执行一次函数体