带注册登录的网站模板,linux新建网站,网站内容过滤,html基本标签这篇文章是之前几篇的一个小综合。也是通过收集主机的一些参数信息#xff0c;熟悉python里的文件读取#xff0c;字符切割#xff0c;字典存储等知识。文章结构#xff1a;(1) 文章目的#xff0c;需要收集的信息#xff0c;并逐个分析如何获取信息。(2) 给出实现的pyth…这篇文章是之前几篇的一个小综合。也是通过收集主机的一些参数信息熟悉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 pythonfile name: collect_info_a.pyfrom subprocess import Popen, PIPEdef getIfconfig():p Popen([ifconfig], stdoutPIPE, stderrPIPE)data p.stdout.read()return datadef getDmi():p Popen([dmidecode], stdoutPIPE, stderrPIPE)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_lineparsed_data.append(new_line)new_line line\n #重新保存新的一段的信息else:new_line line\nparsed_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] ipaddrreturn dicdef 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 dicgetHostName: 函数fn : 文件名参数功能 通过fn 传入文件名读取HOSTNAME 信息def getHostName(fn):with open(fn) as fd:for line in fd:if line.startswith(HOSTNAME):HostName line.split()[1].strip()breakreturn {HostName: HostName}getOSver: 函数fn : 文件名参数功能 打开fn 文件读取操作系统版本信息def getOSver(fn):with open(fn) as fd:for line in fd:osver line.strip()breakreturn {osver: osver}getCpu: 函数fn : 文件名参数功能 读取fn 文件信息读取cpu 核数和cpu 型号def getCpu(fn):num 0dic {}with open(fn) as fd:for line in fd:if line.startswith(processor):num 1if line.startswith(model name):model_name line.split(:)[1]model_name model_name.split()[0] model_name.split()[-1]dic[cpu_num] numdic[cpu_model] model_namereturn dicgetMemory: 函数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())breakmem %s % int((mem/1024.0)) Mreturn {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. 总结还是熟悉读取文件的方法 对字符切割对列表的操作等等。如果需要读取其他的主机信息再增加函数就可以了。