初次学习,如有错误还请指正
目录
系统性能信息模块psutil
获取系统性能信息
CPU信息
内存信息
磁盘信息
网络信息
其他信息
进程信息
实用的IP地址处理模块IPy
IP地址、网段的基本处理
多网络计算方法
系统批量运维管理器paramiko
paramiko 的安装
Linux系统部署Python环境
1.安装环境
2.解压
3.编译
4.创建软目录
5.pip国内镜像源配置
6.pip安装psutil
paramiko 的核心组件
SSHClient 类
SFTPClinent类
系统基础信息采集模块作为监控模块的重要组成部分,能够帮助运维人员了解当前系统的健康程度,同时也是衡量业务的服务质量的依据,比如系统资源吃紧,会直接影响业务的服务质量及用户体验,另外获取设备的流量信息,也可以让运维人员更好地评估带宽、设资源是否应该扩容。
系统性能信息模块psutil
psutl是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要应用于系统监控,分析和限制系统资源及进程的管理。
pip install psutil
获取系统性能信息
采集系统的基本性能信息包括 CPU、内存、磁盘、网络等,可以完整描述当前系统的运行状态及质量。psutil模块已经封装了这些方法,用户可以根据自身的应用场景,调用相应的方法来满足需求,非常简单实用。
CPU信息
print("CPU完整信息:",psutil.cpu_times(percpu=True))
#更直观的看出核心数
for i in psutil.cpu_times(percpu=True):
print(i)
- 看用户进程CPU信息:
print('用户进程CPU信息:',psutil.cpu_times().user)
- 逻辑核心数:线程 / 物理核心数:核心
print('逻辑核心数:',psutil.cpu_count())
print('物理核心数:',psutil.cpu_count(logical=False))
内存信息
Linux 系统的内存利用率信息涉及total(内存总数)、used(已使用的内存数)、free(空闲内存数)、bufers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数)等,分别使用psutil.virtualmemory()与psutil.swapmemory()方法获取这些信息。
import psutil
mem = psutil.virtual_memory()
print('内存总容量:',mem.total)
print('内存已使用:',mem.used)
print('内存占用:',mem.percent)
print('剩余:',mem.free)
- 虚拟内存:
#虚拟内存
print('虚拟内存:',psutil.swap_memory())
磁盘信息
#磁盘信息
print('磁盘完整信息:',psutil.disk_partitions())
#直观方式:
for i in psutil.disk_partitions():
print(i)
- 获取单个盘:
print('E盘信息:',psutil.disk_usage('e://'))
- 磁盘读写信息:
print('磁盘读写信息:',psutil.disk_io_counters())
for i in psutil.disk_io_counters(perdisk=True).items():
print(i)
- 每块磁盘读写信息:counters内加上perdisk=True
print('每块磁盘读写信息:',psutil.disk_io_counters(perdisk=True))
网络信息
系统的网络信息与磁盘IO类似,涉及几个关键点,包括bytessent(发送字节数)、bytesrecv(接收字节数)、packetssent(发送数据包数)、packetsrecv(接收数据包数)等。这些网络信息使用psutil.netiocounters()方法获取。
- 获取网络信息
print('总网络信息:',psutil.net_io_counters())
每块网卡的网络信息:
print('每块网卡网络信息:',psutil.net_io_counters(pernic=True))
#直观
for i in psutil.net_io_counters(pernic=True).items():
print(i)
其他信息
- 当前登录用户
print('当前登录用户:',psutil.users())
- 系统开机时间
#引入包以转换时间格式
import datetime
print('系统开机时间:',psutil.boot_time())
print('系统开机时间格式:',datetime.datetime.fromtimestamp(psutil.boot_time()).strftime('%Y-%m-%d %H:%M:%S'))
进程信息
- 列出所有进程的pid:
print('正在运行的进程ID:',psutil.pids())
- 创建进程对象:
p = psutil.Process(1000)
print('进程名称:',p.name())
print('进程路径:',p.exe())
- 进入工作目录绝对路径(一般只在Linux中使用,在Windows中仅支持额外安装的程序使用):
print('进程绝对路径:',p.cwd())
- 查看进程状态 / 开启时间
import datetime
p = psutil.Process(1000)
print('进程名称:',p.name())
print('进程路径:',p.exe())
print('进程状态:',p.status())
print('进程开启时间:',datetime.datetime.fromtimestamp(p.create_time()).strftime('%Y-%m-%d %H:%M:%S'))
- 进程UID信息和GID信息(Linux中使用)
- 进程CPU时间:
p = psutil.Process(1000)
print('进程CPU时间:',p.cpu_times())
进程CPU亲和:
print('进程CPU亲和:',p.cpu_affinity)
- 进程利用率:
print('进程内存占用:',p.memory_percent())
print('进程rss和vms使用:',p.memory_info())
- 进程IO信息和开启的线程数
print('进程IO信息:',p.io_counters())
print('进程开启的线程数:',p.num_threads())
实用的IP地址处理模块IPy
IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能、可扩展性等方面,在这个过程当中,免不了要计算大量的地址,包括网段、网络掩码、广播地址、子网数、P类型等。Python 提供了一个强大的第三方模块IPy模块可以很好地辅助我们高效完成IP的规划工作。
IP地址、网段的基本处理
IPy模块包含IP类,使用它可以方便处理绝大部分格式为IPv6及IPv4的网络和地址。
- 获取版本号
from IPy import IP
#获取版本号
v1 = IP('192.168.128.128/32').version()
print(v1)
v2 = IP('::1').version()
print(v2)
- 获取网段地址
#获取网段地址
ip = IP('192.168.128.0/24')
print('地址数量:',ip.len())
- IP地址类型
#IP地址类型
print(IP('192.168.128.1/32').iptype())
print(IP('114.114.114.114/32').iptype())
print(IP('255.255.255.255/32').iptype())
print(IP('127.0.0.1/32').iptype())
- 反向解析地址格式
print(ip.reverseNames())
- IP地址格式转换
#IP地址格式
print(IP('192.168.1.0').make_net('255.255.255.0'))
print(IP('192.168.1.0/255.255.255.0',make_net=True))
print(IP('192.168.1.0-192.168.1.255',make_net=True))
- 也可以通过 strNormal方法指定不同 wantprefxlen参数值以定制不同输出类型的网段,输出类型为字符串。
print(IP('192.168.1.0/24').strNormal(0))
print(IP('192.168.1.0/24').strNormal(1))
print(IP('192.168.1.0/24').strNormal(2))
print(IP('192.168.1.0/24').strNormal(3))
多网络计算方法
- IP地址比较
# IP地址比较
print(IP('192.168.1.0/24')>IP('10.0.0.8'))
- 判断IP地址和网段是否包含于另一个网段中
print('192.168.2.128' in IP('192.168.1.0/24'))
- 判断两个网段是否存在重叠,采用IPy提供的overlaps方法,1代表重叠,0代表不重叠
print(IP('192.168.0.0/23').overlaps('192.168.1.0/24'))
print(IP('192.168.1.0/24').overlaps('192.168.2.0/24'))
- 根据输入的IP或子网返回网络、掩码、广播、反向解析、子网数、IP类型等信息。
#根据输入的IP或者子网给出对应的信息
ips = IP(input('请输入IP或者网段:'))
if len(ips)>1:
print('此为网段')
print('子网掩码:',ips.netmask())
print('网络号:',ips.net())
print('广播地址:',ips.broadcast())
print('地址数量:',len(ips))
else:
print('此为IP地址')
print('地址类型:',ips.iptype())
print('反向解析地址:',ips.reverseNames())
print('整数表示:',ips.int())
print('二进制表示:',ips.strBin())
print('十六进制表示:',ips.strHex())
系统批量运维管理器paramiko
paramiko 是基于Python 实现的SSH2远程安全连接,支持认证及密钥方式。可以实现远程命令执行、文件传输、中间 SSH代理等功能,相对于Pexpect,封装的层次更高,更贴近SSH协议的功能。
paramiko 的安装
Linux系统部署Python环境
1.安装环境
yum install -y openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel libffi-devel gcc gcc-c++
2.解压
将python3的linux压缩包移至linux内解压
tar zxvf Python-3.13.2.tgz
解压完进入python3.13.2目录
cd Python-3.13.2/
输入
./configure --prefix=/usr/local/python3
3.编译
make && make install
4.创建软目录
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip
之后可以检查一下是否安装完成
python3 --version
5.pip国内镜像源配置
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/
vim /root/.config/pip/pip.conf
文件内输入:
[global]
timeout=40
index-url=http://mirrors.aliyun.com/pypi/simple/
extra-index-url=
https://pypi.tuna.tsinghua.edu.cn/simple/
http://pypi.douban.com/simple/
http://pypi.mirrors.ustc.edu.cn/simple/
[install]
trusted-host=
pypi.tuna.tsinghua.edu.cn
mirrors.aliyun.com
pypi.douban.com
pypi.mirrors.ustc.edu.cn
6.pip安装psutil
pip install psutil
paramiko 的核心组件
paramiko模块包含两个核心组件,一个为SSHClient类,另一个为SFTPClient类。
SSHClient 类
SSHClient类是SSH服务会话的高级表示,该类封装了传输(transport)、通道(channel)及SFTPClient的校验、建立的方法,通常用于执行远程命令。
1.connect 方法
connect方法实现了远程SSH连接并校验。
下面四个比较重要:
hostname(str类型),连接的目标主机地址;
port(int类型),连接目标主机的端口,默认为22;
username(str类型),校验的用户名(默认为当前的本地用户名);
password(str类型),密码用于身份校验或解锁私钥;
其余:
pkey(PKey类型),私钥方式用于身份验证;
key_filename(str or list(str)类型),一个文件名或文件名的列表,用于私钥的身份验证:
timeout(foat类型),一个可选的超时时间(以秒为单位)的TCP连接;
allow_agent(bool类型),设置为False 时用于禁用连接到 SSH 代理;
look_for_keys(bool类型),设置为 False 时用来禁用在~/.ssh 中搜索私钥文件;
compress(bool类型),设置为 True 时打开压缩。
2.exec_command 方法
远程命令执行方法,该命令的输入与输出流为标准输人(stdin)、输出(stdout)、错误(stderr)的 Python文件对象。
exec_command(self, command, bufsize=-1)
说明:
command(str类型),执行的命令串;
bufsize(int类型),文件缓冲区大小,默认为-1(不限制)。
3.setmissinghostkeypolicy方法
设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种,别是AutoAddPolicy、RejectPolicy(默认)、WarningPolicy,仅限用于SSHClient类。
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
说明:
AutoAddPolicy,自动添加主机名及主机密钥到本地HostKeys对象,并将其保存;
RejectPolicy,自动拒绝未知的主机名和密钥;
WarningPolicy,用于记录一个未知的主机密钥的Python警告,并接受它,功能上与AutoAddPolicy相
似,但未知主机会有告警。
案例:创建ssh客户端远程指令free -m 获取内存状态信息
import paramiko
#目标主机IP
hosts = '192.168.112.122'
#端口
port= 22
#用户名
user = 'root'
#密码
pwd = '123123'
#上面的内容需要改为自己的
#生成日志文件和py源码在同一个目录
paramiko.util.log_to_file('system.log')
#创建一个ssh客户端
ssh_client = paramiko.SSHClient()
#定义连接策略,允许未知主机访问
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接服务器
ssh_client.connect(hostname=hosts,port=port,username=user,password=pwd,allow_agent=False)
#远程执行命令
stdin,stdout,stderr = ssh_client.exec_command('free -m')
#解析输出
for line in stdout:
print(line)
#关闭资源
stdin.close()
#关闭客户端
ssh_client.close()
日志的输出:
SFTPClinent类
SFTPClient作为一个 SFTP 客户端对象,根据SSH传输协议的sftp 会话,实现远程文件操作,比如文件上传、下载、权限、状态等操作。
- from_transport方法
创建一个已连同的SFTP客户端通道
from_transport(cls,t)
- put方法
上传本地文件到远程SFTP服务端
put(self,localpath,remotepath,callback=None,confirm=True)
说明
主要:
localpath(str类型),需上传的本地文件(源);
remotepath(str类型),远程路径(目标);
其他:
callback(function(int,int)),获取已接收的字节数及总传输字节数,以便回调函数调用默认为 None;
confirm(bool类型),文件上传完毕后是否调用stat()方法,以便确认文件的大小。
- get方法
从远程SFTP服务端下载文件到本地
get(self,remotepath,localpath,callback=None)
说明
主要:
remotepath(str 类型),需下载的远程文件(源);
localpath(str 类型),本地路径(目标);
其他:
callback(function(int,int)),获取已接收的字节数及总传输字节数,以便回调函数调用,默认为None。
- 其他方法
mkdir,在SFTP 服务器端创建目录,如 sftp.mkdir("/home/userdir",0755)。
remove,删除SFTP服务器端指定目录,如sftp.remove("/home/userdir")。
rename,重命名SFTP服务器端文件或目录,如sfp.rename("/home/test.sh","/home/testfile.sh")。
stat,获取远程 SFTP服务器端指定文件信息,如sfp.stat("/home/testflie.sh")。
listdir,获取远程 SFTP服务器端指定目录列表,以Python的列表(List)形式返回,如sftp.listdir("/home")。
案例:实现了文件上传、下载、创建与删除目录等,需要注意的是,put和 get方法需要指定文件名,不能省略。
import paramiko
username = 'root'
password = '145823'
hostname = '192.168.112.129'
port = 22
try:
#建立SSH传输连接
# Transport 创建一个 SSH 传输通道,连接到 hostname:port
t = paramiko.Transport((hostname,port))
t.connect()
#使用用户名和密码进行身份验证
t.connect(username=username,password=password)
#创建 SFTP 客户端
#从传输通道 t 创建一个 SFTP 客户端 sftp,用于文件操作。
sftp = paramiko.SFTPClient.from_transport(t)
#上传文件,我们这里就是用之前生成的system.log日志文件
sftp.put('system.log','/root/system.log')
#下载文件(需提前在linux中准备这个test1.txt文件或选择linux中的其他文件)
sftp.get('/root/test1.txt','D:\\PycharmProject\\code\\test1.txt')
#在/root目录中创建usrdir
sftp.mkdir('usrdir')
sftp.mkdir('usrdir2')
#重命名usrdir为testdir
sftp.rename('usrdir','testdir')
#删除usrdir2
sftp.rmdir('usrdir2')
#读取test1.txt属性信息
print(sftp.stat('test1.txt'))
#查看/root目录下的文件列表
print(sftp.listdir('./'))
t.close()
except Exception as err:
print(err)
我们可以在Xftp中直观的看到执行的结果:
执行前:
执行后:
THE END
如有遗漏,欢迎补充,感谢 !