日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python是什么牌子主机_python 收集主机信息

發布時間:2023/12/3 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 收集主机信息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。