1 Dmidecode综述:

  • 1、通过 dmidecode 命令可以获取到 Linux 系统的包括 BIOS、 CPU、内存等系统的硬件信息,这里使用 python 代码来通过调用 dmidecode 命令来获取 Linux 必要的系统信息,更多的信息都可以通过这种方式去获取。
  • 2、Dmidecode 工具主要是将系统的DMI数据库的信息进行解码,并以可读的信息显示。输出的信息包括了BIOS、系统、主板、处理器、内存、缓存、序列号、产品名称和厂家信息等。DMI就是收集系统信息的管理系统,它遵循SMBOIS协议,是主板制造商需严格遵守的协议。
  • 3、安装的方式也很简单,用命令:yum  install -y  dmidecode 即可。

Dmidecode系统信息_ide

2 使用dmidecode 输出的信息实现抓取,获取Manufacturer、Product Name和 Serial Number。这里多说两句,对于输出的参数,通过一定的方式进行抓取,然后过滤,其实适合很多场景。

2.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

Dmidecode系统信息_python_02

2.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

Dmidecode系统信息_ide_03

3 上述的功能已经实现了,为了代码的规整性,使用模块化的方式实现

#!/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)