一、系统基础信息模块(cpu,内存,ip,dns)模块
1、系统性能信息模块psutil
a、(cpu信息)
# yum -y install python-devel
# wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz --no-check-certificate
# tar -zxvf psutil-2.0.0.tar.gz
# cd psutil-2.0.0.tar.gz
# python setup.py install
# python
>>> import psutil
>>> psutil.cpu_times() # 使用cpu_times方法获取cpu完整信息,需要显示所有逻辑cpu信息指定变量percpu=True
>>> psutil.cpu_times(percpu=True)
>>> psutil.cpu_times().user #获取单项数据信息,如用户user的CPU时间比
>>> psutil.cpu_count() #获取CPU的逻辑个数,默认logical=True4
2
>>> psutil.cpu_count(logical=False) #获取CPU的物理个数
1
b、(内存信息)
>>> psutil.virtual_memory()
>>> psutil.virtual_memory().total
1036869632L
>>> psutil.virtual_memory().free
177897472L
>>> psutil.swap_memory()
c、(磁盘信息)
>>> psutil.disk_partitions() #获取磁盘的完整信息
>>> psutil.disk_usage(‘/‘) #使用psutil.disk_usage方法获取分区(参数)的使用情况
>>> psutil.disk_io_counters() #获取磁盘IO个数、读写信息
>>> psutil.disk_io_counters(perdisk=True) #"perdisk=True"参数获取单个分区IO个数、读写信息
>>> psutil.net_io_counters(pernic=True) # pernic=True 输出每个网络接口的IO信息
>>> psutil.users() #返回当前登陆系统用户信息
>>> import psutil, datetime
>>> psutil.boot_time() #获取开机时间,以linux时间戳格式返回
1450153735.0
>>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y%m%d%H%M%S") #转换成自然时间格式
‘20151215122855‘
2、系统进程管理方法
a、(进程信息)
>>> import psutil
>>> psutil.pids() #列出所有进程PID
>>> psutil.Process(2156).name() #实例化一个Process对象,参数为一进程PID,进程名
‘nginx‘
>>> psutil.Process(2156).exe() # 进程bin路径
‘/usr/sbin/nginx‘
>>> psutil.Process(2156).cwd() # 进程工作目录绝对路径
‘/‘
>>> psutil.Process(2156).status() # 进程状态
‘sleeping‘
>>> psutil.Process(2156).create_time() #进程创建时间,时间戳格式
1450167098.7
>>> psutil.Process(2156).uids() #进程uid信息
>>> psutil.Process(2156).gids()
>>> psutil.Process(2156).cpu_times()
>>> psutil.Process(2156).cpu_affinity()
>>> psutil.Process(2156).memory_percent() #进程内存利用率
0.46100607564133966
>>> psutil.Process(2156).memory_info()
>>> psutil.Process(2156).io_counters() #进程IO信息
>>> psutil.Process(2156).connections()
>>> psutil.Process(2156).num_threads() #进程开启的线程数
3、ip地址处理模块IPy
# wget https://pypi.python.org/packages/source/I/IPy/IPy-0.81.tar.gz --no-check-certificate
# tar -zxvf IPy-0.81.tar.gz
# cd IPy-0.81
# python setup.py install
通过指定网段输出该网段的Ip个数及所有ip地址清单
>>> from IPy import IP
>>> ip = IP(‘192.168.0.0/16‘)
>>> print ip.len()
>>> for x in ip:
>>> print x
#反向解析地址格式
>>> ip = IP(‘192.168.1.20‘)
>>> ip .reverseName()
‘20.1.168.192.in-addr.arpa.‘
#根据ip与掩码计算出网段
>>> from IPy import IP
>>> print(IP(‘192.168.1.11‘).make_net(‘255.255.255.0‘))
192.168.1.0/24
>>> print(IP(‘192.168.1.11/255.255.255.0‘,make_net=True))
192.168.1.0/24
>>> print(IP(‘192.168.1.11/24‘,make_net=True))
192.168.1.0/24
>>> print(IP(‘192.168.1.0-192.168.1.255‘,make_net=True))
192.168.1.0/24
#通过strNormal方法指定不同wantprefixlen参数值以定制不同输出类型的网段
>>> IP(‘192.168.1.0/24‘).strNormal(0) #wantprefixlen = 0 无返回
‘192.168.1.0‘
>>> IP(‘192.168.1.0/24‘).strNormal(1) #wantprefixlen = 1 prefix格式
‘192.168.1.0/24‘
>>> IP(‘192.168.1.0/24‘).strNormal(2) #wantprefixlen = 2 decimalnetmask格式
‘192.168.1.0/255.255.255.0‘
>>> IP(‘192.168.1.0/24‘).strNormal(3) #wantprefixlen = 3 lastIP格式
‘192.168.1.0-192.168.1.255‘
#多网络比较/计算方法详解
>>> IP(‘10.0.0.0/24‘) < IP(‘12.0.0.0/24‘) #数值型数据比较
True
>>> IP(‘10.0.0.0/24‘) in IP(‘12.0.0.0/24‘) #网段包含关系
False
>>> IP("192.168.0.0/23").overlaps("192.168.1.0/24") #网段是否存在重叠 1 表示存在重叠,0 表示不存在重叠
1
>>> IP("192.168.0.0/23").overlaps("192.168.2.0")
0
#!/usr/bin/env/ python
from IPy import IP
ip_s = raw_input(‘Please input an IP or net_range:‘)
ips = IP(ip_s)
if len(ips) > 1: # 为一个网络地址
print (‘net: %s‘ % ips.net()) #网络地址
print (‘netmask: %s‘ % ips.netmask()) #子网掩码
print (‘broadcast: %s‘ % ips.broadcast()) #广播地址
print (‘reverse address: %s‘ % ips.reverseNames()[0]) #反向地址解析
print (‘subnet: %s‘ % len(ips)) #输出网络子网数
else:
print (‘reverse address: %s‘ % ips.reverseNames()[0])
print(‘hexadecimal: %s‘ % ips.strHex()) #输出十六进制地址
print(‘binary ip: %s‘ % ips.strBin()) #输出二进制地址
print(‘iptype: %s‘ % ips.iptype()) #输出地址类型,PRIVATE\PUBLIC\LOOPBACK
4、DNS处理模块
dnspython提供了一个DNS解析器类:resolver,使用它的query方法来实现域名的查询功能。query方法的定义如下:
query(self, qname, rdtype=1, rdclass=1, tcp=False, source=None, raise_on_no_answer=True, source_port=0)
其中,qname参数为查询的域名。rdtype参数用来指定RR资源的类型,常用的有以下几种:
A记录:将主机名转换成IP地址
MX记录:邮件交换记录,定义邮件服务器的域名
CNAME记录:指别名记录,实现域名间的映射
NS记录:标记区域的域名服务器及授权子域
PTR记录:反向解析,与A记录相反,将IP转换成成主机名
SOA记录:SOA记录,一个起始授权区的定义
# wget http://www.dnspython.org/kits/1.9.4/dnspython-1.9.4.tar.gz
# tar -zxvf dnspython-1.9.4.tar.gz
# cd dnspython-1.9.4
# python setup.py install
(1)A记录
#! /usr/bin/env python
import dns.resolver
domain = raw_input(‘Please input an domain:‘)
A = dns.resolver.query(domain,‘A‘) #指定查询类型为A记录
for i in A.response.answer:
for j in i.items:
print j
(2)MX记录
#! /usr/bin/env python
import dns.resolver
domain = raw_input(‘Please input an domain:‘)
MX = dns.resolver.query(domain,‘MX‘) #指定查询类型为MX记录
for i in MX:
print ‘MX preference = ‘, i.preference,‘mail exchanger = ‘, i.exchange
(3)NS记录
#! /usr/bin/env python
import dns.resolver
domain = raw_input(‘Please input an domain:‘)
NS = dns.resolver.query(domain,‘NS‘) #指定查询类型为NS记录
for i in NS.response.answer:
for j in i.items:
print j
(4)CNAME记录
#! /usr/bin/env python
import dns.resolver
domain = raw_input(‘Please input an domain:‘)
CNAME = dns.resolver.query(domain,‘CNAME‘) #指定查询类型为CNAME记录
for i in CNAME.response.answer:
for j in i.items:
print j
练习:
1、根据输入的Ip地址,跟子网掩码 计算出网络段
#!/usr/bin/env python
#_*_encoding:utf-8_*_
#Input your ip address and netmask to figure out your network .
#申明:此脚本为交互式,默认情况下请执行python network.py
from IPy import IP
input_IP = raw_input(‘请输入ip地址:‘)
list1 = input_IP.split(‘.‘)
if len(list1) != 4:
print "您输入的ip地址不合法,请重新输入!"
exit()
for i in list1:
if i.isdigit() == True and int(i) >=0 and int(i) <= 255:
pass
else:
print "您输入的ip地址不合法,请重新输入!"
exit()
input_Netmask = raw_input(‘请输入子网掩码:‘)
list2 = input_Netmask.split(‘.‘)
if len(list2) != 4:
print "您输入的子网掩码不合法,请重新输入!"
exit()
for i in list2:
if i.isdigit() == True and int(i) >=0 and int(i) <= 255:
pass
else:
print "您输入的子网掩码不合法,请重新输入!"
exit()
print "您所在的网段为:%s" % (IP(input_IP).make_net(input_Netmask))
2、dns域名解析后台服务器健康检查
import dns.resolver
import os
import httplib
iplist = [] #定义域名IP列表变量
appdomain = ‘www.google.com.hk‘ # 定义业务域名
def get_iplist(domain=""): #域名解析函数,解析成功IP将被追加到iplist
try:
A = dns.resolver.query(domain, ‘A‘) #解析A记录类型
except Exception,e:
print "dns resolver error:"+str(e)
return
for i in A.response.answer:
for j in i.items:
iplist.append(j) #追加到Iplist
return True
def checkip(ip):
checkurl = ip+":80"
getcontent = ""
httplib.socket.setdefaulttimeout(5) #定义http连接超时时间5秒
conn=httplib.HTTPConnection(checkurl) #创建http连接对象
try:
conn.request("GET","/",headers = {"Host": appdomain}) #发起URL请求,添加host主机头
r = conn.getresponse()
getcontent = r.read(15) #获取URL页面前15个字符,以便做可用性校验
finally:
if getcontent == "<!doctype html>":
print ip+" [OK]"
else:
print ip+" [Error]" #此处可放告警程序,可以是邮件,短信通知
if __name__=="__main__":
if get_iplist(appdomain) and len(iplist)>0: #条件:域名解析正确且至少返回一个IP
for ip in iplist:
checkip(ip)
else:
print "dns resolver error"