本文主要是介绍【Python收集系统信息】 Dmidecode系统信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、 Dmidecode综述:
1、通过 dmidecode 命令可以获取到 Linux 系统的包括 BIOS、 CPU、内存等系统的硬件信息,这里使用 python 代码来通过调用 dmidecode 命令来获取 Linux 必要的系统信息,更多的信息都可以通过这种方式去获取。
2、Dmidecode 工具主要是将系统的DMI数据库的信息进行解码,并以可读的信息显示。输出的信息包括了BIOS、系统、主板、处理器、内存、缓存、序列号、产品名称和厂家信息等。DMI就是收集系统信息的管理系统,它遵循SMBOIS协议,是主板制造商需严格遵守的协议。
3、安装的方式也很简单,用命令:yum install -y dmidecode 即可。
二、使用dmidecode 输出的信息实现抓取,获取Manufacturer、Product Name和 Serial Number。这里多说两句,对于输出的参数,通过一定的方式进行抓取,然后过滤,其实适合很多场景。
(1)对dmidecode 中以System Information开头的信息整体保存,然后逐行遍历。
#!/usr/bin/python
from subprocess import Popen,PIPE
p = Popen(['dmidecode'],stdout=PIPE,stderr=PIPE)
line_in = False
lines =[]
dmi_dic={}while True:
line = p.stdout.readline() #逐行遍历
if line.startswith('System Information'): #找到"System Information" 的开始
line_in =True
continue
if line_in: #在"System Information" 里遍历
if line != '\n':
lines.append(line)
else:
break #如果到了"System Information" 的换行,则退出while 循环print lines
(2)如上图,输出的列表,最好能将它变成字典保存,变成字典的形式就很方便输出了。
转换成字典时,需要将每个元素头尾的'\t'和'\n'去除,然后按":"符号分割,分别就是字典的key 和value了。
继续完善上面的脚本:
#!/usr/bin/python
from subprocess import Popen,PIPE
p = Popen(['dmidecode'],stdout=PIPE,stderr=PIPE)
line_in = False
lines =[]
dmi_dic={}while True:
line = p.stdout.readline()
if line.startswith('System Information'):
line_in =True
continue
if line_in:
if line != '\n':
lines.append(line)
else:
break#print lines
"""
这里用到列表生成式,遍历lines, 对元素i 去除头尾的'\t'和'\n',然后以‘:’分割,得到两个元素的列表,
对于[['a', '1'], ['b', '2']]这种形式的列表,用dict()方法就可以构造出一个字典,如下:
dmi_dic = dict([i.strip().split(':') for i in lines ])
现在的dmi_dic 字典已经很接近最终的结果了,但是它的每个value 的最前面还带有空格,所以还需要将value 前的空格去除"""dmi_dic = dict([i.strip().split(':') for i in lines])
for k,v in dmi_dic.items():
dmi_dic[k] = v.strip()dmi ={}
dmi['Manufacturer'] = dmi_dic['Manufacturer']print dmi
三、上述的功能已经实现了,为了代码的规整性,使用模块化的方式实现
#!/usr/bin/env python
from subprocess import Popen, PIPE
def getData():
p = Popen(['dmidecode'], stdout=PIPE, stderr=PIPE)
data = p.stdout.read().split()
return data
def parseData(data):
line_in = False
lines = []
for line in data:
if line.starswith('System Information'):
line_in = True
continue
if line_in:
if not line.strip(): #如果遍历到空行,即新的一段信息前,则可以退出循环了
break
else:
lines.append(line)
def getDmi(lines):
dmi_dic = {}
dmi = {}
dmi_dic = dict([i.strip().split(":") for i in lines ])
for k, v in dmi_dic.items():
dmi_dic[k] = v.strip()
dmi['Manufacturer'] = dmi_dic['Manufacturer']
dmi['Product Name'] = dmi_dic['Product Name']
dmi['Serial Number'] = dmi_dic['Serial Number']
return dmi
if __name__ == '__main__':
data = getData()
lines = parseData(data)
print getDmi(lines)
这篇关于【Python收集系统信息】 Dmidecode系统信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!