python 获取Dmidecode 输出的系统硬件信息

目的:

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

本文结构:

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

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

  1. dmidecode 输出信息分析

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

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

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

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

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

2. 方法实现

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

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

(2) 然后遍历文本。

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

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

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

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

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

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

最后,验证结果:

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

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

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

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

如图,列表的每一个元素就是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. 现在继续完善脚本:

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

看结果:

总结:

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

时间: 2024-10-10 22:37:42

python 获取Dmidecode 输出的系统硬件信息的相关文章

Linux 查看系统硬件信息(实例详解)

cpu lscpu命令,查看的是cpu的统计信息. [email protected]:~$ lscpu Architecture: i686 #cpu架构 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian #小尾序 CPU(s): 4 #总共有4核 On-line CPU(s) list: 0-3 Thread(s) per core: 1 #每个cpu核,只能支持一个线程,即不支持超线程 Core(s) per socket:

Linux系统硬件信息

对于linux系统硬件信息的查看,主要针对cpu.memory.disk,以及网卡,每一种硬件的信息通常会有多种查看方法. 1.cpu 查看/proc/cpuinfo文件 可查看cpu的详细信息. [[email protected]_server ~]# cat /proc/cpuinfo  vendor_id : GenuineIntel cpu family : 15 model : 4 model name : Intel(R) Xeon(TM) CPU 2.80GHz stepping

JavaScript获取客户端计算机硬件及系统等信息的方法

JavaScript获取客户端计算机硬件及系统等信息的方法 JavaScript 获取客户端计算机硬件及系统信息 通过WMI来实现获取客户端计算机硬件及系统信息: function getSysInfo(){ var locator = new ActiveXObject ("WbemScripting.SWbemLocator"); var service = locator.ConnectServer("."); //CPU信息 var cpu = new En

获取设备上所有系统app信息

在获取android设备的所有程序信息一文中介绍了获取手机上所有app信息的方法,下面介绍过滤掉系统app的方法: MainActivity: package com.home.getsysapp; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.content

利用CMD查看系统硬件信息

利用CMD查看系统硬件信息对于在windows下查看系统信息大家一定不陌生了,我现在说几个最常用的方法,对命令感兴趣的朋友看看,(给菜鸟看的,老手就不要笑话我了,大家都是从那个时候过来的,^_^).一.图新Shell下:1. 最直观的:(在运行里面输入CMD,以下命令都是在CMD下输入的:)输入 sysdm.cpl, 系统属性. 2. 输入dxdiag 3.输入 start msinfo32,winmsd系统信息 3. 输入 devmgmt.msc,设备管理: 4. 输入 taskmgr (或按

(转)IBM AIX系统硬件信息查看命令(shell脚本)

IBM AIX系统硬件信息查看命令(shell脚本) 原文:http://blog.itpub.net/22085031/viewspace-1054015/ 查看IBM AIX系统的主机型号.序列号.CPU.内存.硬盘.网卡.网卡物理插槽位置信息.是否配置以太网通道.网卡链路状态.当前网络速率.HBA卡.HBA卡物理插槽位置信息.HBA卡WWN.HBA卡支持速率.HBA卡当前速率.VG.PV.LV信息.该主机当前由哪台HMC管理.配置了多少磁带机驱动器tape driver等信息,可以通过一段

Linux 查看系统硬件信息

下面介绍下在centos下硬件信息的查看,在Linux下查看需要用到各种命令,不像Windows上可以非常直观地看到. 查看所有硬件的信息 1)dmidecode 2)dmesg Dmidecode 这款软件允许你在 Linux 系统下获取有关硬件方面的信息.Dmidecode 遵循 SMBIOS/DMI 标准,其输出的信息包括 BIOS.系统.主板.处理器.内存.缓存等等. 一般很少用这两个命令直接查看,因为这两个命令输出的信息非常多.一般会使用管道过滤出多需要的信息进行查看或通过-t选择指定

Linux 查看系统硬件信息[转]

原文:http://www.cnblogs.com/ggjucheng/archive/2013/01/14/2859613.html linux查看系统的硬件信息,并不像windows那么直观,这里我罗列了查看系统信息的实用命令,并做了分类,实例解说. cpu lscpu命令,查看的是cpu的统计信息. [email protected]:~$ lscpu Architecture: i686 #cpu架构 CPU op-mode(s): 32-bit, 64-bit Byte Order:

Python获取Linux或Windows系统的基本信息

前段时间写了一篇博文名为<利用Python脚本获取Windows和Linux的系统版本信息>,本篇博文利用这篇文章中的知识提供一个增强版本的获取信息的Python脚本.执行后,看起来就像登录Ubuntu Linux系统时提示的motd信息一样,可以看到: 系统的类型.发行版本(具体信息).内核版本等 当前系统的时间.时区 系统每一个CPU核心的负载和CPU整体负载 进程数量 根分区的磁盘空间,Windows下默认C盘 登录的用户总数和每一个登录到系统的用户的信息 内存和交换分区的利用率 默认网