Python 3.7.7 连接远程centos服务器读取配置信息

1.代码

import paramiko
from datetime import datetime


class SystemInfoCollector:
    def __init__(self, hostname, port, username, password):
        self.client = paramiko.SSHClient()
        self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        self.hostname = hostname
        self.port = port
        self.username = username
        self.password = password
        self.connection_time = None

    def connect(self):
        """建立SSH连接并记录连接时间"""
        try:
            self.client.connect(
                hostname=self.hostname,
                port=self.port,
                username=self.username,
                password=self.password,
                timeout=10
            )
            self.connection_time = datetime.now()
            print(f"✅ 连接成功 | 目标主机:{self.hostname} | 用户:{self.username}")
            return True
        except paramiko.AuthenticationException:
            print("❌ 认证失败:用户名或密码错误")
            return False
        except paramiko.SSHException as e:
            print(f"❌ SSH协议错误:{str(e)}")
            return False
        except Exception as e:
            print(f"⚠️ 连接异常:{str(e)}")
            return False

    def execute_command(self, command):
        """执行远程命令并返回标准化结果"""
        try:
            stdin, stdout, stderr = self.client.exec_command(command)
            exit_status = stdout.channel.recv_exit_status()
            output = stdout.read().decode().strip()
            error = stderr.read().decode().strip()

            return {
                "command": command,
                "exit_code": exit_status,
                "output": output,
                "error": error
            }
        except Exception as e:
            return {
                "command": command,
                "exit_code": -1,
                "error": f"命令执行失败:{str(e)}"
            }

    def get_system_info(self):
        """获取完整的系统配置信息"""
        if not self.connect():
            return None

        print("\n🔍 开始收集系统信息...")

        # 配置信息采集命令集
        commands = {
            "os_info": "cat /etc/os-release",
            "cpu_info": "lscpu",
            "memory_info": "free -h",
            "disk_info": "df -hT --exclude-type=tmpfs",
            "network_info": "ip -br address",
            "kernel_version": "uname -r",
            "uptime": "uptime -p",
            "logged_users": "who",
            "process_count": "ps -e | wc -l",
            "package_list": "rpm -qa | wc -l"
        }

        results = {}
        for key, cmd in commands.items():
            result = self.execute_command(cmd)
            if result["exit_code"] == 0:
                results[key] = result["output"]
            else:
                results[key] = f"获取失败:{result['error']}"

        return results

    def format_report(self, data):
        """生成易读的格式化报告"""
        report = []

        # 系统基本信息
        report.append("\n=== 系统概览 ===")
        report.append(f"采集时间:{self.connection_time.strftime('%Y-%m-%d %H:%M:%S')}")
        report.append(f"系统运行:{data.get('uptime', 'N/A')}")
        report.append(f"内核版本:{data.get('kernel_version', 'N/A')}")

        # 操作系统信息解析
        os_info = {}
        for line in data.get('os_info', '').split('\n'):
            if '=' in line:
                key, value = line.split('=', 1)
                os_info[key] = value.strip('"')
        report.append("\n=== 操作系统 ===")
        report.append(f"系统名称:{os_info.get('NAME', 'N/A')}")
        report.append(f"版本号:{os_info.get('VERSION_ID', 'N/A')}")
        report.append(f"架构:{os_info.get('VERSION_CODENAME', 'N/A')}")

        # CPU信息解析
        cpu_info = {}
        for line in data.get('cpu_info', '').split('\n'):
            if ':' in line:
                key, value = line.split(':', 1)
                cpu_info[key.strip()] = value.strip()
        report.append("\n=== 处理器信息 ===")
        report.append(f"型号:{cpu_info.get('Model name', 'N/A')}")
        report.append(f"核心数:{cpu_info.get('CPU(s)', 'N/A')}")
        report.append(f"架构:{cpu_info.get('Architecture', 'N/A')}")

        # 内存信息表格
        report.append("\n=== 内存使用 ===")
        report.append(data.get('memory_info', 'N/A').replace('\n', '\n| '))

        # 磁盘信息表格
        report.append("\n=== 磁盘存储 ===")
        report.append(data.get('disk_info', 'N/A').replace('\n', '\n| '))

        # 网络信息
        report.append("\n=== 网络配置 ===")
        report.append(data.get('network_info', 'N/A').replace('\n', '\n| '))

        # 系统负载
        report.append("\n=== 系统状态 ===")
        report.append(f"当前用户:{data.get('logged_users', 'N/A')}")
        report.append(f"进程总数:{data.get('process_count', 'N/A')}")
        report.append(f"已安装软件包:{data.get('package_list', 'N/A')}")

        return '\n'.join(report)

    def close(self):
        """安全关闭连接"""
        if self.client:
            self.client.close()
            print("\n🔌 SSH连接已关闭")


if __name__ == "__main__":
    # 配置连接参数(建议使用配置文件或环境变量存储敏感信息)
    config = {
        "hostname": "192.168.188.132",
        "port": 22,
        "username": "root",
        "password": "root"
    }

    collector = SystemInfoCollector(**config)

    try:
        system_data = collector.get_system_info()
        if system_data:
            print(collector.format_report(system_data))
    except KeyboardInterrupt:
        print("\n操作被用户中断")
    finally:
        collector.close()

配置部分

# 配置连接参数(建议使用配置文件或环境变量存储敏感信息)
config = {
    "hostname": "192.168.188.132",
    "port": 22,
    "username": "root",
    "password": "root"
}

结果现象

C:\Users\Administrator\AppData\Local\Programs\Python\Python37\python.exe D:/Users/Administrator/PycharmProjects/untitled1/服务器/SSH协议获取远程CentOS系统.py
✅ 连接成功 | 目标主机:192.168.188.132 | 用户:root

🔍 开始收集系统信息...

=== 系统概览 ===
采集时间:2025-05-15 17:27:59
系统运行:up 1 day, 1 hour, 45 minutes
内核版本:3.10.0-693.el7.x86_64

=== 操作系统 ===
系统名称:CentOS Linux
版本号:7
架构:N/A

=== 处理器信息 ===
型号:N/A
核心数:2
架构:x86_64

=== 内存使用 ===
total        used        free      shared  buff/cache   available
| Mem:           7.6G        1.2G        879M        1.8G        5.5G        4.1G
| Swap:          7.9G        9.8M        7.9G

=== 磁盘存储 ===
文件系统                类型      容量  已用  可用 已用% 挂载点
| /dev/mapper/centos-root xfs       150G   20G  131G   14% /
| devtmpfs                devtmpfs  3.8G     0  3.8G    0% /dev
| /dev/mapper/centos-home xfs       841G  1.4G  840G    1% /home
| /dev/sda1               xfs      1014M  179M  836M   18% /boot

=== 网络配置 ===
获取失败:Option "-br" is unknown, try "ip -help".

=== 系统状态 ===
当前用户:oracle   :0           2025-04-24 20:20 (:0)
oracle   pts/5        2025-04-26 17:52 (:0)
oracle   pts/6        2025-05-09 16:45 (:0)
进程总数:230
已安装软件包:1518

🔌 SSH连接已关闭

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值