python是什么牌子主机_python 收集主机信息
這篇文章是之前幾篇的一個小綜合。也是通過收集主機的一些參數信息,熟悉python里的文件讀取,字符切割,字典存儲等知識。
文章結構:
(1) 文章目的,需要收集的信息,并逐個分析如何獲取信息。
(2) 給出實現的python 腳本。
(3) 總結。
1. 目的
用python 腳本實現收集主機信息:
(1)主機名(hostname).
當然了,在命令行下,直接使用"hostname" 命令就可以直接輸出本機的hostname了。但是我們現在用python 一般是用讀取文件的方式獲取信息。主機的hostname 在"/etc/sysconfig/network" 文件里。
(2)ip地址.
要求收集第一塊網卡的信息,網名,ip地址。在"ifconfig"命令的輸出里,獲取信息。前面有一篇博客已經介紹過具體的方法。
(3)操作系統版本,osver.
在"/etc/issue" 文件里有系統操作版本號的信息:
我們只需要將第一行的信息取出來就可以了。
(4)服務器廠商(vender)、服務器型號(product)和服務器序列號(sn).前面有一篇介紹收集dmidecode 信息的博客園,已經具體分析過。
(5)cpu型號(cpu_model)和cpu核數(cpu_num).
在"/proc/cpuinfo" 文件里可以獲取,一般是一個"process" 就是一個cpu 核,所以通過統計"process" 字段就可以統計cpu 核數了。cpu型號,就是"cpu model" 了。如下:
做實驗的機器,只有一個cpu 核數,所以"process" 字段就只有一個字段。通常cpu型號,"model name",只需統計型號和主頻。
(6)內存大小.
在"/proc/meminfo" 文件的,"MemTotal" 就是內存的大小,統計的時候按實際將單位轉換一下就可以了。
2. 實現方法
先對ip 信息和dmidecode 信息進行處理,因為這兩個信息在前面的博客都已經實現過了,比較容易。首先,就是讀取"ifconfig" 和 "dmidecode" 命令的輸出,然后分割保存成一個列表,再對列表進行分析。它們倆的分析過程基本一樣,就一起給出:
#!/usr/bin/env??python
"""
file?name:?collect_info_a.py
"""
from??subprocess??import??Popen,?PIPE
def??getIfconfig():
p?=?Popen(['ifconfig'],?stdout=PIPE,?stderr=PIPE)
data?=?p.stdout.read()
return?data
def??getDmi():
p?=?Popen(['dmidecode'],?stdout=PIPE,?stderr=PIPE)
data?=?p.stdout.read()
return?data
"""
從getIfconfig()?和getDmi()?函數返回的都是一個字符串。下面再定義一個
parseData(data)?的函數,將字符串分割成一個列表,每遇到頂格的行,就是
新的一段信息.
"""
def??parseData(data):
parsed_data?=?[]
new_line?=?''
data?=?[i?for?i?in?data.split('\n')??if?i]?#將字符串分割,去掉空行的元素
for??line??in?data:
if??line[0].strip():??#當遇到頂格的行,就把new_line?保存的上一段信息,append?到parsed_line
parsed_data.append(new_line)
new_line?=?line+'\n'??#重新保存新的一段的信息
else:
new_line?+=?line+'\n'
parsed_data.append(new_line)
return?[i?for?i?in?parsed_data?if?i]??#去掉空行的元素
"""
parseData(data)?函數返回的就是一個處理過的列表,將收集到的ip?字符串信息和?dmidecode?字符串信息,交給
下面定義的parseIfconfig()?和parseDmi()?函數分別處理,返回ip?信息的字典,和dmidecode?信息的字典。
"""
def??parseIfconfig(parsed_data):
parsed_data?=?[i?for?parsed_data?if?i?and??not?i.startswith('lo')]??#將"lo"?網卡的信息去掉
dic?=?{}
for?lines?in?parsed_data:
devname?=?lines.split('\n')[0].split()[0]
macaddr?=?lines.split('\n')[0].split()[-1]
ipaddr??=?lines.split('\n')[1].split()[1].split(':')[1]
break???#由于只需要第一張網卡的信息,所以這里就可以退出循環了
dic['ip']?=?ipaddr
return?dic
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('\n')[1:]?if?i?]
parsed_data?=?[i.strip().split(':')?for?i?in?parsed_data?if?i]
dmi_dic?=?dict(parsed_data)
dic?=?{}
dic['vender']?=?dmi_dic['Manufacturer'].strip()
dic['product']?=?dmi_dic['Product?Name'].strip()
dic['sn']??=?dmi_dic['Serial?Number'].strip()
return?dic
"""
getHostName:?函數
fn?:?文件名參數
功能:?通過fn?傳入文件名,讀取HOSTNAME?信息
"""
def?getHostName(fn):
with?open(fn)?as?fd:
for?line?in?fd:
if?line.startswith('HOSTNAME'):
HostName?=?line.split('=')[1].strip()
break
return?{'HostName':?HostName}
"""
getOSver:?函數
fn?:?文件名參數
功能:?打開fn 文件,讀取操作系統版本信息
"""
def??getOSver(fn):
with?open(fn)?as?fd:
for?line?in?fd:
osver?=?line.strip()
break
return?{'osver':?osver}
"""
getCpu:?函數
fn?:?文件名參數
功能:?讀取fn?文件信息,讀取cpu?核數和cpu?型號
"""
def?getCpu(fn):
num?=?0
dic?=?{}
with?open(fn)?as?fd:
for?line?in?fd:
if?line.startswith('processor'):
num?+=?1
if?line.startswith('model?name'):
model_name?=?line.split(':')[1]
model_name?=?model_name.split()[0]?+?'?'?+?model_name.split()[-1]
dic['cpu_num']?=?num
dic['cpu_model']?=?model_name
return?dic
"""
getMemory:?函數
fn?:?文件名參數
功能:?打開fn?文件,讀取系統MemTotal?數值
"""
def??getMemory(fn):
with?open(fn)?as?fd:
for?line?in?fd:
if?line.startswith('MemTotal'):
mem?=?int(line.split()[1].strip())
break
mem?=?'%s'?%?int((mem/1024.0))?+'M'
return?{'Memory':?mem}
if??__name__?==?'__main__':
data_ip?=?getIfconfig()
parsed_data_ip?=?parseData(data_ip)
ip?=?parseIfconfig(parsed_data_ip)
data_dmi?=?getDmi()
parsed_data_dmi?=?parseData(data_dmi)
dmi?=?prseDmi(parsed_data_dmi)
HostName?=?getHostName('/etc/sysconfig/network')
osver?=?getOSver('/etc/issue')
cpu?=?getCpu('/proc/cpuinfo')
mem?=?getMemory('/proc/meminfo')
dic?=?{}?#定義空字典,上面收集到的主機信息都是字典形式的,就是為了現在能將它們update?在一個字典
dic.update(ip)
dic.update(dmi)
dic.update(HostName)
dic.update(osver)
dic.update(cpu)
dic.update(mem)
print?dic
測試一下結果:
在字典里保存了,文章開頭列出所需的9個主機信息。
3. 總結:
還是熟悉讀取文件的方法: 對字符切割,對列表的操作等等。如果需要讀取其他的主機信息,再增加函數就可以了。
總結
以上是生活随笔為你收集整理的python是什么牌子主机_python 收集主机信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle安装卡在create inv
- 下一篇: python内置属性类_Python内置