import psutil,datetime
"进程信息"print(psutil.pids())#列出所有进程的PID
p = psutil.Process(20440)#实例化一个进程对象,参数为进程的pidprint(p.name())#打印除进程的名字print(p.exe())#进程的bin路径print(p.cwd())#进程的工作目录绝对路径print(p.status())#进程的状态
date = p.create_time()#进程的创建时间print(datetime.datetime.fromtimestamp(date).strftime("%Y-%m-%d %H:%M:%S"))#进程创建时间,时间戳格式,使用datetime进行格式化print(p.uids())#进程的uid信息print(p.gids())#进程的gid信息print(p.cpu_times())#进程CPU时间信息,包括user、system俩个cpu时间print(p.cpu_affinity())#进程CPU亲和度print(p.memory_percent())#进程内存利用率print(p.memory_info())#进程内存,物理内存集和虚拟内存集print(p.io_counters())#打开进行socket的namedutples列表print(p.num_threads())#进程开启的线程数"popen类的使用"import psutil
from subprocess import PIPE
p = psutil.Popen(["python","-c","print('hello')"],stdout=PIPE)print(p.cpu_times())#此进程占用cpu的百分比信息print(p.name())#执行进程的用户print(p.username())#当前用户信息print(p.communicate())#coomand信息
1.2实用的IP地址处理模块IPy
"""
IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能、可扩展性等方面,在这个过程当中,免不了要计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等。
Python是供了一个强大的第三方模块
IPy(https://github.com/haypo/python-ipy/),最新版本为V0.81。
IPy模块可以很好地辅助我们高效完成IP的规划工作,下面进行详细介绍。
"""
linux源码安装IPy:
1.[root@client ~]# wget https://pypi.python.org/packages/source/I/IPy/IPy-0.81.tar.gz#获取ipy的二进制安装包2.[root@client ~]# tar -zxvf IPy-0.81.tar.gz #解压压缩包3.[root@client ~]# cd IPy-0.81 #进入ipy目录4.[root@client ~]# python setup.py install #安装ipy
In [1]:import IPy
In [2]:print(IPy.__version__)0.81#输出版本正确即可
pycahrm安装:
C:\Users\LENOVO>C:\Users\LENOVO\AppData\Local\Programs\Python\Python39-32\python.exe -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple IPy
1.2.1 IP、网段的处理
IPy模块包含IP类,使用它可以方便处理绝大部分格式为IPv6及IPv4的网络和地址。
比如通过version方法就可以区分出IPv4与IPv6,如:import IPy
print(IPy.IP('10.0.0.0/8').version())#通过IP类判断后方ip地址的类型,返回ipv4print(IPy.IP('::1').version())#通过IP类判断后方ip地址的类型,返回ipv6from IPy import IP
ip = IP('192.168.0.0/16')#定义一个ip的类和掩码位print(ip.len())#打印ip段中可用的ip长度(65536)for x in ip:#输出段中的每个ip地址print(x)"IP类的常用方法"from IPy import IP
ip = IP('192.168.1.20')print(ip.reverseName())#反向解析地址格式#20.1.168.192.in-addr.arpa.print(ip.iptype())#ip地址是公网还是私网.PRIVATE:私有的print(IP('8.8.8.8').iptype())#PUBLIC:公共的print(IP('8.8.8.8').int())#将ip地址转换为整型格式print(IP('8.8.8.8').strHex())#将ip地址转换为16进制print(IP('8.8.8.8').strBin())#将ip地址转换为2进制print(IP(0x8080808))#将16禁止转换为ip地址"IP方法也支持网络地址的转换,例如根据IP与掩码生产网段格式,如下:"from IPy import IP
print(IP('192.168.1.0').make_net('255.255.255.0'))#根据ip和掩码为生成对应的ip地址段print(IP('192.168.1.0/255.255.255.0',make_net=True))#根据ip和掩码为生成对应的ip地址段print(IP('192.168.1.0-192.168.1.255',make_net=True))#根据起始ip地址和末尾ip地址生成对应的ip地址段"也可以通过strNormal方法指定不同wantprefixlen参数值以定制不同输出类型的网段输出类型为字符串,如下:"print(IP('192.168.1.0/24').strNormal(0))#根据网段和normal取值返回对应的网络信息#192.168.1.0print(IP('192.168.1.0/24').strNormal(1))#根据网段和normal取值返回对应的网络信息#192.168.1.0/24print(IP('192.168.1.0/24').strNormal(2))#根据网段和normal取值返回对应的网络信息#192.168.1.0/255.255.255.0print(IP('192.168.1.0/24').strNormal(3))#根据网段和normal取值返回对应的网络信息#192.168.1.0-192.168.1.255"""
wantprefixlen的取值及含义:
wantprefixlen=0,无返回,如192.168.1.0;
wantprefixlen=1,prefix格式,如192.168.1.0/24;
wantprefixlen=2,decimalnetmask格式,如192.168.1.0/255.255.2555.0
wantprefixlen=3,lastIP格式,如192.168.1.0-192.168.1.255。
"""
1.2.2 多网络计算方法
from IPy import IP
print(IP('10.0.0.0/24')< IP('12.0.0.0/24'))#ip地址比较返回true或falseprint('192.168.1.100'in IP('192.168.1.0/24'))#判断某个段或者某个ip是否在大段中print(IP('192.168.1.0/24')in IP('192.168.0.0/16'))#判断小ip段是否在大ip段中"判断俩个网段是否重叠"print(IP('192.168.0.0/23').overlaps('192.168.1.0/24'))#返回1,则代表前一个ip段中包含了后方的ip地址段内容 overlaps:重叠print(IP('192.168.1.0/24').overlaps('192.168.2.0'))#1.0/24中不包含2.0的ip地址"示例:根据输入的IP或子网返回网络、掩码、广播、反向解析、子网数、IP类型等信息。"#!/usr/bin/env pythonfrom IPy import IP
ip_s =input("Please input an IP or net-range: ")#接收用户输入,参数为ip或网段if ip_s =="quit"or ip_s =="exit":print("\033[31m已退出ip地址解析!\033[0m")
exit(11)
ips = IP(ip_s)#将用户输入的ip传给类IPiflen(ips)>=1:#单个ip的长度为1print('net: %s'% ips.net())#输出网络地址print('netmask: %s'% ips.netmask())#输出ip的掩码print('reverse address: %s'% ips.reverseName())#输出地址反向解析print('subnet: %s'%len(ips))#输出网络子网数else:#否则为单个ip地址print('reverse address: %s'% ips.reverseNames())print('hexadecimal: %s'% ips.strHex())#输出十六进制地址print('binary ip: %s'% ips.strBin())#输出二进制地址print('iptype: %s'% ips.iptype())#输出地址类型
"A记录"import dns.resolver
domain =input("输入要查询的域名:")
A = dns.resolver.resolve(domain,'A')#query已经被弃用,通过resolver.resolve获取域名的A记录for i in A.response.answer:#获取dns的回答print(i)#打印出响应内容,整体for j in i.items:#items获取字典的key和value,已元组形式展示#只输出A记录的地址print(j.address)"MX记录"import dns.resolver
domain =input("输入要查询的域名:")
MX = dns.resolver.resolve(domain,'MX')#指定查询mx邮件交换记录for i in MX:#遍历回应结果print("MX的记录优先级为:",i.preference,'邮件记录域名为:',i.exchange)#打印记录的优先级值和域名"NS记录"import dns.resolver
domain =input("输入要查询的域名:")#只能输入一级域名,返回一级域名下的多级域名
ns = dns.resolver.resolve(domain,"NS")#获取域名的NS记录for i in ns.response.answer:print(i)#获取所有的响应信息for j in i.items:print(j.to_text())#以文本形式输出,不加也可以"CNAME记录"import dns.resolver
domain =input("输入要查询的域名:")
cname = dns.resolver.resolve(domain,"CNAME")#获取CNAME记录for i in cname.response.answer:for j in i.items:print(j)#返回子域名
1.3.3 DNS轮循业务监控(实践)
"模块安装"
C:\Users\LENOVO>C:\Users\LENOVO\AppData\Local\Programs\Python\Python39-32\python.exe -m install -i https://pypi.tuna.tsinghua.edu.cn/simple httplib2 dnspython
"案例代码:"#!/bin/env pythonimport dns.resolver
import http.client
import time
#python3中的urllib模块改为http.clieny
iplist =[]#定义域名ip列表
appdomain ="www.baidu.com"
data = time.ctime(time.time())[0:16]+"<---->"#定义业务域名defget_iplist(domain=""):try:
A = dns.resolver.resolve(domain,'A')#针对域名进行A记录的解析.用try进行管理except Exception as e:print("\033[31mdns域名解析异常:\033[0m",e)#如果解析失败抛异常并退出.解析成功则向下运行returnfor i in A.response.answer:#获取所有的响应体for j in i.items:#获取字典元组,单纯拿到ip
iplist.append(j)#讲解析出的ip追加到开始定义的列表中.进行探测准备.returnTrue#函数执行正常返回true.defcheckip(ip):
checkurl =f"{ip}:80"#定义探测ip
coon = http.client.HTTPConnection(checkurl,timeout=5)#创建http连接对象,并且超时时间为5stry:
coon.request("GET","/",headers ={"HSOT":appdomain})#发起urlget请求添加请求头,检测目标域名的默认网页
r = coon.getresponse()#获取url页面前15个字符,以便做可用性校验finally:##无论try块是否发生异常,最终都要进入finally语句,并执行其中的代码块。if r.status ==200:#如果网页的状态码为200print(f"\033[36m{data}{ip} [OK]\033[0m")#监控URL页面的内容是否为指定内容来判断是否打开成功else:print(f"\033[31m{data}{ip} [EROOR]\033[0m")if __name__ =="__main__":if get_iplist(appdomain)andlen(iplist)>0:##如果appdomian函数体返回为true并且解析的ip长度不为0.则向下执行for ip in iplist:
checkip(ip)else:print("dns域名解析器故障!")print("\n")