php执行dmidecode,python 获取Dmidecode 输出的系统硬件信息

目的:

熟悉利用python 分析文本的信息。分析的文件信息是通过dmidecode 工具抓取的系统硬件信息。

本文结构:

(1) 分析dmidecode 工具的输出信息结构

(2) 分别用两种方式对dmidecode 输出的信息实现抓取,获取Manufacturer、Product Name和 Serial Number.

dmidecode 输出信息分析  dmidecode 是系统的工具,如果没有安装,需要先安装。在我的机器上的Dmidecode 版本:

302bad67f9dda864b7616bad5169f95e.gif

wKioL1gMK7zTKHLHAAAPVo-SFfc501.jpg (9.5 KB, 下载次数: 11)

2016-10-25 11:13 上传

安装的方式也很简单,用命令:yum  install -y  dmidecode 即可。

Dmidecode 工具主要是将系统的DMI数据库的信息进行解码,并以可读的信息显示。输出的信息包括了BIOS、系统、主板、处理器、内存、缓存、序列号、产品名称和厂家信息等。DMI就是收集系统信息的管理系统,它遵循SMBOIS协议,是主板制造商需严格遵守的协议。

dmidecode 输出的信息比较多,一屏并不能显示完整,只能用"dmidecode| less" 处理一下:

302bad67f9dda864b7616bad5169f95e.gif

wKioL1gML_iAZ4a1AACCgFRxaPc693.jpg (39.45 KB, 下载次数: 13)

2016-10-25 11:13 上传

这篇文章需要处理收集的信息在"System Information" 这部分:

302bad67f9dda864b7616bad5169f95e.gif

wKiom1gML_ihjR8tAACy9KioQk8623.jpg (51.73 KB, 下载次数: 9)

2016-10-25 11:13 上传

2. 方法实现

回到这篇文章讨论的目的,python 的实现方式就是:

(1) 执行命令"dmidecode" ,将它的输出信息读出并保存。使用python 的subprocess 模块。

(2) 然后遍历文本。

根据遍历文本的方式,给出两个实现的版本:

版本1:对dmidecode 信息整体保存,然后逐行遍历

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25#!/usr/bin/env  python

"""

file_name: dmi.py

"""

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:

if line  != ‘\n’:  #在"System Information" 里遍历

lines.append(line)

else:

break   #如果到了"System Information" 的换行,则退出while 循环

print  lines

暂时,先看这部分的输出结果:

302bad67f9dda864b7616bad5169f95e.gif

wKiom1gMPg-RcZnEAABO-RxcTHo701.jpg (26.33 KB, 下载次数: 10)

2016-10-25 11:13 上传

如图,输出的列表,最好能将它变成字典保存,变成字典的形式就很方便输出了。转换成字典时,需要将每个元素头尾的'\t'和'\n'去除,然后按":"符号分割,分别就是字典的key 和value了。继续完善上面的脚本,为了完整性,脚本还是会从开始给出:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43#!/usr/bin/env  python

"""

file_name: dmi.py

"""

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:

if line  != ‘\n’:  #在"System Information" 里遍历

lines.append(line)

else:

break   #如果到了"System Information" 的换行,则退出while 循环

#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 前的空格去除"""

for   k,  v  in  dmi_dic.items():

dmi_dic[k]  = v.strip()

"""最后找到需要的Manufacturer、Product Name和 Serial Number的值"""

dmi = {}

dmi['Manufacturer']  =  dmi_dic['Manufacturer']

dmi['Product Name']  =  dmi_dic['Product Name']

dmi['Serial Number'] =  dmi_dic['Serial Number']

print  dmi

最后,验证结果:

302bad67f9dda864b7616bad5169f95e.gif

wKioL1gMQ3PiuUh5AAA0TLFjVeE740.jpg (19.5 KB, 下载次数: 9)

2016-10-25 11:13 上传

如图,已经将需要的三个数据保存到字典里了。

版本2:对dmidecode 信息整体进行分割,然后以列表的形式进行分析

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16#!/usr/bin/env  python

"""

file_name: dmi_t.py

"""

from subprocess import Popen, PIPE

def  getData():

p = Popen(['dmidecode'], stdout=PIPE, stderr=PIPE)

data = p.stdout.read().split()

return data

if  __name__ == '__main__':

print getData()

执行脚本,先验证一下,输出的结果是什么样子的:

302bad67f9dda864b7616bad5169f95e.gif

wKioL1gMYqfQMitvAACqFQYs0Ns550.jpg (50.16 KB, 下载次数: 10)

2016-10-25 11:13 上传

如图,列表的每一个元素就是dmidecode 的每一行,在上图找到了"System Information" 的这一行。"System Information\n" 的下一行是以'\t'开头的,对应就是原来dmidecode 的缩进的空格。再一直往下看,就会找到'\n'它对应着"System Information"结束后的换行。接着看到'Handle 0x0002...' 这是新的一段信息了。那么,抓取信息就可以用'\t'作为判断了。

这里有一个判断的技巧要说明一下,例如: 如果a='wedf', 则not a.strip() 返回的是False. 如果a='\n' , 那么not a.strip() 就返回True. 也就是说,字符串进行strip() 方法后,如果还是空字符则not a.strip() 就返回True,如果不为空,则not a.strip() 返回False. 现在继续完善脚本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43#!/usr/bin/env  python

"""

file_name: dmi_t.py

"""

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)

看结果:

302bad67f9dda864b7616bad5169f95e.gif

wKiom1gMa7rjZ3XHAAA01GYIDLI613.jpg (19.72 KB, 下载次数: 14)

2016-10-25 11:13 上传

总结:

熟悉利用python 脚本对字符文本信息的处理方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值