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_time
    days, 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
        ) == 0
    return results


def 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 All
    ForceCommand 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

至此结束,感谢观看。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙 ArkUI 实现敲木鱼小游戏

敲木鱼是一款具有禅意的趣味小游戏,本文将通过鸿蒙 ArkUI 框架的实现代码,逐步解析其核心技术点,包括动画驱动、状态管理、音效震动反馈等。 一、架构设计与工程搭建 1.1 项目结构解析 完整项目包含以下核心模块: ├── entry…

ShenNiusModularity项目源码学习(14:ShenNius.Infrastructure项目分析)

ShenNius.Infrastructure项目用于定义ShenNius.Admin.Mvc项目和ShenNius.Admin.API项目共用的特性类、数据操作接口实现类、上下文类、通讯类,主要文件的用途如下:   Attributes文件夹保存特性类或过滤器类定义,主要包括:   …

Mysql表字段字符集未设置导致乱码问题

项目场景: 在使用mysql的text类型作为字段类型【未设置编码】,且表结构【设置了编码集】的条件下,查询表这个字段会出现乱码的情况。 问题描述 今日测试小伙伴给题主提出了一个bug,数据库当中的text文本字段在存储json的情况下&…

staruml绘制时序图和用例图

文章目录 1.文章介绍2.绘制用例图3.绘制时序图 1.文章介绍 之前,我们初步介绍了这个staruml软件的安装和如何使用这个软件对于uml类图进行绘制,当时我们是绘制了这个user类,实现了相关的接口,表示他们之间的关系,在今…

火狐浏览器多开指南:独立窗口独立IP教程

无论是跨境电商从业者需要管理多个店铺账号,还是海外社交媒体营销人员要运营多个社交平台账号,亦或是从事多账号广告投放的人员,都面临着一个共同的挑战 —— 如何高效管理多个账号,并确保每个账号的独立性。 在这种情况下&#…

DeepSeek赋能大模型内容安全,网易易盾AIGC内容风控解决方案三大升级

在近两年由AI引发的生产力革命的背后,一场关乎数字世界秩序的攻防战正在上演:AI生成的深度伪造视频导致企业品牌声誉损失日均超千万,批量生成的侵权内容使版权纠纷量与日俱增,黑灰产利用AI技术持续发起欺诈攻击。 与此同时&#…

【论文精读】YOLO-World:实时开放词汇目标检测

论文地址: YOLO-World: Real-Time Open-Vocabulary Object Detection 源代码:YOLO-World 摘要 YOLO系列检测器因其高效性和实用性而被广泛认可。然而,它们依赖于预定义和训练过的物体类别,这限制了其在开放场景中的适用性。为了…

开放标准(RFC 7519):JSON Web Token (JWT)

开放标准:JSON Web Token 前言基本使用整合Shiro登录自定义JWT认证过滤器配置Config自定义凭证匹配规则接口验证权限控制禁用session缓存的使用登录退出单用户登录Token刷新双Token方案单Token方案 前言 JSON Web Token (JWT) 是一种开放标准…

mysql架构查询执行流程(图解+描述)

目录 mysql架构查询执行流程 图解 描述 mysql架构查询执行流程 图解 描述 用户连接到数据库后,由连接器处理 连接器负责跟客户端建立连接、获取权限、维持和管理连接 客户端发送一条查询给服务器 服务器先检查查询缓存,如果命中缓存,则立…

k8s使用containerd作为容器运行时配置Harbor私有仓库与阿里云私有仓库以及镜像加速器,k8s基于containerd如何配置harbor私有仓库

至于containerd大家还需要在去学习以下使用的命令。 版本介绍 k8s:v1.28.2containerd:1.6.33 1.配置containerd镜像加速器 [rootmaster ~]# vim /etc/containerd/config.toml ---编辑containerd配置文件找到以下位置新添加 [plugins."io.contain…

【MySql】EXPLAIN执行计划全解析:15个字段深度解读与调优指南

文章目录 一、执行计划核心字段总览二、关键字段深度拆解1. type(访问类型)——查询性能的晴雨表典型场景分析: 2. key_len(索引使用长度)——索引利用率的检测仪计算示例: 3. Extra(附加信息&a…

python-leetcode-最长有效括号

32. 最长有效括号 - 力扣(LeetCode) class Solution:def longestValidParentheses(self, s: str) -> int:stack [-1] # 存储索引,初始值 -1 代表“未匹配起点”max_length 0for i, char in enumerate(s):if char (:stack.append(i)els…

单目摄像头物体深度计算基础原理

三维空间物体表面点位与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数,而相机参数的求解就是相机标定。 相机的参数矩阵包括内参和外参: 外参:决定现实坐标到摄像机坐标。…

CF 106A.Card Game(Java实现)

问题分析 定义一个字符是王牌,打出第一张牌a,第二张牌b。如果只有a是王牌花色直接赢。如果a,b同花色且a>b则a赢;如果只有b是王牌,a输。如果a,b都不是王牌且不同花色,不比较直接输。 思路分析…

在 Vue 组件中,如何确认父组件在 add 模式下传入 value 的情况及其对子组件 getProducts() 方法的触发影响?

文章目录 父组件中 <ave-form> 的使用add 模式下触发逻辑value 的传入情况是否触发 getProducts()&#xff1f; 验证 add 模式下 getProducts() 是否触发结论&#xff1a; 检查父组件传入 value 的完整情况如何明确知道父组件传入的 value最终回答 父组件 index.vue子组件…

Python的那些事第三十四篇:基于 Plotly 的交互式图表与仪表板设计与应用

基于 Plotly 的交互式图表与仪表板设计与应用 摘要: 本文深入探讨了 Plotly 这一强大的交互式图表和仪表板库。首先介绍了 Plotly 的背景与发展历程,随后详细阐述了其核心功能特性,包括丰富的图表类型、高度的自定义能力以及便捷的交互操作。通过实际案例分析和示例代码展示…

瑞芯微RK安卓Android主板GPIO按键配置方法,触觉智能嵌入式开发

触觉智能分享&#xff0c;瑞芯微RK安卓Android主板GPIO按键配置方法&#xff0c;方便大家更好利用空闲IO&#xff01;由触觉智能Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566四核处理器&#xff0c;树莓派卡片电脑设计&#xff0c;支持安卓Android、开源鸿蒙Open…

树莓百度百科更新!宜宾园区业务再添新篇

树莓集团宜宾园区业务不断拓展&#xff0c;主要体现在以下几个方面&#xff1a; 产业布局 -聚焦数字经济核心领域&#xff1a;涵盖软件开发、人工智能、大数据等&#xff0c;吸引众多上下游企业入驻&#xff0c;形成从芯片研发、软件开发到系统集成的完整产业链条。 -推进“双…

Orange 开源项目 - 集成阿里云大模型

1 阿里云的大模型服务平台百炼 阿里云的大模型服务平台百炼是一站式的大模型开发及应用构建平台。不论是开发者还是业务人员&#xff0c;都能深入参与大模型应用的设计和构建。您可以通过简单的界面操作&#xff0c;在5分钟内开发出一款大模型应用&#xff0c;或在几小时内训练…

rust 前端npm依赖工具rsup升级日志

rsup是使用 rust 编写的一个前端 npm 依赖包管理工具&#xff0c;可以获取到项目中依赖包的最新版本信息&#xff0c;并通过 web 服务的形式提供查看、升级操作等一一系列操作。 在前一篇文章中&#xff0c;记录初始的功能设计&#xff0c;自己的想法实现过程。在自己的使用过…