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