文章目录

  • 前言
  • 一、python远程连接服务器
  • 1.由于paramiko属于第三方库,所以需要使用如下命令先行安装
  • 2.SSHClient常用的方法介绍
  • 3.基本使用
  • 二、结合linux命令查看服务器状态
  • 查看对应的linux命令返回值,通过返回值实现服务器监控
  • 总结



前言

因为近期思考自定义绘制服务器状态监控界面,不能在被监控服务器搭建服务,所以考虑通过python远程连接服务器执行相关命令获取服务器状态


一、python远程连接服务器

第一步是思考怎么采用python连接远程服务器,这里采用的是paramiko模块:

ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。
paramiko包含两个核心组件:SSHClient和SFTPClient。
SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。
SFTPClient的作用类似与Linux的sftp命令,是对SFTP客户端的封装,用以实现远程文件操作,如文件上传、下载、修改文件权限等操作。

有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。

1.由于paramiko属于第三方库,所以需要使用如下命令先行安装

pip install paramiko

2.SSHClient常用的方法介绍

connect():实现远程服务器的连接与认证,对于该方法只有hostname是必传参数。

常用参数
hostname 连接的目标主机
port=SSH_PORT 指定端口
username=None 验证的用户名
password=None 验证的用户密码
pkey=None 私钥方式用于身份验证
key_filename=None 一个文件名或文件列表,指定私钥文件
timeout=None 可选的tcp连接超时时间
allow_agent=True, 是否允许连接到ssh代理,默认为True 允许
look_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许
compress=False, 是否打开压缩

set_missing_host_key_policy():设置远程服务器没有在know_hosts文件中记录时的应对策略。目前支持三种策略:

设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:
AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认
WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接
RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项

exec_command():在远程服务器执行Linux命令的方法。
open_sftp():在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。

利用SSHClient对象的open_sftp()方法,可以直接返回一个基于当前连接的sftp对象,可以进行文件的上传等操作.
sftp = client.open_sftp()
sftp.put(‘test.txt’,‘text.txt’)

3.基本使用

import paramiko
#实例化SSHClient
client = paramiko.SSHClient()
# 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接SSH服务端,以用户名和密码进行认证
client.connect(hostname='10.8.250.71', port=22, username='tboss', password='123456')
# 打开一个Channel并执行命令
stdin, stdout, stderr = client.exec_command('df -h ')  # stdout 为正确输出,stderr为错误输出,同时是有1个变量有值
# 打印执行结果
print(stdout.read().decode('utf-8'))
# 使用stdout.readlines()则直接返回list
print(stdout.readlines())

密钥连接方式参考:

# 配置私人密钥文件位置
private = paramiko.RSAKey.from_private_key_file('/Users/ch/.ssh/id_rsa')
#实例化SSHClient
client = paramiko.SSHClient()
#自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接SSH服务端,以用户名和密码进行认证
client.connect(hostname='10.0.0.1',port=22,username='root',pkey=private)

二、结合linux命令查看服务器状态

查看对应的linux命令返回值,通过返回值实现服务器监控

代码如下(示例):

import paramiko

import re,time

class moniter():
def init(self, ip=‘10.8.250.01’, port=22, name=‘user’, pwd=‘123456’):
self.ip = ip
self.port = port
self.name = name
self.pwd = pwd
# 建立ssh连接
self.client = paramiko.SSHClient()
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.client.connect(self.ip, self.port, self.name, self.pwd)

"""
内存监控
"""

def mem_info(self):
    stdout = self.client.exec_command("cat /proc/meminfo", )[1]
    content = stdout.readlines()
    mems={}
    for line in content:
        fields = line.split()
        mems[fields[0]] = int(fields[1]) * 1024
    MemTotal = mems['MemTotal:']
    MemFree = mems['MemFree:']
    Buffers = mems['Buffers:']
    Cached = mems['Cached:']
    SwapCached = mems['SwapCached:']
    SwapTotal = mems['SwapTotal:']
    SwapFree = mems['SwapFree:']
    print('******************************内存监控*********************************')
    print("*******************时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "******************")
    print("总内存:", MemTotal)
    print("空闲内存:", MemFree)
    print("给文件的缓冲大小:", Buffers)
    print("高速缓冲存储器使用的大小:", Cached)
    print("被高速缓冲存储用的交换空间大小:", SwapCached)
    print("给文件的缓冲大小:", Buffers)
    if int(SwapTotal) == 0:
        print(u"交换内存总共为:0")

    else:
        Rate_Swap = 100 - 100 * int(SwapFree) / float(SwapTotal)
        print(u"交换内存利用率:", Rate_Swap)
    Free_Mem = int(MemFree) + int(Buffers) + int(Cached)
    Used_Mem = int(MemTotal) - Free_Mem
    Rate_Mem = 100 * Used_Mem / float(MemTotal)
    print(u"内存利用率:", str("%.2f" % Rate_Mem), "%")

"""
内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息
"""

def vm_stat_info(self):
    '''
    vmstat 1 1 | tail -n 1 的返回值按照顺序排序
    r:等待执行的任务数.展示了正在执行和等待cpu资源的任务个数。当这个值超过了cpu个数,就会出现cpu瓶颈。
    b: 等待IO的进程数量
    swpd: 正在使用虚拟的内存大小,单位k
    free: 空闲内存大小,单位k
    buff: 已用的buff大小,对块设备的读写进行缓冲
    cache: 已用的cache大小,文件系统的cache
    si: 每秒从交换区写入内存的大小(单位:kb/s)
    so: 每秒从内存写到交换区的大小
    bi: 每秒读取的块数(读磁盘)
    bo: 每秒写入的块数(写磁盘)
    in: 每秒中断数,包括时钟中断
    cs: 每秒上下文切换数
    us: 用户进程执行消耗cpu时间(user time)
    sy: 系统进程消耗cpu时间(system time)
    id: 空闲时间(包括IO等待时间)
    wa: 等待IO时间
    st: 虚拟机占用的时间百分比,一般不关注
    '''
    stdout = self.client.exec_command("vmstat 1 1 | tail -n 1", )[1]
    content = stdout.readlines()
    fields = content[0].split()
    processes_waiting = fields[0]
    processes_sleep = fields[1]
    swpd = fields[2]
    free = fields[3]
    buff = fields[4]
    cache = fields[5]
    si = fields[6]
    so = fields[7]
    io_bi = fields[8]
    io_bo = fields[9]
    system_interrupt = fields[10]
    system_context_switch = fields[11]
    cpu_user = fields[12]
    cpu_sys = fields[13]
    cpu_idle = fields[14]
    cpu_wait = fields[15]
    st = fields[16]
    print('****************************内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息监控****************************')
    print("*******************时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "******************")
    print("等待运行进程的数量:", processes_waiting)
    print("处于不间断状态的进程:", processes_sleep)
    print("使用虚拟内存(swap)的总量:", swpd)
    print("空闲的内存总量:", free)
    print("用作缓冲的内存总量:", buff)
    print("用作缓存的内存总量:", cache)
    print("交换出内存总量 :", si)
    print("交换入内存总量 :", so)
    print("从一个块设备接收:", io_bi)
    print("发送到块设备:", io_bo)
    print("每秒的中断数:", system_interrupt)
    print("每秒的上下文切换数:", system_context_switch)
    print("用户空间上进程运行的时间百分比:", cpu_user)
    print("内核空间上进程运行的时间百分比:", cpu_sys)
    print("闲置时间百分比:", cpu_idle)
    print("等待IO的时间百分比:", cpu_wait)
    print("从虚拟机偷取的时间百分比:", st)

'''
cpu监控
'''

def cpu_info(self):
    '''
    cat /proc/cpuinfo 详解
    processor: 处理器
    vendor_id :CPU制造商
    cpu family :CPU产品系列代号
    model   :CPU属于其系列中的哪一代的代号
    model name:CPU属于的名字及其编号、标称主频
    stepping   :CPU属于制作更新版本
    cpu MHz   :CPU的实际使用主频
    cache size   :CPU二级缓存大小
    physical id   :单个CPU的标号
    siblings      :单个CPU逻辑物理核数
    core id      :当前物理核在其所处CPU中的编号,这个编号不一定连续.
    cpu cores   :该逻辑核所处CPU的物理核数
    apicid        :用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续.
    fpu           :是否具有浮点运算单元(Floating Point Unit)
    fpu_exception  :是否支持浮点计算异常
    cpuid level  :执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容.
    wp           :表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection)
    flags         :当前CPU支持的功能
    bogomips   :在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second)
    clflush size  :每次刷新缓存的大小单位
    cache_alignment :缓存地址对齐单位
    address sizes    :可访问地址空间位数
    power management :对能源管理的支持
    '''
    stdout = self.client.exec_command("cat /proc/cpuinfo", )[1]
    content = stdout.readlines()
    print('***************************************cpu监控***************************************')
    print("*******************时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "******************")
    temporary = {}
    cpuinfoiList = []
    for it in content :
        if it=='\n':
            cpuinfoiList.append(temporary)
            temporary={}
        else:
            it = it.replace('\t','').replace('\n','')
            temporary[it.split(':')[0]] = it.split(':')[1]
    for CPUinfo in cpuinfoiList:
        print("CPU属于的编号:", CPUinfo['processor'])
        print("CPU制造商:", CPUinfo['vendor_id'])
        print("CPU产品系列代号:", CPUinfo['cpu family'])
        print("CPU属于其系列中的哪一代的代号:", CPUinfo['model'])
        print("CPU属于的名字及其编号、标称主频:", CPUinfo['model name'])
        print("CPU属于制作更新版本:", CPUinfo['stepping'])
        print("CPU的实际使用主频:", CPUinfo['cpu MHz'])
        print("CPU二级缓存大小:", CPUinfo['cache size'])
        print("单个CPU的标号:", CPUinfo['physical id'])
        print("单个CPU逻辑物理核数:", CPUinfo['siblings'])
        print("当前物理核在其所处CPU中的编号,这个编号不一定连续.:", CPUinfo['core id'])
        print("该逻辑核所处CPU的物理核数:", CPUinfo['cpu cores'])
        print("用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续:", CPUinfo['apicid'])
        print("是否具有浮点运算单元(Floating Point Unit):", CPUinfo['fpu'])
        print("是否支持浮点计算异常:", CPUinfo['fpu_exception'])
        print("执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容.:", CPUinfo['cpuid level'])
        print("表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection):", CPUinfo['wp'])
        print("当前CPU支持的功能:", CPUinfo['flags'])
        print("在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second):", CPUinfo['bogomips'])
        print("每次刷新缓存的大小单位:", CPUinfo['clflush size'])
        print("缓存地址对齐单位:", CPUinfo['cache_alignment'])
        print("可访问地址空间位数:", CPUinfo['address sizes'])
        print("对能源管理的支持:", CPUinfo['power management'])
"""
负载均衡
"""


def load_stat(self):
    stdout = self.client.exec_command("cat /proc/loadavg", )[1]
    content = stdout.readlines()
    loadavgs = content[0].strip().split()
    print('************************负载均衡监控****************************')
    print('"*******************时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "******************"')
    print("系统5分钟前的平均负载:", loadavgs[0])
    print("系统10分钟前的平均负载:", loadavgs[1])
    print("系统15分钟前的平均负载:", loadavgs[2])
    print("分子是正在运行的进程数,分母为总进程数:", loadavgs[3])
    print("最近运行的进程id:", loadavgs[4])

"""
获取网络接口的输入和输出
"""


def ionetwork(self):
    stdout = self.client.exec_command("cat /proc/net/dev", )[1]
    content = stdout.readlines()
    print('************************获取网络接口的输入和输出监控****************************')
    print("*******************时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "******************")
    net = {}
    for line in content[2:]:
        line = line.strip().split(":")
        eth_name = line[0].strip()
        net_io = {}
        net_io['Receive(收包的字节数)'] = round(float(line[1].split()[0]) / (1024.0 * 1024.0), 2)
        net_io['packets(收包正确的包量)'] = round(float(line[1].split()[1]) / (1024.0 * 1024.0), 2)
        net_io['errs(收包错误的包量)'] = round(float(line[1].split()[2]) / (1024.0 * 1024.0), 2)
        net_io['drop(收包丢弃的包量)'] = round(float(line[1].split()[3]) / (1024.0 * 1024.0), 2)
        net_io['Transmit(发包的字节数)'] = round(float(line[1].split()[8]) / (1024.0 * 1024.0), 2)
        net_io['packets(发包正确的包量)'] = round(float(line[1].split()[9]) / (1024.0 * 1024.0), 2)
        net_io['errs(发包错误的包量)'] = round(float(line[1].split()[10]) / (1024.0 * 1024.0), 2)
        net_io['drop(发包丢弃的包量)'] = round(float(line[1].split()[11]) / (1024.0 * 1024.0), 2)
        net[eth_name] = net_io
    for it in net.items():
        print(it)

""" 
磁盘空间监控
"""

def disk_stat(self):
    stdout = self.client.exec_command("df -h", )[1]
    content = stdout.readlines()
    print('************************磁盘空间监控****************************')

    print("*******************时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "******************")

    for i in content[1:]:
        i = i.replace('\n','').split()
        print("\t文件系统:", i[0],)
        print("\t容量:", i[1],)
        print("\t已用:", i[2],)
        print("\t可用:", i[3],)
        print("\t已用%挂载点:", i[4])

""" 
端口监控
一般是远程服务器用户名用户
"""

def getComStr(self):
    stdout = self.client.exec_command("netstat -tpln", )[1]
    content = stdout.readlines()
    print('content', content)
    print('******************************端口监控*********************************')
    print("*******************时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "******************")
    for i in content[1:]:
        i = i.replace('\n', '').split()
        print('Proto:',i[0])
        print('Recv-Q:',i[1])
        print('Send-Q:',i[2])
        print('Local Address:',i[3])
        print('Foreign Address:',i[4])
        print('State:',i[5])
        print(' PID/Program name:',i[6])

moniter().mem_info()
moniter().vm_stat_info()
moniter().cpu_info()
moniter().load_stat()
moniter().ionetwork()
moniter().disk_stat()
moniter().getComStr()

运行结果

内存监控***
 *******************时间: 2021-06-09 16:07:32 ******************
 总内存: 33730478080
 空闲内存: 30524903424
 给文件的缓冲大小: 327045120
 高速缓冲存储器使用的大小: 1392988160
 被高速缓冲存储用的交换空间大小: 0
 给文件的缓冲大小: 327045120
 交换内存利用率: 0.0
 内存利用率: 4.40 %
内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息监控
 *******************时间: 2021-06-09 16:07:33 ******************
 等待运行进程的数量: 0
 处于不间断状态的进程: 0
 使用虚拟内存(swap)的总量: 0
 空闲的内存总量: 29808196
 用作缓冲的内存总量: 319380
 用作缓存的内存总量: 1579588
 交换出内存总量 : 0
 交换入内存总量 : 0
 从一个块设备接收: 0
 发送到块设备: 1
 每秒的中断数: 2
 每秒的上下文切换数: 2
 用户空间上进程运行的时间百分比: 0
 内核空间上进程运行的时间百分比: 0
 闲置时间百分比: 100
 等待IO的时间百分比: 0
 从虚拟机偷取的时间百分比: 0
cpu监控
 ************时间: 2021-06-09 16:07:34 ******************
 CPU属于的编号: 0
 CPU制造商: GenuineIntel
 CPU产品系列代号: 6
 CPU属于其系列中的哪一代的代号: 63
 CPU属于的名字及其编号、标称主频: Intel® Xeon® CPU E5-2680 v3 @ 2.50GHz
 CPU属于制作更新版本: 2
 CPU的实际使用主频: 2499.998
 CPU二级缓存大小: 30720 KB
 单个CPU的标号: 0
 单个CPU逻辑物理核数: 1
 当前物理核在其所处CPU中的编号,这个编号不一定连续.: 0
 该逻辑核所处CPU的物理核数: 1
 用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续: 0
 是否具有浮点运算单元(Floating Point Unit): yes
 是否支持浮点计算异常: yes
 执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容.: 15
 表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection): yes
 当前CPU支持的功能: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm cpuid_fault invpcid_single pti ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt arat arch_capabilities
 在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second): 4999.99
 每次刷新缓存的大小单位: 64
 缓存地址对齐单位: 64
 可访问地址空间位数: 43 bits physical, 48 bits virtual
 对能源管理的支持:
 CPU属于的编号: 1
 CPU制造商: GenuineIntel
 CPU产品系列代号: 6
 CPU属于其系列中的哪一代的代号: 63
 CPU属于的名字及其编号、标称主频: Intel® Xeon® CPU E5-2680 v3 @ 2.50GHz
 CPU属于制作更新版本: 2
 CPU的实际使用主频: 2499.998
 CPU二级缓存大小: 30720 KB
 单个CPU的标号: 2
 单个CPU逻辑物理核数: 1
 当前物理核在其所处CPU中的编号,这个编号不一定连续.: 0
 该逻辑核所处CPU的物理核数: 1
 用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续: 2
 是否具有浮点运算单元(Floating Point Unit): yes
 是否支持浮点计算异常: yes
 执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容.: 15
 表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection): yes
 当前CPU支持的功能: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm cpuid_fault invpcid_single pti ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt arat arch_capabilities
 在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second): 4999.99
 每次刷新缓存的大小单位: 64
 缓存地址对齐单位: 64
 可访问地址空间位数: 43 bits physical, 48 bits virtual
 对能源管理的支持:
 CPU属于的编号: 2
 CPU制造商: GenuineIntel
 CPU产品系列代号: 6
 CPU属于其系列中的哪一代的代号: 63
 CPU属于的名字及其编号、标称主频: Intel® Xeon® CPU E5-2680 v3 @ 2.50GHz
 CPU属于制作更新版本: 2
 CPU的实际使用主频: 2499.998
 CPU二级缓存大小: 30720 KB
 单个CPU的标号: 4
 单个CPU逻辑物理核数: 1
 当前物理核在其所处CPU中的编号,这个编号不一定连续.: 0
 该逻辑核所处CPU的物理核数: 1
 用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续: 4
 是否具有浮点运算单元(Floating Point Unit): yes
 是否支持浮点计算异常: yes
 执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容.: 15
 表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection): yes
 当前CPU支持的功能: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm cpuid_fault invpcid_single pti ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt arat arch_capabilities
 在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second): 4999.99
 每次刷新缓存的大小单位: 64
 缓存地址对齐单位: 64
 可访问地址空间位数: 43 bits physical, 48 bits virtual
 对能源管理的支持:
 CPU属于的编号: 3
 CPU制造商: GenuineIntel
 CPU产品系列代号: 6
 CPU属于其系列中的哪一代的代号: 63
 CPU属于的名字及其编号、标称主频: Intel® Xeon® CPU E5-2680 v3 @ 2.50GHz
 CPU属于制作更新版本: 2
 CPU的实际使用主频: 2499.998
 CPU二级缓存大小: 30720 KB
 单个CPU的标号: 6
 单个CPU逻辑物理核数: 1
 当前物理核在其所处CPU中的编号,这个编号不一定连续.: 0
 该逻辑核所处CPU的物理核数: 1
 用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续: 6
 是否具有浮点运算单元(Floating Point Unit): yes
 是否支持浮点计算异常: yes
 执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容.: 15
 表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection): yes
 当前CPU支持的功能: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm cpuid_fault invpcid_single pti ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt arat arch_capabilities
 在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second): 4999.99
 每次刷新缓存的大小单位: 64
 缓存地址对齐单位: 64
 可访问地址空间位数: 43 bits physical, 48 bits virtual
 对能源管理的支持:
 CPU属于的编号: 4
 CPU制造商: GenuineIntel
 CPU产品系列代号: 6
 CPU属于其系列中的哪一代的代号: 63
 CPU属于的名字及其编号、标称主频: Intel® Xeon® CPU E5-2680 v3 @ 2.50GHz
 CPU属于制作更新版本: 2
 CPU的实际使用主频: 2499.998
 CPU二级缓存大小: 30720 KB
 单个CPU的标号: 8
 单个CPU逻辑物理核数: 1
 当前物理核在其所处CPU中的编号,这个编号不一定连续.: 0
 该逻辑核所处CPU的物理核数: 1
 用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续: 8
 是否具有浮点运算单元(Floating Point Unit): yes
 是否支持浮点计算异常: yes
 执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容.: 15
 表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection): yes
 当前CPU支持的功能: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm cpuid_fault invpcid_single pti ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt arat arch_capabilities
 在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second): 4999.99
 每次刷新缓存的大小单位: 64
 缓存地址对齐单位: 64
 可访问地址空间位数: 43 bits physical, 48 bits virtual
 对能源管理的支持:
 CPU属于的编号: 5
 CPU制造商: GenuineIntel
 CPU产品系列代号: 6
 CPU属于其系列中的哪一代的代号: 63
 CPU属于的名字及其编号、标称主频: Intel® Xeon® CPU E5-2680 v3 @ 2.50GHz
 CPU属于制作更新版本: 2
 CPU的实际使用主频: 2499.998
 CPU二级缓存大小: 30720 KB
 单个CPU的标号: 10
 单个CPU逻辑物理核数: 1
 当前物理核在其所处CPU中的编号,这个编号不一定连续.: 0
 该逻辑核所处CPU的物理核数: 1
 用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续: 10
 是否具有浮点运算单元(Floating Point Unit): yes
 是否支持浮点计算异常: yes
 执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容.: 15
 表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection): yes
 当前CPU支持的功能: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm cpuid_fault invpcid_single pti ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt arat arch_capabilities
 在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second): 4999.99
 每次刷新缓存的大小单位: 64
 缓存地址对齐单位: 64
 可访问地址空间位数: 43 bits physical, 48 bits virtual
 对能源管理的支持:
 CPU属于的编号: 6
 CPU制造商: GenuineIntel
 CPU产品系列代号: 6
 CPU属于其系列中的哪一代的代号: 63
 CPU属于的名字及其编号、标称主频: Intel® Xeon® CPU E5-2680 v3 @ 2.50GHz
 CPU属于制作更新版本: 2
 CPU的实际使用主频: 2499.998
 CPU二级缓存大小: 30720 KB
 单个CPU的标号: 12
 单个CPU逻辑物理核数: 1
 当前物理核在其所处CPU中的编号,这个编号不一定连续.: 0
 该逻辑核所处CPU的物理核数: 1
 用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续: 12
 是否具有浮点运算单元(Floating Point Unit): yes
 是否支持浮点计算异常: yes
 执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容.: 15
 表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection): yes
 当前CPU支持的功能: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm cpuid_fault invpcid_single pti ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt arat arch_capabilities
 在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second): 4999.99
 每次刷新缓存的大小单位: 64
 缓存地址对齐单位: 64
 可访问地址空间位数: 43 bits physical, 48 bits virtual
 对能源管理的支持:
 CPU属于的编号: 7
 CPU制造商: GenuineIntel
 CPU产品系列代号: 6
 CPU属于其系列中的哪一代的代号: 63
 CPU属于的名字及其编号、标称主频: Intel® Xeon® CPU E5-2680 v3 @ 2.50GHz
 CPU属于制作更新版本: 2
 CPU的实际使用主频: 2499.998
 CPU二级缓存大小: 30720 KB
 单个CPU的标号: 14
 单个CPU逻辑物理核数: 1
 当前物理核在其所处CPU中的编号,这个编号不一定连续.: 0
 该逻辑核所处CPU的物理核数: 1
 用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续: 14
 是否具有浮点运算单元(Floating Point Unit): yes
 是否支持浮点计算异常: yes
 执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容.: 15
 表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection): yes
 当前CPU支持的功能: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm cpuid_fault invpcid_single pti ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt arat arch_capabilities
 在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second): 4999.99
 每次刷新缓存的大小单位: 64
 缓存地址对齐单位: 64
 可访问地址空间位数: 43 bits physical, 48 bits virtual
 对能源管理的支持:
负载均衡监控
 "时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), ""
 系统5分钟前的平均负载: 0.01
 系统10分钟前的平均负载: 0.02
 系统15分钟前的平均负载: 0.00
 分子是正在运行的进程数,分母为总进程数: 1/421
 最近运行的进程id: 20825
获取网络接口的输入和输出监控
 ***************时间: 2021-06-09 16:07:35 ******************
 (‘ens160’, {‘Receive(收包的字节数)’: 546.54, ‘packets(收包正确的包量)’: 3.4, ‘errs(收包错误的包量)’: 0.0, ‘drop(收包丢弃的包量)’: 0.0, ‘Transmit(发包的字节数)’: 487.53, ‘packets(发包正确的包量)’: 0.72, ‘errs(发包错误的包量)’: 0.0, ‘drop(发包丢弃的包量)’: 0.0})
 (‘vethaea249b’, {‘Receive(收包的字节数)’: 620.43, ‘packets(收包正确的包量)’: 3.15, ‘errs(收包错误的包量)’: 0.0, ‘drop(收包丢弃的包量)’: 0.0, ‘Transmit(发包的字节数)’: 654.3, ‘packets(发包正确的包量)’: 2.74, ‘errs(发包错误的包量)’: 0.0, ‘drop(发包丢弃的包量)’: 0.0})
 (‘docker0’, {‘Receive(收包的字节数)’: 576.35, ‘packets(收包正确的包量)’: 3.15, ‘errs(收包错误的包量)’: 0.0, ‘drop(收包丢弃的包量)’: 0.0, ‘Transmit(发包的字节数)’: 654.28, ‘packets(发包正确的包量)’: 2.74, ‘errs(发包错误的包量)’: 0.0, ‘drop(发包丢弃的包量)’: 0.0})
 (‘lo’, {‘Receive(收包的字节数)’: 1313.09, ‘packets(收包正确的包量)’: 7.38, ‘errs(收包错误的包量)’: 0.0, ‘drop(收包丢弃的包量)’: 0.0, ‘Transmit(发包的字节数)’: 1313.09, ‘packets(发包正确的包量)’: 7.38, ‘errs(发包错误的包量)’: 0.0, ‘drop(发包丢弃的包量)’: 0.0})
磁盘空间监控
 **时间: 2021-06-09 16:07:36 ******************
 文件系统: udev
 容量: 16G
 已用: 0
 可用: 16G
 已用%挂载点: 0%
 文件系统: tmpfs
 容量: 3.2G
 已用: 1.1M
 可用: 3.2G
 已用%挂载点: 1%
 文件系统: /dev/mapper/ubuntu–vg-ubuntu–lv
 容量: 31G
 已用: 13G
 可用: 17G
 已用%挂载点: 43%
 文件系统: tmpfs
 容量: 16G
 已用: 4.0K
 可用: 16G
 已用%挂载点: 1%
 文件系统: tmpfs
 容量: 5.0M
 已用: 0
 可用: 5.0M
 已用%挂载点: 0%
 文件系统: tmpfs
 容量: 16G
 已用: 0
 可用: 16G
 已用%挂载点: 0%
 文件系统: /dev/sda2
 容量: 976M
 已用: 148M
 可用: 762M
 已用%挂载点: 17%
 文件系统: tmpfs
 容量: 3.2G
 已用: 0
 可用: 3.2G
 已用%挂载点: 0%
 content [‘Active Internet connections (only servers)\n’, ‘Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name \n’, 'tcp 0 0 0.0.0.0:5557 0.0.0.0: LISTEN 17186/python3 \n’, 'tcp 0 0 127.0.0.53:53 0.0.0.0: LISTEN - \n’, 'tcp 0 0 0.0.0.0:22 0.0.0.0: LISTEN - \n’, 'tcp 0 0 10.8.250.71:8089 0.0.0.0: LISTEN 17186/python3 \n’, 'tcp 0 0 127.0.0.1:6010 0.0.0.0: LISTEN - \n’, 'tcp 0 0 127.0.0.1:36539 0.0.0.0: LISTEN - \n’, 'tcp 0 0 10.8.250.71:8000 0.0.0.0: LISTEN - \n’, 'tcp 0 0 127.0.0.1:3306 0.0.0.0: LISTEN - \n’, 'tcp 0 0 0.0.0.0:6379 0.0.0.0: LISTEN - \n’, 'tcp 0 0 0.0.0.0:80 0.0.0.0: LISTEN - \n’, 'tcp6 0 0 :::22 ::: LISTEN - \n’, 'tcp6 0 0 ::1:6010 ::: LISTEN - \n’, 'tcp6 0 0 :::4444 ::: LISTEN - \n’, 'tcp6 0 0 :::80 ::: LISTEN - \n’]
端口监控
 *****时间: 2021-06-09 16:07:37 ******************
 Proto: Proto
 Recv-Q: Recv-Q
 Send-Q: Send-Q
 Local Address: Local
 Foreign Address: Address
 State: Foreign
 PID/Program name: Address
 Proto: tcp
 Recv-Q: 0
 Send-Q: 0
 Local Address: 0.0.0.0:5557
 Foreign Address: 0.0.0.0:
 State: LISTEN
 PID/Program name: 17186/python3
 Proto: tcp
 Recv-Q: 0
 Send-Q: 0
 Local Address: 127.0.0.53:53
 Foreign Address: 0.0.0.0:
 State: LISTEN
 PID/Program name: -
 Proto: tcp
 Recv-Q: 0
 Send-Q: 0
 Local Address: 0.0.0.0:22
 Foreign Address: 0.0.0.0:
 State: LISTEN
 PID/Program name: -
 Proto: tcp
 Recv-Q: 0
 Send-Q: 0
 Local Address: 10.8.250.71:8089
 Foreign Address: 0.0.0.0:
 State: LISTEN
 PID/Program name: 17186/python3
 Proto: tcp
 Recv-Q: 0
 Send-Q: 0
 Local Address: 127.0.0.1:6010
 Foreign Address: 0.0.0.0:
 State: LISTEN
 PID/Program name: -
 Proto: tcp
 Recv-Q: 0
 Send-Q: 0
 Local Address: 127.0.0.1:36539
 Foreign Address: 0.0.0.0:
 State: LISTEN
 PID/Program name: -
 Proto: tcp
 Recv-Q: 0
 Send-Q: 0
 Local Address: 10.8.250.71:8000
 Foreign Address: 0.0.0.0:
 State: LISTEN
 PID/Program name: -
 Proto: tcp
 Recv-Q: 0
 Send-Q: 0
 Local Address: 127.0.0.1:3306
 Foreign Address: 0.0.0.0:
 State: LISTEN
 PID/Program name: -
 Proto: tcp
 Recv-Q: 0
 Send-Q: 0
 Local Address: 0.0.0.0:6379
 Foreign Address: 0.0.0.0:
 State: LISTEN
 PID/Program name: -
 Proto: tcp
 Recv-Q: 0
 Send-Q: 0
 Local Address: 0.0.0.0:80
 Foreign Address: 0.0.0.0:
 State: LISTEN
 PID/Program name: -
 Proto: tcp6
 Recv-Q: 0
 Send-Q: 0
 Local Address: :::22
 Foreign Address: :::
 State: LISTEN
 PID/Program name: -
 Proto: tcp6
 Recv-Q: 0
 Send-Q: 0
 Local Address: ::1:6010
 Foreign Address: :::
 State: LISTEN
 PID/Program name: -
 Proto: tcp6
 Recv-Q: 0
 Send-Q: 0
 Local Address: :::4444
 Foreign Address: :::
 State: LISTEN
 PID/Program name: -
 Proto: tcp6
 Recv-Q: 0
 Send-Q: 0
 Local Address: :::80
 Foreign Address: :::
 State: LISTEN
 PID/Program name: -

总结


以上就是今天的内容,本文仅仅简单介绍了paramiko的使用,并且结合linux命令可以实现对服务器状态的监控,可以扩展自己想要监听的内容。