设为首页 收藏本站
查看: 4215|回复: 1

[经验分享] python 获取Dmidecode 输出的系统硬件信息

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-10-25 11:13:48 | 显示全部楼层 |阅读模式
目的:
熟悉利用python 分析文本的信息。分析的文件信息是通过dmidecode 工具抓取的系统硬件信息。

本文结构:
(1) 分析dmidecode 工具的输出信息结构
(2) 分别用两种方式对dmidecode 输出的信息实现抓取,获取Manufacturer、Product Name和 Serial Number.


  • dmidecode 输出信息分析

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

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

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

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

wKioL1gML_iAZ4a1AACCgFRxaPc693.jpg

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

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




暂时,先看这部分的输出结果:
wKiom1gMPg-RcZnEAABO-RxcTHo701.jpg
如图,输出的列表,最好能将它变成字典保存,变成字典的形式就很方便输出了。转换成字典时,需要将每个元素头尾的'\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



最后,验证结果:
wKioL1gMQ3PiuUh5AAA0TLFjVeE740.jpg
如图,已经将需要的三个数据保存到字典里了。


版本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()




执行脚本,先验证一下,输出的结果是什么样子的:
wKioL1gMYqfQMitvAACqFQYs0Ns550.jpg
如图,列表的每一个元素就是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)



看结果:
wKiom1gMa7rjZ3XHAAA01GYIDLI613.jpg

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-291062-1-1.html 上篇帖子: python redis使用 下篇帖子: python paramiko python 信息 硬件
累计签到:144 天
连续签到:1 天
发表于 2016-10-29 09:19:01 | 显示全部楼层
谢谢分享

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表