loguru使用
# https://blog.csdn.net/lixiang5453/article/details/121217148
# pip3 install loguru
from loguru import logger
# 配置日志输出
log_format = "<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>"
log_path = "logs/"
log_filename = log_path + "app_{time:YYYY-MM-DD}.log"
logger.remove() # 移除默认的日志输出
logger.add(log_filename, rotation="00:00", retention="7 days", format=log_format, level="INFO")
# 在上面的示例代码中,我们首先导入Loguru库,然后配置日志的输出格式、保存路径以及日志文件名。通过logger.add方法,我们指定了日志文件的切分方式为每天(rotation="00:00"),保留7天的日志(retention="7 days"),以及日志的格式和输出级别。接着,我们使用不同级别的日志函数写入日志消息。
# 日志将会根据日期自动切分,并保存在指定的目录中。例如,如果今天是2023年8月18日,那么生成的日志文件名将为app_2023-08-18.log,并且在接下来的7天内保留。
PyWinRM
# PyWinRM是远程管理windows的pyhton模块
# pip install pywinrm
# windows启动
winrm quickconfig -q
# PyWinRM操作windows
import winrm
s = winrm.Session('10.244.14.24:5985', auth=('username', 'passwd'), transport='ntlm')
r = s.run_cmd('whoami')
r.status_code # 0 为正常
r.std_out # bytes 得到的正常执行结果
r.std_err # bytes 无异常消息为空字节串
# run_cmd执行cmd命令
# run_ps执行PowerShell脚本
# copy_file上传下载文件
import winrm
# 构造远程会话
session = winrm.Session(
target='http://remote-host:5985/wsman',
auth=('username', 'password'),
transport='ntlm'
)
'''
target: 要连接的远程主机地址。可以是主机名或 IP 地址。
auth: 指定身份验证方式的参数。这通常是一个包含用户名和密码的元组,例如:("username", "password")。
ransport: 指定远程连接的传输方式。可以是 "ntlm"(默认)
transport_timeout:连接超时时间,以秒为单位。
'''
# 执行远程命令
result = session.run_ps('Get-Process')
print(result.status_code)
print(result.std_out)
print(result.std_err)
paramiko
import paramiko
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在~/.ssh/known_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='10.0.0.88', port=22, username='root', password='1')
# 执行命令,不要执行top之类的在不停的刷新的命令
stdin, stdout, stderr = ssh.exec_command('df -h')
# 获取命令结果
result = stdout.read()
# 获取的命令结果是bytes类型
print(result.decode(encoding="utf-8"))
# 关闭连接
ssh.close()
批量上传文件
# https://blog.csdn.net/Sxiaokun/article/details/124070120
import paramiko
def sftp(hostname, username, password, port, local, remoted):
# 创建ssh连接
ssh_conn = paramiko.Transport((hostname, port))
ssh_conn.connect(username=username, password=password)
# 创建ftp工具(变量)
ftp = paramiko.SFTPClient.from_transport(ssh_conn)
# 上传文件
ftp.put(local, remoted)
# 关闭ssh连接
ssh_conn.close()
if __name__ == '__main__':
servers = {
"10.0.0.88": {
"username": "root",
"password": "1",
"port": 22,
},
"10.0.0.80": {
"username": "root",
"password": "1",
"port": 22,
},
}
source_file = r'D:\项目文件\测试\1.zip'
remote_dir = '/opt/1.zip'
for ip, info in servers.items():
sftp(
hostname=ip,
username=info.get('username'),
password=info.get('password'),
port=info.get('port'),
local=source_file,
remoted=remote_dir
)
'''
open_sftp 是SSHClient的一个方法,需要先建立一个SSH连接,然后在此连接上创建一个SFTP会话。而 SFTPClient 则直接用于SFTP会话的创建,不需要显式的SSH连接
SFTPClient 是Paramiko库中一个独立的类,它专门用于创建和管理SFTP会话,而不需要显式创建SSH连接。你可以通过创建一个 SFTPClient 实例来直接操作远程文件系统
'''
# 异步
from celery import Celery
import paramiko
app = Celery('remote_tasks', broker='redis://localhost:6379/0')
def execute_remote_command(hostname, username, password, command):
# ... 与前面的代码相同 ...
@app.task
def execute_remote_task(hostname, username, password, command):
result = execute_remote_command(hostname, username, password, command)
return result
# 使用示例
tasks = [
('remote_host1', 'user1', 'pass1', 'ls -l /path1'),
('remote_host2', 'user2', 'pass2', 'ls -l /path2'),
# 添加更多任务...
]
for task in tasks:
hostname, username, password, command = task
execute_remote_task.delay(hostname, username, password, command)
psutil获取的一些指标
# CPU信息:
获取CPU逻辑核心数量:psutil.cpu_count()
获取CPU物理核心数量:psutil.cpu_count(logical=False)
获取CPU使用率:psutil.cpu_percent(interval=1)
获取每个CPU核心的使用率:psutil.cpu_percent(interval=1, percpu=True)
获取CPU时间统计信息:psutil.cpu_times()
# 内存信息:
获取内存使用情况:psutil.virtual_memory()
获取交换分区使用情况:psutil.swap_memory()
# 磁盘信息:
获取磁盘分区列表:psutil.disk_partitions()
获取磁盘使用情况:psutil.disk_usage('/')
# 网络信息:
获取网络连接信息:psutil.net_connections()
获取网络IO统计信息:psutil.net_io_counters()
# 系统启动时间:
获取系统启动时间:psutil.boot_time()
# 进程信息:
获取所有运行中的进程列表:psutil.process_iter()
根据进程ID获取进程对象:psutil.Process(pid)
获取进程的CPU使用率:process.cpu_percent(interval=1)
获取进程的内存使用情况:process.memory_info()
import psutil #是一个功能强大的跨平台的系统管理库
import datetime
import time
def func1():
# #cpu的逻辑核数
cpu_core = psutil.cpu_count(logical=False)
# cpu的使用率
# time.sleep(1) #睡眠一秒钟
cup_per = psutil.cpu_percent(interval=1)#每隔1秒刷新一下
# 内存信息
memory_info = psutil.virtual_memory()
# 硬盘信息
disk_info = psutil.disk_usage("/") #根目录磁盘信息
# 网络信息
net_info = psutil.net_io_counters()
#接收数据
in_info = net_info.bytes_recv
#发送数据:
send_info = net_info.bytes_sent
#本机ip
ip_add = psutil.net_if_addrs()
# print(ip_add)
##windows中的ip截取:
#ip_add1 = ip_add['本地连接* 13'][2][1]
#Linux中的ip截取
# 获取当前系统时间
current_time = datetime.datetime.now().strftime("%F %T") #%F年月日 %T时分秒
#方式一:直接打印输出
print(f"当前时间为:{current_time}")
print(f"cpu的逻辑核数为:{cpu_core}")
print(f"cpu的使用率为:{cup_per}%")
print(f"总内存大小为:{memory_info.total/1024/1024}M")
print(f"根目录大小为:{disk_info.total/1024/1024}M")
# print(f"本机的ip为{ip_add1}")
func1()