# Python远程监控Linux **Repository Path**: zqidiot/python-remote-monitoring-linux ## Basic Information - **Project Name**: Python远程监控Linux - **Description**: 使用Python语言来进行Linux的监控 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2022-03-05 - **Last Updated**: 2024-03-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 使用Python远程监控Linux系统资源运行情况 ## Linux系统 #### Linux操作系统的信息: 操作系统管理的计算机系统资源包括:中央处理器、主存储器、外部设备、数据、程序。 操作系统的主要功能有: ``` 1. 进程管理; 2. 存储管理; 3. 设备管理; 4. 文件管理; 5. 作业管理。 ``` Linux系统资源使用情况主要是在/proc文件夹中, Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。 用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。下面列出的这些文件或子文件夹,并不是都是在你的系统中存在,这取决于你的内核配置和装载的模块。另外,在/proc下还有三个很重要的目录:net,scsi和sys。 Sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则scsi 目录不存在。 进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口 所以知道了Linux里面我们需要的资源信息的位置,那么现在就是要获取得到文件里面的内容 #### /proc子文件或者子文件夹里的内容 ``` 子文件或子文件夹 /proc/buddyinfo 每个内存区中的每个order有多少块可用,和内存碎片问题有关 /proc/cmdline 启动时传递给kernel的参数信息 /proc/cpuinfo cpu的信息 /proc/crypto 内核使用的所有已安装的加密密码及细节 /proc/devices 已经加载的设备并分类 /proc/dma 已注册使用的ISA DMA频道列表 /proc/execdomains Linux内核当前支持的execution domains /proc/fb 帧缓冲设备列表,包括数量和控制它的驱动 /proc/filesystems 内核当前支持的文件系统类型 /proc/interrupts x86架构中的每个IRQ中断数 /proc/iomem 每个物理设备当前在系统内存中的映射 /proc/ioports 一个设备的输入输出所使用的注册端口范围 /proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb /proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理 /proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关 /proc/locks 内核锁住的文件列表 /proc/mdstat 多硬盘,RAID配置信息(md=multiple disks) /proc/meminfo RAM使用的相关信息 /proc/misc 其他的主要设备(设备号为10)上注册的驱动 /proc/modules 所有加载到内核的模块列表 /proc/mounts 系统中使用的所有挂载 /proc/mtrr 系统使用的Memory Type Range Registers (MTRRs) /proc/partitions 分区中的块分配信息 /proc/pci 系统中的PCI设备列表 /proc/slabinfo 系统中所有活动的 slab 缓存信息 /proc/stat 所有的CPU活动信息 /proc/sysrq-trigger 使用echo命令来写这个文件的时候,远程root用户可以执行大多数的系统请求关键命令,就好像在本地终端执行一样。要写入这个文件,需要把/proc/sys/kernel/sysrq不能设置为0。这个文件对root也是不可读的 /proc/uptime 系统已经运行了多久 /proc/swaps 交换空间的使用情况 /proc/version Linux内核版本和gcc版本 /proc/bus 系统总线(Bus)信息,例如pci/usb等 /proc/driver 驱动信息 /proc/fs 文件系统信息 /proc/ide ide设备信息 /proc/irq 中断请求设备信息 /proc/net 网卡设备信息 /proc/scsi scsi设备信息 /proc/tty tty设备信息 /proc/net/dev 显示网络适配器及统计信息 /proc/vmstat 虚拟内存统计信息 /proc/vmcore 内核panic时的内存映像 /proc/diskstats 取得磁盘信息 /proc/schedstat kernel调度器的统计信息 /proc/zoneinfo 显示内存空间的统计信息,对分析虚拟内存行为很有用 以下是/proc目录中进程N的信息 /proc/N pid为N的进程信息 /proc/N/cmdline 进程启动命令 /proc/N/cwd 链接到进程当前工作目录 /proc/N/environ 进程环境变量列表 /proc/N/exe 链接到进程的执行命令文件 /proc/N/fd 包含进程相关的所有的文件描述符 /proc/N/maps 与进程相关的内存映射信息 /proc/N/mem 指代进程持有的内存,不可读 /proc/N/root 链接到进程的根目录 /proc/N/stat 进程的状态 /proc/N/statm 进程使用的内存的状态 /proc/N/status 进程状态信息,比stat/statm更具可读性 /proc/self 链接到当前正在运行的进程 ``` ## 使用python进行连接Linux系统 要用Python进行连接Linux系统,可以使用Python库里的paramiko,通过使用SSHClient()进行远程连接 SSHClient()介绍: SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。 SSHClient常用的方法 1. connect():实现远程服务器的连接与认证,对于该方法只有hostname是必传参数。 常用参数 ``` hostname 连接的目标主机 port=SSH_PORT 指定端口 username=None 验证的用户名 password=None 验证的用户密码 pkey=None 私钥方式用于身份验证 key_filename=None 一个文件名或文件列表,指定私钥文件 timeout=None 可选的tcp连接超时时间 allow_agent=True, 是否允许连接到ssh代理,默认为True 允许l ook_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许 compress=False, 是否打开压缩 ``` 2. set_missing_host_key_policy():设置远程服务器没有在know_hosts文件中记录时的应对策略。 设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种: 1. AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认 2. WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接 3. RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项 3. exec_command():在远程服务器执行Linux命令的方法。 ```python import paramiko # 创建实例对象进行连接 def ConnectServer(ip, port, user, pwd): # 创建实例对象 ssh = paramiko.SSHClient() # 调用方法,表示没有存储远程机器的公钥,允许访问 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: ssh.connect(ip, port, user, pwd, timeout=10) print("服务器连接成功!\n") return ssh except Exception: print("server port not connect!") return 0 ``` 当连接好了远程的机器之后,返回这个ssh实例对象,这样在后面的执行要查看系统资源命令的时候比较方便 以查询CPU使用情况为例: 通过上面的知识可以了解到CPU资源的使用情况是在/proc/stat当中的,在Linux系统上执行 > cat /proc/stat | grep "cpu " 就可以得到CPU的使用情况 ```python import re import time # cpu的使用率 def cpu_use(ssh): # print("cpu使用率:") # 第一次获取CPU的使用情况 stdin, stdout, stderr = ssh.exec_command('cat /proc/stat | grep "cpu "') str_out = stdout.read().decode() str_err = stderr.read().decode() if str_err != "": print(str_err) else: cpu_time_list = re.findall('\d+', str_out) cpu_idle1 = cpu_time_list[3] total_cpu_time1 = 0 for t in cpu_time_list: total_cpu_time1 = total_cpu_time1 + int(t) time.sleep(2) # 第二次获取CPU的使用情况 stdin, stdout, stderr = ssh.exec_command('cat /proc/stat | grep "cpu "') str_out = stdout.read().decode() str_err = stderr.read().decode() if str_err != "": print(str_err) else: cpu_time_list = re.findall('\d+', str_out) cpu_idle2 = cpu_time_list[3] total_cpu_time2 = 0 for t in cpu_time_list: total_cpu_time2 = total_cpu_time2 + int(t) # 计算两次CPU使用情况得到CPU的使用率 cpu_usage = round(1 - (float(cpu_idle2) - float(cpu_idle1)) / (total_cpu_time2 - total_cpu_time1), 2) print('当前CPU使用率为:' + str(cpu_usage)) print("\n") return cpu_usage ``` 同样的道理,再使用相同的方法进行查询得到返回的结果,最重要的是要找到系统资源存放的位置。 > **注意:** > >系统存储的信息是很长的内容,需要使用到正则表达式来进行处理我们想要得到的数据 此刻,我们就得到了我们想要查询的系统资源的使用情况 **下面问题来了**: 用户想看到的是由界面的,而不是通过命令行来进行操作,那样就比较麻烦而且让人反感 ## Python GUI > 说实话,最开始拿到这个题目的时候,并没有想到需要进行界面的设计,但是对于Python界面的设计完全是空白,因此不得不在有限的时间内进行学习 我使用到的Python界面的库是Tkinter ```python from tkinter import * ``` #### 简介 简介:Tkinter Python 的标准 Tk GUI 工具包的接口,可以在大多数的 Unix 平台下使用, 同样可以应用在 Windows 和 Mac 系统里。Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。 由于我做出来的界面比较普通,就不赘述其具体的过程,也就学习了几个显示框和button以及对应的使用方法 可以去看[官方文档](https://docs.python.org/3/library/tk.html) 里面的介绍,很详细。 ## 展示 1. 最开始的界面: ![](./Source/1.png) 2. 点击进入“新的监视对象” ![](./Source/3.png) 3. 在这个界面里输入要远程连接的Linux系统的IP地址,端口号,登录名和密码 如果失败,会显示"Login Failed!" 成功的话就会显示"Login Success!",并且在界面中就会将信息显示出来 如下图: ![](./Source/2.png) ## 感悟和想法 拿到题目的时间还是比较紧的,而且还要学习那么多的知识,确实比较累,顺带还是我在机场弄了一部分 最后做出来了,也算是小有成就,就酱紫吧!!!