1、代码实现目的

注:代码可以直接粘贴使用

为了实现对主机的整体有明确的了解,实现了下面的代码功能

代码主要功能是:

  • 提取到主机的内存、硬盘、CPU、型号等信息
  • 插入到mysql的数据库中

2、代码具体实现步骤

2.1首先要先在mysql中新建数据库和数据表

新建数据库:

create database host;

新建数据表:

CREATE TABLE `host_data` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product` varchar(255) DEFAULT NULL,
`cpu_num` varchar(255) DEFAULT NULL,
`hostname` varchar(255) DEFAULT NULL,
`ip_out` varchar(255) NOT NULL DEFAULT '',
`cpu_model` varchar(255) DEFAULT NULL,
`ip_in` varchar(255) DEFAULT NULL,
`osver` varchar(255) DEFAULT NULL,
`sn` varchar(255) DEFAULT NULL,
`Memory` varchar(255) DEFAULT NULL,
`vender` varchar(255) DEFAULT NULL,
`Disk` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`,`ip_out`),
UNIQUE KEY `ip_out` (`ip_out`)
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8;

 

2.2 下面就是具体获取硬件信息的代码:

#!/usr/bin/env python
# encoding: utf-8 '''
收集主机的信息:
主机名称、IP、系统版本、服务器厂商、型号、序列号、CPU信息、内存信息
''' from subprocess import Popen, PIPE
import os, sys
import socket, fcntl, struct
from collections import namedtuple
import pymysql
import re '''获取所以磁盘信息''' disk_ntuple = namedtuple('partition', 'device mountpoint fstype')
usage_ntuple = namedtuple('usage', 'total used free percent') ''' 获取 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 '''获取磁盘总大小 格式sda[300GB]+sdb[300GB]''' def humanize_bytes(bytesize, precision=0):
abbrevs = (
(10**15, 'PB'),
(10**12, 'TB'),
(10**9, 'GB'),
(10**6, 'MB'),
(10**3, 'kB'),
(1, 'bytes')
)
if bytesize == 1:
return '1 byte'
for factor, suffix in abbrevs:
if bytesize >= factor:
break
return '%.*f%s' % (precision, round(float(bytesize) / factor), suffix) def dev_phy_size():
with open('/proc/partitions','r') as dp:
res = ''
for disk in dp.readlines():
if re.search(r'[s,h,v]d[a-z]\n',disk):
blknum = disk.strip().split(' ')[-2]
dev = disk.strip().split(' ')[-1]
size = int(blknum)*1024
consist = dev+'['+humanize_bytes(size).strip()+']'
res += consist + '+'
return {'Disk':res[:-1]} # '''获取分区路径和挂载、格式信息'''
# def disk_partitions(all=False):
# """Return all mountd partitions as a nameduple.
# If all == False return phyisical partitions only.
# """
# phydevs = []
# f = open("/proc/filesystems", "r")
# for line in f:
# if not line.startswith("nodev"):
# phydevs.append(line.strip())
#
# retlist = []
# f = open('/etc/mtab', "r")
# for line in f:
# if not all and line.startswith('none'):
# continue
# fields = line.split()
# device = fields[0]
# mountpoint = fields[1]
# fstype = fields[2]
# if not all and fstype not in phydevs:
# continue
# if device == 'none':
# device = ''
# ntuple = disk_ntuple(device, mountpoint, fstype)
# retlist.append(ntuple)
# return retlist
#
#
#
# '''获取磁盘的使用情况(总、已用、可用、百分比)'''
# def disk_usage(path):
# """Return disk usage associated with path."""
# hd = {}
# st = os.statvfs(path)
# free = (st.f_bavail * st.f_frsize)
# total = (st.f_blocks * st.f_frsize)
# used = (st.f_blocks - st.f_bfree) * st.f_frsize
# try:
# percent = ret = (float(used) / total) * 100
# except ZeroDivisionError:
# percent = 0
# hd['total'] = total
# hd['used'] = used
# hd['free'] = free
# hd['percent'] = round(percent, 1)
# return hd
#
#
# def access_disk():
# hd = {}
# disks = disk_partitions()
# for i in disks:
# d = list(i)[1]
# a_disks = disk_usage(d)
# hd["cipan"] = a_disks
# return hd ''' 根据空行分段落 返回段落列表''' 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():
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] ''' 根据输入的段落数据分析出ifconfig的每个网卡ip信息 ''' '''外网IP'''
def parseIfconfig_out(ifname):
dic = {}
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ipaddr = socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))[20:24])
dic['ip_out'] = ipaddr
return dic
'''内网IP'''
def parseIfconfig_in(ifname):
dic = {}
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ipaddr = socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))[20:24])
dic['ip_in'] = 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('\n')[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():
p = Popen(['hostname'], stdout=PIPE)
data = p.stdout.read().split('\n')[0]
return {'hostname': data} ''' 获取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 / 1024000.0) + ' GB'
return {'Memory': mem} def main():
dic = {}
data_ip = getIfconfig()
parsed_data_ip = parseData(data_ip)
ip_out = parseIfconfig_out(sys.argv[1])
ip_in = parseIfconfig_in(sys.argv[2]) data_dmi = getDmi()
parsed_data_dmi = parseData(data_dmi)
dmi = parseDmi(parsed_data_dmi) acc_disks = dev_phy_size()
# print acc_disks hostname = getHostname()
osver = getOsVersion()
cpu = getCpu()
mem = getMemory() dic.update(ip_in)
dic.update(ip_out)
dic.update(dmi)
dic.update(hostname)
dic.update(osver)
dic.update(cpu)
dic.update(mem)
dic.update(acc_disks)
return dic def db_connect():
conn = pymysql.connect(host="x.x.x.x",
db='xxxxx',
user="root",
passwd="*******",
charset="utf8")
cur = conn.cursor()
return conn,cur def save_mysql(conn, cur, dic):
k = dic.keys()
v = dic.values()
key = ",".join(k)
vs = list()
for i in v:
vs.append("'%s'" % i)
values = ",".join(vs)
# print values, k
try:
# sql = "REPLACE INTO host_data(%s) VALUES(%s)" % (key, values)
sql = "INSERT INTO host_data(%s) VALUES(%s)" % (key, values)
# print sql
cur.execute(sql)
conn.commit()
except Exception as e:
# print Exception, ": ", e
conn.rollback() if __name__ == '__main__':
conn, cur = db_connect()
dic_data = main()
save_mysql(conn, cur, dic_data)

注:

  • 脚本需要修改  db_connect() 函数的数据库信息  (db参数是数据库的库名)
  • 运行方式:python  脚本名称  外网网卡名称   内网网卡名称(因为每台机器的网卡名称不一样,所以在执行脚本的时候最好的把内外网的网卡名称以传值的形式给到脚本)
  • 比如: python host.py  eth1  eth0

python 提取linux的硬件信息的更多相关文章

  1. Linux查看硬件信息(北桥芯片组、南桥、PCI接口、CPU等)

    Linux查看硬件信息(北桥芯片组.南桥.PCI接口.CPU等) Linux查看硬件信息(北桥芯片组.南桥.PCI接口.CPU等) 查看MCH(北桥) 查看ICH(南桥) 查看CPU 查看pci接口设 ...

  2. linux查看硬件信息及驱动设备相关整理

    查看声卡设备:cat /proc/asound/cards 查看USB设备:cat /proc/bus/usb/devices 常用命令整理如下:用硬件检测程序kuduz探测新硬件:service k ...

  3. linux查看硬件信息的命令(图文)

    发布:脚本学堂/Linux命令  编辑:JB02   2013-12-23 21:48:18  [大 中 小] 转自:http://www.jbxue.com/LINUXjishu/14996.htm ...

  4. Linux查看硬件信息,主板型号及内存硬件,驱动设备,查看设备,查看CPU。

    用硬件检测程序kuduz探测新硬件:service kudzu start ( or restart) 查看CPU信息:cat /proc/cpuinfo 查看板卡信息:cat /proc/pci 查 ...

  5. Linux查看硬件信息命令

    一.查看服务器硬件信息 (1)查看服务器型号.序列号 [root@Master ~]# dmidecode|grep "System Information" -A9|egrep  ...

  6. linux查看硬件信息的方法

    目前会Linux的人不少,但是精通的不多,怎样才能做一个符合企业需求的Linux人才,首先要有良好的Linux基础知识.本文为你讲解Linux的知识,今天所讲的是 Linux硬件信息怎样查看,希望你能 ...

  7. [转载]查看Linux系统硬件信息实例详解

    linux查看系统的硬件信息,并不像windows那么直观,这里我罗列了查看系统信息的实用命令,并做了分类,实例解说. cpu lscpu命令,查看的是cpu的统计信息. blue@blue-pc:~ ...

  8. linux查询硬件信息

    硬件信息查询 sudo dmidecode -t baseboard

  9. 使用 python 获取 Linux 的 IP 信息(通过 ifconfig 命令)

    我们可以使用 python 代码通过调用 ifconfig 命令来获取 Linux 主机的 IP 相关信息,包括:网卡名称.MAC地址.IP地址等. 第一种实现方式: #!/usr/bin/pytho ...

随机推荐

  1. 通过Function Score Query优化Elasticsearch搜索结果(综合排序)

    在使用 Elasticsearch 进行全文搜索时,搜索结果默认会以文档的相关度进行排序,如果想要改变默认的排序规则,也可以通过sort指定一个或多个排序字段. 但是使用sort排序过于绝对,它会直接 ...

  2. Swift5 语言指南(八) 函数

    函数是执行特定任务的自包含代码块.您为函数指定了一个标识其功能的名称,此名称用于“调用”函数以在需要时执行其任务. Swift的统一函数语法足够灵活,可以表达从没有参数名称的简单C风格函数到具有每个参 ...

  3. Spring boot 参数相关注解

    最近使用swagger的在线文档调试接口时发现老是报参数问题,最后发现是方法中参数上的注解有问题,今天把填的坑做一下总结. 1. RequestParam 该注解有两个属性: name/value:表 ...

  4. interface中定义default方法和static方法

    interface的default方法和static方法 接口中可以定义static方法,可通过接口名称.方法名()调用,实现类不能继承static方法: 接口中可以定义default方法,defau ...

  5. 转载 Python 正则表达式入门(中级篇)

    Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...

  6. Servlet-转发和重定向的区别

    实际发生位置不同,地址栏不同 转发是发生在服务器上的 转发是由服务器进行跳转的,细心的朋友会发现,在转发的时候,浏览器的地址栏是没有发生变化的,在我访问Servlet111的时候,即使跳转到了Serv ...

  7. HTML页面自动跳转,windows操作

    1) html的实现 <head> <!-- 以下方式只是刷新不跳转到其他页面 --> <meta http-equiv="refresh" cont ...

  8. Linux编程 6 (查看进程 ps 及输出风格)

    一.查看进程命令ps 1.1 默认ps 命令 在默认情况下,ps命令只会显示运行在当前控制台下,属于当前用户的进程,在上图中,我们只运行了bash shell以及ps命令本身. 上图中显示了程序的进程 ...

  9. ubuntu16.04 程序开机自启动设置及启动优化

    使用过程中,为了方便使用,有一些程序需要开机时自启动应用,下面将介绍一下ubuntu16.04下程序的开机自启动设置方法. 1  建立一个可执行程序的运行脚本如 keepalive.sh.内部写入要执 ...

  10. Percona Toolkit mysql辅助利器

    1 PT介绍 Percona Toolkit简称pt工具—PT-Tools,是Percona公司开发用于管理MySQL的工具,功能包括检查主从复制的数据一致性.检查重复索引.定位IO占用高的表文件.在 ...