常用模块
-
psutil
- 用它来获取系统信息
-
IPy
- 高效处理ip地址相关的功能
-
dnspython
- 实现是dns的服务监控
- 可以实现域名解析,对域名的A记录,NS记录进行相应的查询等
- 解析结果的校验
系统信息的获取
- 在Windows系统中可以通过任务管理器来获取系统的时时状态
- 在linux服务器中如何获取呢?
- 可以使用
top
命令可以看到CPU、内存、进程等信息 - 可以通过
df -h
命令可以看到硬盘的容量 - 可以通过
w
命令查看当前登录用户 - 可以通过
watch cat /proc/net/dev
命令可以查看时时的网络情况 - 可以通过
cat /proc/cpuinfo i
命令可以看到Cpu相关的一些列信息 - 但是这些脚本或命令很难满足我们的需求,我们可以使用python来获取系统信息
- 可以使用
psutil模块
1 ) 安装
- $
pip3 install psutil
2 ) 使用psutil输出系统信息
-
进入python环境,API示例:
>>> import psutil >>> psutil.cpu_count() # 查看CPU数量, CPU是8核16线程的CPU 16 >>> psutil.cpu_count(logical=False) # 查看物理核心Cpu数量,而非线程 8 >>> psutil.cpu_times() # 获取CPU使用时间 scputimes(user=9165.24, nice=0.0, system=116.69, idle=61836.14, iowait=1.84, ) #这里输出很多信息,不一一列举了, 数值单位为cpu的周期 >>> psutil.cpu_percent() # 获取CPU当前使用比例,单位是%,下面表示0.5% 0.8 >>> psutil.cpu_percent(percpu=True) # 每个cpu单独显示 这个统计有周期和频率的问题,再次运行结果会不一样,动态的 [0.1, 0.1, 0.3, ...] # 这里输出每个CPU核心的信息 >>> psutil.cpu_percent(percpu=True, interval=3) # interval=3 采样3秒内的数据 [0.1, 0.1, 0.2, ...] >>> psutil.virtual_memory() # 查看内存的使用情况,也可以使用命令查看`free -m` svmem(total=10002222, available=555555, ...) # 输出一系列信息 只做举例 >>> psutil.swap_memory() # 查看交换分区的使用情况 sswap(total=10222222, used=0, ...) # 输出一系列信息 只做举例 >>> psutil.disk_partitions() [sdiskpart(device='/dev/sda1', mountpoint='/', ...)] # 输出一系列信息 >>> psutil.disk_usage('/') # 查看每一个分区可用的空间, 参数是分区 sdiskusage(total=199992222222, used=222222222, ...) # 输出一系列信息 >>> psutil.disk_io_counters() # 硬盘的io读写情况 sdiskio(read_count=8112, write_count=4222, ...) # 输出一系列信息 >>> psutil.net_io_counters() # 查看网络情况 snetio(bytes_sent=562222, bytes_recv=888888, ...) # 输出一系列信息 >>> psutil.net_io_counters(pernic=True) # 存在多块网卡, 列出每块网卡情况 {'ens33': snetio(bytes_sent=562222, bytes_recv=888888, ...)} >>> psutil.pids() # 获取进程相关信息 [1, 2, 3, 5, ...] # 输出一系列信息 >>> p = psutil.Process(1) # 获取进程id的详细信息 >>> p.name() # 进程名称 'systemd' >>> p.exe() # 进程的可执行文件 '/lib/systemd/systemd' >>> p.cwd() # 进程的工作目录 '/' >>> p.status() # 进程状态 'sleeping' >>> p.create_time() # 进程创建时间 15222223222.86 >>> p.uids() # 查看进程是哪个用户创建的 puids(real=0, effective=0, saved=0) >>> p.gids() # 查看进程属于哪个群组 pgids(real=0, effective=0, saved=0) >>> p.cpu_times() # 获取进程所占用的cpu时间 pcputimes(user=1.02, system=3.92, ...) # 输出一系列信息 >>> p.memory_percent() # 获取进程的内存占用 0.6132332322323232322323 >>> p.io_counters() # 查看进程的io操作 pio(read_count=621130, write_count=67777, ...) # 输出一系列信息 >>> p.num_threads() # 查看进程创建了多少线程 1
-
如果是一些联网相关的进程,还能看到它的一些网络信息,示例:
- 先找一个ssh的连接
ps -ef | grep ssh # 下面输出一系列信息,在此处不列举了,举例我们查到了一个进程 13141
- 开始测试它的一些进程信息
>>> p = psutil.Process(13141) >>> p.name() # 打印进程名称 'sshd' >>> p.connections() # 打印进程连接 [pconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.55.66', port=22), raddr=addr(ip='192.168.55.67', port=5555, status='ESTABLISHED'))] # 这个进程打开了22端口,另一个ip地址67连接到了这个进程,可以分析可疑进程
- 先找一个ssh的连接
-
还有一些其他常用的API
>>> psutil.boot_time() # 获取开机时间 1577664000000.0 >>> import datetime >>> datatime.datetime.fromtimestamp(1577664000000).strftime("%Y-%m-%d %H:%M:%S") '2019-12-30 00:00:00:00' >>> psutil.users() # 获取登录用户 [suser(name='root', ...)]
IPy模块
1 ) 安装
- $
pip3 install ipy
2 ) 具体应用
-
进入python环境
>>> import IPy >>> IPy.IP("192.168.1.2").version() # 查看ip版本 4 >>> IPy.IP("::1").version() 6 >>> ips = IPy.IP('192.168.1.0/28') # 这是一个网段 >>> ips.len() # 网段内的所有ip地址的数量 16 >>> [ip for ip in ips] # 打印网段内的ip地址 [IP('192.168.1.0'), IP('192.168.1.1'), ...] >>> ip = IPy.IP("192.168.88.1") >>> ip.iptype() # 查看ip类型是公网ip还是私网ip 'PRIVATE' >>> io = IPy.IP('8.8.8.8') >>> ip.iptype() 'PUBLIC' >>> ip.int() # 将ip地址转换为整数(十进制) 134744072 >>> ip.strHex() # 将ip地址转换为十六进制 '0x8080808' >>> ip.strBin() # 将ip地址转换为二进制 '00001000000010000000100000001000' # 根据ip和子网掩码生产网段 >>> IPy.IP("192.168.1.0").make_net('255.255.255.0') IP('192.168.1.0/24') # 或者使用另一种方式 >>> IPy.IP("192.168.1.0/255.255.255.248", make_net=True) IP('192.168.1.0/29') # 还有一种方式 >>> IPy.IP("192.168.1.0-192.168.1.255", make_net=True) IP('192.168.1.0/24') # 判断ip地址和网段是否包含在另一个网段中 >>> '192.168.8.1' in IPy.IP('192.168.8.0/24') True ### 判断两个网段是否出现重复的情况 >>> IPy.IP("192.168.0.0/23").overlaps("192.168.1.0/24") 1 # 1表示存在 >>> IPy.IP("192.168.0.0/24").overlaps("192.168.1.0/24") 0 # 0表示不存在
dnspython 模块
1 ) 安装
- $
pip3 install dnspython
2 ) 具体应用举例
-
进入python环境
>>> import dns.resolver >>> res = dns.resolver.query("www.baidu.com", "A") # 查询百度的A记录 >>> [item.address for item in res] ['119.75.213.61', '119.75.216.20'] >>> res = dns.resolver.query("qq.com", "MX") # 查询腾讯的MX记录(邮件解析记录) >>> [item for item in res] [<DNS IN MX rdata: 10 mx3.qq.com.>, <DNS IN MX rdata: 20 mx2.qq.com>, <DNS IN MX rdata: 30 mx1.qq.com.>] >>> res = dns.resolver.query("baidu.com", "NS") # 查询百度的NS记录, 注意查询NS记录要使用一级域名 >>> [item for item in res] [<DNS IN NS rdata: dns.baidu.com.>, <DNS IN NS rdata: ns4.baidu.com.>, <DNS IN NS rdata: ns3.baidu.com.>, <DNS IN NS rdata: ns7.baidu.com.>, <DNS IN NS rdata: ns2.baidu.com.>]
-
通过这些信息我们可以对我们企业的域名进行监控,我们可以写一个python脚本,每隔10分钟对域名进行一个解析, 通过访问, 查看端口是否通畅, 服务器是否死机等