使用python收集獲取Linux系統主機資訊

程式猿肖邦發表於2016-12-13

使用 python 程式碼收集主機的系統資訊,主要:主機名稱、IP、系統版本、伺服器廠商、型號、序列號、CPU資訊、記憶體等系統資訊。

#!/usr/bin/env python
#encoding: utf-8

```
收集主機的資訊:
主機名稱、IP、系統版本、伺服器廠商、型號、序列號、CPU資訊、記憶體資訊
```

from subprocess import Popen, PIPE
import os,sys

``` 獲取 ifconfig 命令的輸出 ```
def getIfconfig():
    p = Popen([`ifconfig`], stdout = PIPE)
    data = p.stdout.read()
    return data

``` 獲取 dmidecode 命令的輸出 ```
def getDmi():
    p = Popen([`dmidecode`], stdout = PIPE)
    data = p.stdout.read()
    return data

``` 根據空行分段落 返回段落列表```
def parseData(data):
    parsed_data = []
    new_line = ``
    data = [i for i in data.split(`
`) if i]
    for line in data:
        if line[0].strip():
            parsed_data.append(new_line)
            new_line = line + `
`
        else:
            new_line += line + `
`
    parsed_data.append(new_line)
    return [i for i in parsed_data if i]

``` 根據輸入的段落資料分析出ifconfig的每個網路卡ip資訊 ```
def parseIfconfig(parsed_data):
    dic = {}
    parsed_data = [i for i in parsed_data if not i.startswith(`lo`)]
    for lines in parsed_data:
        line_list = lines.split(`
`)
        devname = line_list[0].split()[0]
        macaddr = line_list[0].split()[-1]
        ipaddr  = line_list[1].split()[1].split(`:`)[1]
        break
    dic[`ip`] = ipaddr
    return dic

``` 根據輸入的dmi段落資料 分析出指定引數 ```
def parseDmi(parsed_data):
    dic = {}
    parsed_data = [i for i in parsed_data if i.startswith(`System Information`)]
    parsed_data = [i for i in parsed_data[0].split(`
`)[1:] if i]
    dmi_dic = dict([i.strip().split(`:`) for i in parsed_data])
    dic[`vender`] = dmi_dic[`Manufacturer`].strip()
    dic[`product`] = dmi_dic[`Product Name`].strip()
    dic[`sn`] = dmi_dic[`Serial Number`].strip()
    return dic

``` 獲取Linux系統主機名稱 ```
def getHostname():
    with open(`/etc/sysconfig/network`) as fd:
        for line in fd:
            if line.startswith(`HOSTNAME`):
                hostname = line.split(`=`)[1].strip()
                break
    return {`hostname`:hostname}

``` 獲取Linux系統的版本資訊 ```
def getOsVersion():
    with open(`/etc/issue`) as fd:
        for line in fd:
            osver = line.strip()
            break
    return {`osver`:osver}

``` 獲取CPU的型號和CPU的核心數 ```
def getCpu():
    num = 0
    with open(`/proc/cpuinfo`) as fd:
        for line in fd:
            if line.startswith(`processor`):
                num += 1
            if line.startswith(`model name`):
                cpu_model = line.split(`:`)[1].strip().split()
                cpu_model = cpu_model[0] + ` ` + cpu_model[2]  + ` ` + cpu_model[-1]
    return {`cpu_num`:num, `cpu_model`:cpu_model}

``` 獲取Linux系統的總實體記憶體 ```
def getMemory():
    with open(`/proc/meminfo`) as fd:
        for line in fd:
            if line.startswith(`MemTotal`):
                mem = int(line.split()[1].strip())
                break
    mem = `%.f` % (mem / 1024.0) + ` MB`
    return {`Memory`:mem}

if __name__ == `__main__`:
    dic = {}
    data_ip = getIfconfig()
    parsed_data_ip = parseData(data_ip)
    ip = parseIfconfig(parsed_data_ip)
    
    data_dmi = getDmi()
    parsed_data_dmi = parseData(data_dmi)
    dmi = parseDmi(parsed_data_dmi)

    hostname = getHostname()
    osver = getOsVersion()
    cpu = getCpu()
    mem = getMemory()
    
    dic.update(ip)
    dic.update(dmi)
    dic.update(hostname)
    dic.update(osver)
    dic.update(cpu)
    dic.update(mem)

    ``` 將獲取到的所有資料資訊並按簡單格式對齊顯示 ```
    for k,v in dic.items():
        print `%-10s:%s` % (k, v)

 

 

實驗測試結果:

product   :VMware Virtual Platform
osver     :CentOS release 6.4 (Final)
sn        :VMware-56 4d b4 6c 05 e5 20 dc-c6 49 0c e1 e0 18 1c 75
Memory    :1870 MB
cpu_num   :2
ip        :192.168.0.8
vender    :VMware, Inc.
hostname  :vip
cpu_model :Intel(R) i7-4710MQ 2.50GHz

 


相關文章