python编写liunx服务器登陆自动巡检脚本

前言:

用户需要一份用Python编写的Linux系统巡检脚本,检查内存、磁盘、CPU使用率,还有网络连通性。
首先,我得确定用户的使用场景。可能用户是系统管理员,需要定期监控服务器状态,确保系统正常运行。
或者是开发人员,想自动化巡检流程,减少手动检查的工作量。
接下来,用户提到的具体指标有内存、磁盘、CPU和网络。
我需要考虑如何用Python获取这些信息。
对于Linux系统,通常可以通过读取/proc文件系统或者使用命令行工具来获取这些数据。
比如,内存信息可以从/proc/meminfo读取,磁盘使用情况可以用psutil库或者调用df命令,
CPU使用率可以用psutil或者读取/proc/stat,网络连通性可以用ping命令或者socket库。
然后,用户可能希望脚本的输出清晰易读,可能需要格式化输出,比如用表格形式展示结果。
颜色区分不同状态,比如红色表示警告,绿色表示正常,这样用户一眼就能看出问题所在。
还要考虑是否需要参数化,比如允许用户指定检查的磁盘路径或IP地址,但用户没有提到,可能基础版本不需要,但可以预留扩展的可能性。
另外,日志记录功能可能有用,方便后续查看历史巡检结果。
需要处理权限问题,比如某些命令可能需要sudo权限,但用户可能希望脚本在普通用户权限下运行,所以应选择不需要特权的方法。
例如,使用psutil库可以跨平台,并且不需要执行外部命令,更安全可靠。 关于网络检查,用户可能想检测内网关键服务或外网连通性。
比如,默认检查8.8.8.8和百度,但用户可能需要自定义,所以可以设计成可配置的列表。
最后,确保代码兼容Python3,并且添加必要的异常处理,避免脚本因为某个检查项失败而终止。
例如,捕获异常并记录错误信息,继续执行其他检查。

总结下来,脚本需要:

  1. 使用psutil库获取系统信息(内存、磁盘、CPU)。
  2. 使用subprocess执行ping命令检查网络。
  3. 格式化输出,用颜色标记状态。
  4. 可配置的检查项,如磁盘路径、IP列表。
  5. 添加日志记录功能。
  6. 异常处理,确保健壮性。 现在开始编写代码,确保各部分功能正确,
    并测试在不同情况下的表现,比如磁盘空间不足时是否正确报警,网络不通时的处理等。
    同时,提供使用说明,指导用户安装依赖(如psutil)和如何运行脚本。

以下是一个基于Python 3的Linux系统巡检脚本,使用psutil库获取系统信息,包含您要求的五大核心指标检测:

#!/usr/bin/env python3
import psutil
import subprocess
import platform
from datetime import datetime
import socket
import sys# 颜色配置
COLORS = {"red": "\033[91m","green": "\033[92m","yellow": "\033[93m","orange": "\033[38;5;208m","end": "\033[0m"
}def check_uptime():"""获取系统运行时间和启动时间"""boot_time = psutil.boot_time()now = datetime.now().timestamp()# 计算运行时间uptime_seconds = now - boot_timedays, remainder = divmod(uptime_seconds, 86400)hours, remainder = divmod(remainder, 3600)minutes, seconds = divmod(remainder, 60)return {"days": int(days),"hours": int(hours),"minutes": int(minutes),"seconds": int(seconds),"boot_time": datetime.fromtimestamp(boot_time).strftime("%Y-%m-%d %H:%M:%S")}def get_host_ip():"""获取主机所有IPv4地址(排除回环地址)"""interfaces = psutil.net_if_addrs()ips = []for name, addrs in interfaces.items():for addr in addrs:if addr.family == socket.AF_INET and not addr.address.startswith('127.'):ips.append({"interface": name,"ip": addr.address,"netmask": addr.netmask})return {"ips": ips}def check_memory():"""检查内存使用率(修改为GB单位)"""mem = psutil.virtual_memory()return {"total": round(mem.total / (1024**3), 1),  # 转换为GB"used": round(mem.used / (1024**3), 1),"free": round(mem.free / (1024**3), 1),"percent": mem.percent}def check_disk(path='/'):"""检查磁盘使用率(修改为GB单位)"""disk = psutil.disk_usage(path)return {"total": round(disk.total / (1024**3), 1),  # 转换为GB"used": round(disk.used / (1024**3), 1),"free": round(disk.free / (1024**3), 1),"percent": disk.percent}def check_cpu():"""检查CPU使用率"""return {"usage": psutil.cpu_percent(interval=1),"cores": psutil.cpu_count(logical=False),"threads": psutil.cpu_count(logical=True)}def check_load():"""检查系统负载"""load_avg = psutil.getloadavg()cpu_cores = psutil.cpu_count(logical=False)  # 获取物理核心数return {"1min": load_avg[0],"5min": load_avg[1],"15min": load_avg[2],"cores": cpu_cores}def check_network(hosts=['8.8.8.8', 'www.baidu.com']):"""网络连通性检查"""results = {}for host in hosts:param = '-n' if platform.system().lower()=='windows' else '-c'command = ['ping', param, '3', host]results[host] = subprocess.call(command, stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL) == 0return resultsdef format_result(title, data, threshold=80):print(f"\n{COLORS['orange']}=== {title} ==={COLORS['end']}")"""更新输出格式"""if title == "内存使用率":print(f"总量: {data['total']} GB | 已用: {data['used']} GB | 剩余: {data['free']} GB")elif title == "磁盘使用率":print(f"总量: {data['total']} GB | 已用: {data['used']} GB | 剩余: {data['free']} GB")elif title == "CPU使用率":color = COLORS['red'] if data['usage'] > threshold else COLORS['green']print(f"使用率: {color}{data['usage']}%{COLORS['end']}")print(f"物理核心: {data['cores']} | 逻辑线程: {data['threads']}")elif title == "网络连通性":for host, status in data.items():status_str = f"{COLORS['green']}{COLORS['end']}" if status else f"{COLORS['red']}不通{COLORS['end']}"print(f"{host}: {status_str}")elif title == "系统负载":# 计算负载核心比load_ratio_1min = data['1min'] / data['cores'] if data['cores'] > 0 else 0# 设置颜色阈值if load_ratio_1min > 2.0:color = COLORS['red']status = "❗过载"elif load_ratio_1min > 1.0:color = COLORS['yellow']status = "⚠️警告"else:color = COLORS['green']status = "✅正常"print(f"当前状态: {color}{status}{COLORS['end']}")print(f"1分钟负载: {data['1min']:.2f} | 5分钟: {data['5min']:.2f} | 15分钟: {data['15min']:.2f}")print(f"物理核心: {data['cores']} | 建议阈值: 1.0-{data['cores']*2:.1f}")elif title == "系统运行时间":print(f"运行时长: {data['days']}{data['hours']}{data['minutes']}分")print(f"系统启动: {data['boot_time']}")elif title == "主机网络信息":if len(data['ips']) == 0:print(f"{COLORS['red']}未找到有效IP地址{COLORS['end']}")else:for entry in data['ips']:print(f"接口 {entry['interface']}: {entry['ip']}/{entry['netmask']}")def main():# 记录检查时间print(f"{COLORS['yellow']}系统巡检时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}{COLORS['end']}")# 执行所有检查checks = [("主机网络信息", get_host_ip()),    # 新增("系统运行时间", check_uptime()),  # 新增("内存使用率", check_memory()),("磁盘使用率", check_disk()),("CPU使用率", check_cpu()),("系统负载", check_load()), ("网络连通性", check_network())]# 输出结果for title, data in checks:format_result(title, data)# 添加系统信息print(f"\n{COLORS['orange']}=== 系统信息 ==={COLORS['end']}")print(f"主机名: {platform.node()}")print(f"系统版本: {platform.platform()}")if __name__ == "__main__":try:main()except KeyboardInterrupt:print("\n检测已中止")sys.exit(1)except Exception as e:print(f"{COLORS['red']}检测出错: {str(e)}{COLORS['end']}")sys.exit(1)

使用说明:

  1. 安装依赖:pip install psutil
  2. 运行脚本:python3 system_check.py
    功能特性:
  3. 彩色终端输出:使用不同颜色标识健康状态(红色>80%,绿色正常)
  4. 核心指标检测
    • 内存:总/已用/剩余内存及使用率
    • 磁盘:根分区使用情况
    • CPU:使用率及核心数
    • 网络:默认检测谷歌DNS和百度连通性
  5. 扩展功能
    • 异常处理机制(支持Ctrl+C中断)
    • 系统基本信息展示
    • 时间戳记录

输出示例:

系统巡检时间:2024-02-20 14:30:45=== 内存使用率 ===
使用率: 58.2%
总量: 15941 MB | 已用: 9273 MB | 剩余: 6668 MB=== 磁盘使用率 ===
挂载点: / | 使用率: 75.5%
总量: 491520 MB | 已用: 370112 MB | 剩余: 121408 MB=== CPU使用率 ===
使用率: 32.1%
物理核心: 8 | 逻辑线程: 16=== 网络连通性 ===
8.8.8.8: 通
www.baidu.com: 通=== 系统信息 ===
主机名: ubuntu-server
系统版本: Linux-5.4.0-88-generic-x86_64-with-glibc2.29

效果图

在这里插入图片描述

自定义建议:

  1. 修改检测阈值:调整format_result中的threshold参数
  2. 增加检测项:在check_disk中指定其他挂载点
  3. 修改检测目标:调整check_network的hosts列表
  4. 添加告警机制:当指标超过阈值时发送邮件/钉钉通知

彩蛋

1、要实现通过SSH连接服务器时自动执行巡检脚本。

在文件末尾追加以下内容

#只是root用户可以使用
echo -e '\n# 登录时执行巡检脚本\npython3 /path/to/your_script.py' >> ~/.bashrc

用户通过SSH登录 → 执行巡检脚本 → 显示巡检结果 → 进入正常shell环境

效果图

在这里插入图片描述

所有用户登陆服务器都可以执行这个巡检脚本

vim /etc/ssh/sshd_config
#在文件末尾添加 排除特殊连接方式(防止影响SCP/SFTP):
Match AllForceCommand if [[ -z $SSH_ORIGINAL_COMMAND ]]; then python3 /usr/local/bin/system_check.py; exec $SHELL; else eval "$SSH_ORIGINAL_COMMAND"; fi
#重启ssh服务
systemctl restart sshd

至此结束,感谢观看。

无人扶我凌云志,我自踏血之山巅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【二分查找】P9698 [GDCPC2023] Path Planning|普及

本文涉及的基础知识点 本博文代码打包下载 C二分查找 [GDCPC2023] Path Planning 题面翻译 【题目描述】 有一个 n n n 行 m m m 列的网格。网格里的每个格子都写着一个整数,其中第 i i i 行第 j j j 列的格子里写着整数 a i , j a_{i, j} ai,j​。从 0…

springboot015基于SpringBoot的在线视频教育平台的设计与实现(源码+数据库+文档)

源码地址:基于SpringBoot的在线视频教育平台的设计与实现 文章目录 1.项目简介2.部分数据库结构与测试用例3.系统功能结构4.包含的文件列表(含论文)前端运行截图后端运行截图 1.项目简介 ​ 随着科学技术的飞速发展,各行各业都在…

《深度剖析:生成对抗网络中生成器与判别器的高效协作之道》

在人工智能的前沿领域,生成对抗网络(GAN)以其独特的对抗学习机制,为数据生成和处理带来了革命性的变革。生成器与判别器作为GAN的核心组件,它们之间的协作效率直接决定了GAN在图像生成、数据增强、风格迁移等众多应用中…

学习Flask:[特殊字符] Day 3:数据库集成

学习目标:使用SQLAlchemy操作数据库 from flask_sqlalchemy import SQLAlchemyapp.config[SQLALCHEMY_DATABASE_URI] sqlite:///site.db db SQLAlchemy(app)class User(db.Model):id db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(20),…

可以免费无限次下载PPT的网站

前言 最近发现了一个超实用的网站,想分享给大家。 在学习和工作的过程中,想必做PPT是一件让大家都很头疼的一件事。 想下载一些PPT模板减少做PPT的工作量,但网上大多精美的PPT都是需要付费才能下载使用。 即使免费也有次数限制&#xff0…

什么是 Java 中的线程安全?

回答 Java 中的线程安全(Thread Safety)指的是在多线程环境下,当多个线程同时访问和操作共享资源(如对象、变量、数据结构等)时,能够保证程序的正确性,不会出现数据不一致、竞争条件&#xff0…

建筑三维设计软件如何实现弯道超车?

三个问题 建筑三维设计软件属于工业设计软件的一种,在这个领域一直是国外公司垄断。前些年,在房地产高歌猛进的时代,很多公司也尝试投入到建筑三维设计软件的研发。随着房地产市场行业的下行,建筑三维设计软件的发展也受到了影响…

Android OpenGLES2.0开发(十一):渲染YUV

人生如逆旅,我亦是行人 Android OpenGLES开发:EGL环境搭建Android OpenGLES2.0开发(一):艰难的开始Android OpenGLES2.0开发(二):环境搭建Android OpenGLES2.0开发(三&am…

深入miniqmt:创建交易对象的完整指南

深入miniqmt:创建交易对象的完整指南 在量化交易领域,miniqmt作为一个强大的工具,为开发者提供了执行程序化交易的接口。在进行任何交易操作之前,首先需要创建一个交易对象。本文将详细介绍如何在miniqmt中创建并配置交易对象&am…

日语Learn、英语的再认识

背单词这件事感觉到了某个瓶颈了,没有什么新的区域可以发现,变成了一种类似纯粹的机械记忆,感觉英语的规范程度很低,很多词明明可以通过相近的形式变换,达到更好的学习效果,但却做的很麻烦,同一…

内存泄漏指什么?常见的内存泄漏有哪些?

内存泄漏是指程序在运行过程中,由于某些原因导致程序无法释放已经不再使用的内存,使得这部分内存持续被占用,最终可能导致系统可用内存逐渐减少,严重时会影响系统性能甚至导致程序崩溃。(内存泄漏是指程序中已经分配的…

文心一言AI创意画

介绍 文心一言是百度推出的新一代知识增强大语言模型,属于文心大模型家族的新成员。‌它能够与人对话互动、回答问题、协助创作,高效便捷地帮助人们获取信息、知识和灵感。‌ 特点 文心一言基于数万亿数据和数千亿知识进行融合学习,采用预训…

洛谷 P8705:[蓝桥杯 2020 省 B1] 填空题之“试题 E :矩阵” ← 卡特兰数

【题目来源】 https://www.luogu.com.cn/problem/P8705 【题目描述】 把 1∼2020 放在 21010 的矩阵里。要求同一行中右边的比左边大,同一列中下边的比上边的大。一共有多少种方案? 答案很大,你只需要给出方案数除以 2020 的余数即可。 【答案提交】 …

我是如何从 0 到 1 找到 Web3 工作的?

作者:Lotus的人生实验 关于我花了一个月的时间,从 0 到 1 学习 Web3 相关的知识和编程知识。然后找到了一个 Web3 创业公司实习的远程工作。 👇👇👇 我的背景: 计算机科班,学历还可以(大厂门槛水平) 毕业工…

量子网络:构建与应用前景的展望

大家好,我是Echo_Wish,今天我们来探讨一个极具前瞻性的领域——量子网络的构建与应用前景。随着量子计算的发展,量子网络作为量子信息科学的重要组成部分,正在引起越来越多的关注。本文将深入解析量子网络的构建原理,并展望其应用前景。 量子网络的基本概念 量子网络是指…

数据库二三事(8)

高级数据查询 top词语法格式:TOP n (percent)(with ties) 查询前n(%)行数据,(包括最后一行取值并列) 搭配 order by case: CASE (…

linux中conda3安装

1、下载安装包 清华源-》https://mirrors.tuna.tsinghua.edu.cn/# 本文使用Anaconda3-2022.10,对应的下载路径-》https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2022.10-Linux-x86_64.sh 2、将下载到的sh脚本放在Linux中用sh脚本解析器执行 …

2025最新智能优化算法:人工旅鼠算法(Artificial Lemming Algorithm, ALA)求解23个经典函数测试集,MATLAB

一、人工旅鼠优化算法 人工旅鼠算法(Artificial Lemming Algorithm, ALA)是2025年提出的一种新型生物启发式优化算法,受旅鼠的四种典型行为启发:长距离迁徙、挖洞、觅食和躲避捕食者。该算法通过模拟这些行为来解决复杂的优化问题…

Python游戏编程之赛车游戏6-2

3.2 move()方法的定义 Player类的move()方法用于玩家控制汽车左右移动,当玩家点击键盘上的左右按键时,汽车会相应地进行左右移动。 move()方法的代码如图7所示。 图7 move()方法的代码 其中,第20行代码通过pygame.key.get_pressed()函数获…

日语学习-日语知识点小记-构建基础-JLPT-N4N5阶段(12):普通(ふつう)形 :变化方式 :日常朋友家人之间对话

日语学习-日语知识点小记-构建基础-JLPT-N4&N5阶段(12):普通(ふつう)形 :变化方式 :日常朋友&家人之间对话  1、前言(1)情况说明(2)工程师的信仰2、知识点(1)普通(ふつう)形:Plain style:简体3、单词(1)日语单词(2)日语片假名单词4、相近词辨…