百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Python之psutil和paramiko库结合收集100台linux系统存入CSV

suiw9 2025-03-26 16:55 6 浏览 0 评论

需求说明:要为系统运维工程师编写一个 Python 脚本,使用 psutil 库收集 100 台 Linux 主机的系统信息(如 IP 地址、主机名、操作系统型号、内存大小、磁盘大小等),并将这些信息存储到 CSV 文件中,以下是一个完整的实现方案。

实现步骤

  1. 使用 psutil 收集本地系统信息
  2. 获取主机名、操作系统型号、内存大小、磁盘大小等信息。
  3. 使用 paramiko 或 fabric 远程连接到其他主机
  4. 通过 SSH 连接到远程主机,执行命令获取信息。
  5. 将收集到的信息存储到 CSV 文件中
  6. 使用 Python 的 csv 模块将数据写入 CSV 文件。

代码实现

1. 安装依赖库

确保安装了以下 Python 库:

pip install psutil paramiko

2. 脚本代码

import psutil
import socket
import platform
import csv
import paramiko

# 定义远程主机信息
REMOTE_HOSTS = [
    {"hostname": "192.168.1.101", "username": "root", "password": "password"},
    {"hostname": "192.168.1.102", "username": "root", "password": "password"},
    # 添加更多主机信息
]

# 收集本地系统信息
def collect_local_info():
    hostname = socket.gethostname()
    os_info = platform.platform()
    memory_info = psutil.virtual_memory()
    disk_info = psutil.disk_partitions()

    # 获取所有磁盘的总大小
    disk_sizes = []
    for partition in disk_info:
        usage = psutil.disk_usage(partition.mountpoint)
        disk_sizes.append(usage.total)

    return {
        "hostname": hostname,
        "os_info": os_info,
        "memory_size": memory_info.total,
        "disk_sizes": disk_sizes,
    }

# 通过 SSH 收集远程主机信息
def collect_remote_info(hostname, username, password):
    try:
        # 创建 SSH 客户端
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname, username=username, password=password, timeout=10)

        # 获取主机名
        stdin, stdout, stderr = ssh.exec_command("hostname")
        remote_hostname = stdout.read().decode().strip()

        # 获取操作系统信息
        stdin, stdout, stderr = ssh.exec_command("cat /etc/os-release")
        os_info = stdout.read().decode().strip()

        # 获取内存大小
        stdin, stdout, stderr = ssh.exec_command("free -b | grep Mem | awk '{print $2}'")
        memory_size = int(stdout.read().decode().strip())

        # 获取磁盘大小
        stdin, stdout, stderr = ssh.exec_command("lsblk -b -o SIZE | grep -v SIZE")
        disk_sizes = [int(size) for size in stdout.read().decode().strip().split()]

        ssh.close()

        return {
            "hostname": remote_hostname,
            "os_info": os_info,
            "memory_size": memory_size,
            "disk_sizes": disk_sizes,
        }
    except Exception as e:
        print(f"Failed to collect info from {hostname}: {e}")
        return None

# 将信息写入 CSV 文件
def write_to_csv(data, filename="system_info.csv"):
    with open(filename, mode="w", newline="") as file:
        writer = csv.writer(file)
        writer.writerow(["Hostname", "OS Info", "Memory Size (bytes)", "Disk Sizes (bytes)"])

        for item in data:
            writer.writerow([
                item["hostname"],
                item["os_info"],
                item["memory_size"],
                ", ".join(map(str, item["disk_sizes"])),
            ])

# 主函数
def main():
    all_info = []

    # 收集本地信息
    local_info = collect_local_info()
    all_info.append(local_info)

    # 收集远程主机信息
    for host in REMOTE_HOSTS:
        remote_info = collect_remote_info(host["hostname"], host["username"], host["password"])
        if remote_info:
            all_info.append(remote_info)

    # 将信息写入 CSV 文件
    write_to_csv(all_info)
    print("System information has been saved to system_info.csv")

if __name__ == "__main__":
    main()

代码说明

  1. collect_local_info
  2. 使用 psutil 和 platform 收集本地主机的信息。
  3. 获取主机名、操作系统型号、内存大小和磁盘大小。
  4. collect_remote_info
  5. 使用 paramiko 通过 SSH 连接到远程主机。
  6. 执行命令获取远程主机的信息(如 hostname、cat /etc/os-release、free -b、lsblk 等)。
  7. write_to_csv
  8. 将收集到的信息写入 CSV 文件,每行包含主机名、操作系统型号、内存大小和磁盘大小。
  9. REMOTE_HOSTS
  10. 定义远程主机的 IP 地址、用户名和密码。可以根据实际情况扩展。
  11. 错误处理
  12. 如果 SSH 连接失败或命令执行失败,会捕获异常并跳过该主机。

输出示例

生成的 system_info.csv 文件内容如下:

Hostname,OS Info,Memory Size (bytes),Disk Sizes (bytes)
localhost,Linux-5.15.0-83-generic-x86_64-with-glibc2.31,8589934592,107374182400, 214748364800
remote-host1,NAME="Ubuntu" VERSION="20.04.3 LTS (Focal Fossa)",8589934592,107374182400, 214748364800
remote-host2,NAME="CentOS" VERSION="7 (Core)",8589934592,107374182400, 214748364800

注意事项

  1. SSH 连接安全性
  2. 建议使用 SSH 密钥认证代替密码认证,以提高安全性。
  3. 并发执行
  4. 如果需要同时收集多台主机的信息,可以使用多线程或多进程(如 concurrent.futures)提高效率。
  5. 磁盘信息
  6. lsblk 命令可能需要根据系统环境调整,确保所有主机都支持该命令。
  7. 权限问题
  8. 确保脚本在运行时有足够的权限访问远程主机和执行命令。

通过这个脚本,系统运维工程师可以轻松收集多台主机的系统信息,并将其存储到 CSV 文件中,便于后续分析和处理。

相关推荐

Qt编程进阶(99):使用OpenGL绘制三维图形

一、Qt中的OpenGL支持...

OpenGL基础图形编程(七)建模(opengl教程48讲)

七、OpenGL建模  OpenGL基本库提供了大量绘制各种类型图元的方法,辅助库也提供了不少描述复杂三维图形的函数。这一章主要介绍基本图元,如点、线、多边形,有了这些图元,就可以建立比较复杂的模型了...

ffmpeg cv:Mat编码成H265数据流(ffmpeg编码mp4视频)

流程下面附一张使用FFmpeg编码视频的流程图。使用该流程,不仅可以编码H.264的视频,而且可以编码MPEG4/MPEG2/VP8等等各种...

986g超轻酷睿本,联想ThinkPad X1 Carbon 2025 Aura评测

今年3月份,联想首发了搭载Intel酷睿Ultra移动平台的ThinkPadX1CarbonGen12轻薄本,其续航表现令人惊喜。时隔9个月,IT之家收到了ThinkPad...

拆解五六年前的国产平板,这做工!

之前在论坛有幸运得被抽到奖,就是猎奇手机镜头,到手的时候玩了下鱼眼和广角微距,效果见图,用手机拍的那么就进入正题来说下拆鸡过程,外壳我就不拍出来了,免得打广告之嫌,拆出背面外壳就出现了一个裸板。第...

什么是闭合GOP和开放GOP?(闭合式和开放式区分)

翻译|Alex技术审校|李忠本文来自OTTVerse,作者为KrishnaRaoVijayanagar。...

拆解五六年前的国产平板(国产平板怎么拆开)

之前在论坛有幸运得被抽到奖,就是猎奇手机镜头,到手的时候玩了下鱼眼和广角微距,效果见图,用手机拍的那么就进入正题来说下拆鸡过程,外壳我就不拍出来了,免得打广告之嫌,拆出背面外壳就出现了一个裸板。第...

如何使用PSV播放MP4 视频自动退出怎么办

作者:iamwin来源:巴士论坛(点此进入)看到有很多同学在为psv无法播放视频而困扰,自己研究了下,发一个可以解决PSV出现播放视频播放到一半就跳出的问题。就是这个问题:首先,请大家先升级到版本≥1...

2023-03-21:音视频解混合(demuxer)为MP3和H264...

2023-03-21:音视频解混合(demuxer)为MP3和H264,用go语言编写。答案2023-03-21:...

FFmpeg解码H264及swscale缩放详解

本文概要:...

CasaOS保姆级喂饭教程!网心云OEC-Turbo安装CasaOS系统固件!

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:柒叶君...

Firefox 33将整合思科开源编解码器OpenH264

思科去年在BSD许可证下开源了支持H.264编解码的OpenH264,Mozilla则在当时宣布将在Firefox中整合思科的二进制模块。现在,最新的FirefoxNightly(Firefox3...

为什么传输视频流的时候需要将YUV编码成H.264?

首先开始的时候我们借用一张雷神的图帮助大家理解一下从上图可以看出我们要做的,就是将像素层的YUV格式,编码出编码层的h264数据。...

FFmpeg学习(1)开篇(ffmpeg开发教程)

FFmpeg学习(1)开篇...

喜欢看视频必须了解 AV1编码那点事

喜欢看视频的小伙伴大概都有点感觉,AV1这个不太熟悉的视频格式,最近闹出的事情可不少,比如视频网站为了节约带宽偷偷默认使用AV1格式,让电脑狂转;比如Intel专门给旧CPU发布了相关工具;再比如GP...

取消回复欢迎 发表评论: