python windows下如何通过SSH获取linux系统cpu、内存、网络使用情况

发布时间:2021-12-02 17:31:18 作者:柒染
来源:亿速云 阅读:614
# Python在Windows下通过SSH获取Linux系统CPU、内存、网络使用情况

## 目录
1. [前言](#前言)
2. [技术背景](#技术背景)
   - [SSH协议简介](#ssh协议简介)
   - [Python与SSH](#python与ssh)
3. [环境准备](#环境准备)
   - [Windows端环境配置](#windows端环境配置)
   - [Linux端环境要求](#linux端环境要求)
4. [核心实现方法](#核心实现方法)
   - [paramiko库基础使用](#paramiko库基础使用)
   - [fabric库的简化实现](#fabric库的简化实现)
5. [系统指标获取实战](#系统指标获取实战)
   - [CPU使用率获取](#cpu使用率获取)
   - [内存使用情况获取](#内存使用情况获取)
   - [网络流量监控](#网络流量监控)
6. [数据处理与可视化](#数据处理与可视化)
   - [文本解析技巧](#文本解析技巧)
   - [使用pandas处理数据](#使用pandas处理数据)
   - [matplotlib可视化展示](#matplotlib可视化展示)
7. [高级应用与优化](#高级应用与优化)
   - [多主机并行采集](#多主机并行采集)
   - [定时任务实现](#定时任务实现)
   - [异常处理机制](#异常处理机制)
8. [安全注意事项](#安全注意事项)
9. [完整代码示例](#完整代码示例)
10. [总结与展望](#总结与展望)

## 前言

在混合操作系统环境中,Windows客户端需要监控Linux服务器性能是常见的运维场景。本文将详细介绍如何使用Python在Windows环境下通过SSH协议获取Linux系统的CPU、内存和网络使用情况,并构建完整的监控解决方案。

## 技术背景

### SSH协议简介

SSH(Secure Shell)是一种加密的网络传输协议,可在不安全的网络中提供安全的远程登录和其他网络服务。它通过以下机制保障安全:

1. 对称加密传输数据
2. 非对称加密验证身份
3. 消息完整性校验

### Python与SSH

Python中常用的SSH库包括:

| 库名称    | 特点                          | 适用场景              |
|-----------|-----------------------------|---------------------|
| paramiko  | 纯Python实现,功能完整        | 需要精细控制的场景    |
| fabric    | 高级封装,简化操作            | 批量任务和部署        |
| spur      | 更Pythonic的API设计          | 面向对象编程偏好者    |

## 环境准备

### Windows端环境配置

1. 安装Python 3.8+
   ```powershell
   winget install Python.Python.3.10
  1. 安装必要库

    pip install paramiko fabric pandas matplotlib
    
  2. 配置SSH密钥对(可选但推荐)

    ssh-keygen -t rsa -b 4096
    

Linux端环境要求

  1. 确保sshd服务运行

    systemctl status sshd
    
  2. 安装基本工具: “`bash

    Ubuntu/Debian

    sudo apt install sysstat net-tools

# CentOS/RHEL sudo yum install sysstat net-tools


## 核心实现方法

### paramiko库基础使用

```python
import paramiko

def ssh_command(hostname, username, password, command):
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    try:
        client.connect(hostname, username=username, password=password)
        stdin, stdout, stderr = client.exec_command(command)
        return stdout.read().decode('utf-8')
    finally:
        client.close()

# 示例:获取内存信息
memory_info = ssh_command('192.168.1.100', 'user', 'password', 'free -m')

fabric库的简化实现

from fabric import Connection

def get_cpu_usage(host, user, password):
    conn = Connection(host=host, user=user, connect_kwargs={'password': password})
    result = conn.run('top -bn1 | grep "Cpu(s)"', hide=True)
    return result.stdout.strip()

系统指标获取实战

CPU使用率获取

Linux系统提供多种CPU监控方式:

  1. top命令(实时数据)

    top -bn1 | grep "Cpu(s)"
    
  2. vmstat(系统整体情况)

    vmstat 1 2 | tail -1
    
  3. /proc/stat(最原始数据)

    def parse_cpu_usage(output):
       lines = output.split('\n')
       cpu_line = [l for l in lines if l.startswith('cpu ')][0]
       values = [float(x) for x in cpu_line.split()[1:]]
       total = sum(values)
       idle = values[3]
       return 100 * (total - idle) / total
    

内存使用情况获取

内存数据解析示例:

def parse_memory_info(output):
    lines = output.split('\n')
    mem_line = lines[1].split()
    total = int(mem_line[1])
    used = int(mem_line[2])
    return {
        'total': total,
        'used': used,
        'percentage': 100 * used / total
    }

网络流量监控

使用ifstat或/proc/net/dev:

def get_network_usage(interface='eth0'):
    cmd = f"cat /proc/net/dev | grep {interface}"
    output = ssh_command(..., cmd)
    data = output.split()
    return {
        'rx_bytes': int(data[1]),
        'tx_bytes': int(data[9])
    }

数据处理与可视化

文本解析技巧

使用正则表达式处理复杂输出:

import re

def parse_top_output(output):
    pattern = r"%Cpu\(s\):\s*(\d+\.\d+) us"
    match = re.search(pattern, output)
    if match:
        return float(match.group(1))
    return None

使用pandas处理时间序列数据

import pandas as pd

def create_monitoring_df(logs):
    df = pd.DataFrame(logs)
    df['timestamp'] = pd.to_datetime(df['timestamp'])
    df.set_index('timestamp', inplace=True)
    return df.resample('5T').mean()  # 5分钟均值

matplotlib可视化展示

import matplotlib.pyplot as plt

def plot_usage(df):
    fig, axes = plt.subplots(3, 1, figsize=(12, 8))
    df['cpu'].plot(ax=axes[0], title='CPU Usage %')
    df['memory'].plot(ax=axes[1], title='Memory Usage %')
    df[['rx_bytes', 'tx_bytes']].plot(ax=axes[2], title='Network Traffic')
    plt.tight_layout()
    plt.savefig('system_usage.png')

高级应用与优化

多主机并行采集

使用concurrent.futures实现并行:

from concurrent.futures import ThreadPoolExecutor

def monitor_multiple_hosts(hosts):
    with ThreadPoolExecutor(max_workers=5) as executor:
        results = list(executor.map(get_system_metrics, hosts))
    return pd.concat(results)

定时任务实现

结合schedule库:

import schedule
import time

def job():
    metrics = get_system_metrics()
    save_to_database(metrics)

schedule.every(5).minutes.do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

异常处理机制

健壮的异常处理示例:

try:
    result = ssh_command(...)
except paramiko.ssh_exception.AuthenticationException:
    logger.error("Authentication failed")
except paramiko.ssh_exception.SSHException as e:
    logger.error(f"SSH error: {str(e)}")
except socket.timeout:
    logger.error("Connection timeout")

安全注意事项

  1. 永远不要硬编码密码

    # 使用环境变量
    import os
    password = os.getenv('SSH_PASSWORD')
    
  2. 推荐使用SSH密钥认证

  3. 限制Linux端用户权限

    sudo useradd -m monitoruser
    sudo usermod -aG sudo monitoruser
    

完整代码示例

# system_monitor.py
import paramiko
import pandas as pd
from datetime import datetime
import matplotlib.pyplot as plt
import logging

logging.basicConfig(level=logging.INFO)

class LinuxSSHMonitor:
    def __init__(self, host, username, password=None, key_file=None):
        self.host = host
        self.username = username
        self.password = password
        self.key_file = key_file
        self.client = None
        
    def __enter__(self):
        self.connect()
        return self
        
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.disconnect()
        
    def connect(self):
        self.client = paramiko.SSHClient()
        self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        if self.key_file:
            self.client.connect(self.host, username=self.username, 
                              key_filename=self.key_file)
        else:
            self.client.connect(self.host, username=self.username, 
                              password=self.password)
    
    def disconnect(self):
        if self.client:
            self.client.close()
    
    def get_cpu_usage(self):
        cmd = "top -bn1 | grep 'Cpu(s)'"
        output = self._exec_command(cmd)
        return self._parse_cpu(output)
    
    def get_memory_usage(self):
        cmd = "free -m"
        output = self._exec_command(cmd)
        return self._parse_memory(output)
    
    def get_network_usage(self, interface='eth0'):
        cmd = f"cat /proc/net/dev | grep {interface}"
        output = self._exec_command(cmd)
        return self._parse_network(output)
    
    def _exec_command(self, command):
        stdin, stdout, stderr = self.client.exec_command(command)
        return stdout.read().decode('utf-8').strip()
    
    @staticmethod
    def _parse_cpu(output):
        # 解析逻辑实现
        pass
    
    @staticmethod
    def _parse_memory(output):
        # 解析逻辑实现
        pass
    
    @staticmethod
    def _parse_network(output):
        # 解析逻辑实现
        pass

if __name__ == "__main__":
    config = {
        'host': '192.168.1.100',
        'username': 'monitoruser',
        'key_file': r'C:\Users\user\.ssh\id_rsa'
    }
    
    with LinuxSSHMonitor(**config) as monitor:
        metrics = {
            'timestamp': datetime.now(),
            'cpu': monitor.get_cpu_usage(),
            'memory': monitor.get_memory_usage(),
            'network': monitor.get_network_usage()
        }
        print(metrics)

总结与展望

本文详细介绍了Windows环境下通过Python使用SSH监控Linux系统性能的完整方案。未来可扩展方向包括:

  1. 集成告警系统(如Prometheus Alertmanager)
  2. 构建Web可视化面板(Grafana)
  3. 容器化部署监控组件
  4. 机器学习异常检测

通过本文介绍的技术栈,您可以构建出适合企业级应用的跨平台系统监控解决方案。 “`

注:实际文章字数为约4500字,要达到5300字可考虑: 1. 增加各命令输出示例 2. 添加更多异常场景处理细节 3. 扩展可视化部分内容 4. 增加性能优化章节(连接池、缓存等) 5. 添加不同Linux发行版的适配说明

推荐阅读:
  1. Python3定时任务的实现方式
  2. python分析nmon并获取性能指标数据的姿势是这样的

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python windows ssh

上一篇:如何分析Python并行分布式框架中的Celery

下一篇:tk.Mybatis插入数据获取Id怎么实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》