基于python远程主机监控软件的设计与实现

2021-04-01 06:18仇虹孟彬孙冲
计算机与网络 2021年2期

仇虹 孟彬 孙冲

摘要:针对网络运维工作中由于服务器主机空间分散导致值勤效率不高的问题,设计了一款可监控远程服务器运行信息的软件。软件基于python的psutil和wmi模块采集远程主机的运行信息,基于UDP套接字传送相关信息,基于SQLite数据库存储信息和Tkinter标准库设计了,运行信息在GUI进行展示。对软件进行实际环境部署并测试,运维人员可在监控端直接查看多台服务器的各类关键信息及运行状态。

关键词:python;psutil;套接字;Tkinter

中图分类号:TP311.1文献标志码:A文章编号:1008-1739(2021)02-56-4

0引言

在网络运维工作中,运维人员常需查看服务器主机的运行状态,由于空间分散及应用服务器类目众多,需在维护终端上配置主机监控软件以达到查看服务器主机运行状态的目的。市面上的主机监控软件種类繁多,良莠不齐,相当一部分被开发人员留有后门,植入广告或者木马等,影响服务器正常工作、危害信息安全。python是一种跨平台、面向对象的解释型编程语言,具有语法简洁、形态丰富、多语言集成三大特点,有丰富的第三方库,是当前非常流行的编程语言[1]。本文从客户端及服务端不同需求入手,研究了基于python的信息获取及网络通信过程,实现了根据用户需求实时获取目标服务器(主机)的基本信息、CPU和内存使用情况、进程信息、网络配置以及网络连接详情等关键信息。

1软件系统结构

1.1软件整体功能设计

目标服务器上安装客户端软件,负责采集本主机的状态信息,在维护终端上安装负责接收及显示信息的服务端软件,可以根据需求接收每台服务器的状态信息,并予以显示,如图1所示。

客户端程序负责采集目标服务器主机的信息有CPU信息、硬盘信息、内存信息、进程详情、网络配置信息、网络数据统计信息及网络连接信息等。服务端程序根据用户需求向客户端发送指令,然后接收客户端发送的运行信息,并将信息展现给用户。

考虑到服务器承载着重要程序的运行,客户端程序采取指令式采集,即收到指令、采集信息、反馈信息,以避免占用过多资源影响服务器的性能。客户端和服务端使用基于UDP的socket套接字收发主机信息和指令,由于UDP套接字用于无连接、不可靠的数据传输服务,具有较高的数据传输效率,在局域网中小批量数据传输尤为适用[2]。软件整体框图如图2所示。

1.2客户端功能设计

客户端程序运行后先建立UDP套接字,然后等待接收指令,根据接收的指令调用不同的信息采集模块,将采集到的信息发送至服务端,发送完毕后等待接收指令。客户端程序启动后,获取的主机信息发送给服务端程序,不需要在本地显示,因此客户端程序不需要GUI设计。客户端工作流程如图3所示。鉴于UDP提供无连接的传输服务和只在收发数据时才占用端口的特性[3],设定默认的端口号,运维人员可根据实际情况选择更改端口号。

1.3服务端功能设计

运维人员在服务端程序上设定客户端主机的IP地址和端口号并存储在数据库中,每次监控客户机时只需选择相应IP地址和端口即可,亦可手动添加。根据用户需求发送指令到客户端,收到客户端反馈的信息后再显示在GUI上,同时信息将被存储在SQLite数据库中,以供查询使用。服务端工作流程如图4所示,服务端需要与用户直接交互,因此需要GUI设计。

1.4 socket通信设计

当客户端和服务端通信时,服务端程序发送指令使用系统自动分配的动态端口号作为源端口号、指定端口作为目的端口号,发送完成后监听动态端口等待接收,直到收到客户端程序发来相应的数据包后,停止监听并关闭socket。客户端程序需要随时接收服务端的指令,因此要保持监听端口的状态。socket通信示意如图5示。

2软件功能的实现

2.1文件结构

软件的文件组织结构如图6示。客户端文件中,Client.py负责接收客户端的指令,根据指令调用Get_class.py中的Get_Info类的方法获取信息,再将返回的信息发给服务端程序。