python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改

news2024/12/23 23:14:35

Two-Step Vertification required:

Please enter the mobile app OTPverification code:

01.因为巡检的服务器要双因子认证登录,也就是登录堡垒机时还要输入验证码。这对我的巡检查服务器的工作带来了不便。它的机制是每一次登录,算一次会话,每次会话要输入一次验证码。

总共5台服务器,每个服务器执行5个常规命令,其中一个服务器执行一个特殊命令 5*5+1=26
那么我就要输入26次验证码,验证码每30秒变更一次。每个验证码能用2,3次。

02.验证码肯定要输入的,那么就输入一次,把所有命令操作打包成一次会话执行所有命令,命令包含回车等操作符。

把命放在列表中,当然用循环拼接字符串,一个一个写也可以,但太长可能会写错。

不讲这么多,上脚本主题

# #-*-coding:utf-8-*-
'''000.导入包'''

# from posixpath import split 
#001.SSH连接堡垒机,输入命令返回结果到txt文件的包
import util.exe_ssh as es 
#002.构建截图窗口的包
import util.ssh_windows as sw
#003.向巡检报告插入图片的包
import util.insert_image as ii
#004.删除txt,png的包
import util.dele_file as df
#005.时间的包
import time
#006.存储ip,端口,账号,密码,文件地址信息的类
import entity.ssh_info as si
#007.创建命令列表的包
import util.create_command_list as ccl

'''100.变量'''
#101.获取当天的年月日
current_time = time.strftime('%Y-%m-%d',time.localtime(time.time()))
#102.我所有登录信息话在ssh_access类里面,通过对象调用变量参数
ssh_obj = si.ssh_access()
#103.单纯文件名
file_name = ssh_obj.file_name
#104.文件的后序docx#
seq_name = ssh_obj.seq_name
#105.存放巡检报告的目录
default_path = ssh_obj.default_path
#106.巡检报告模板的地址
origen_path = default_path+"\\"+file_name+seq_name
#107.重命名巡检模板的巡检报告的地址
rename_path = default_path+"\\"+current_time+"\\"+file_name+current_time+seq_name
#108.putty,因为做一个假的putty窗口,putty图标的位置
icon_path=ssh_obj.icon_path
#109.存放命令返回结果txt文件的目录位置
txt_path=ssh_obj.txt_path
#110.访问堡垒机的ip地址
ip = ssh_obj.ip
#111.访问堡垒机的端口
port=ssh_obj.port
#112.访问堡垒机的账号
account=ssh_obj.account
#113.访问堡垒机的密码
pwd=ssh_obj.pwd
#114.服务器ip地址的列表
#115存ip的列表
fwq_name = [] 
for value in ssh_obj.ip_dic.values():
    fwq_name.append(value)
'''print("fwq_name的内容")'''
'''print(fwq_name)'''
#116.存放需要命令的列表
fwq_command=ssh_obj.command_list
'''print("fwq_command的内容")'''
'''print(fwq_command)'''
#117.服务器中文搜索的列表
fwq_search_name=[]
for key in ssh_obj.ip_dic.keys():
    fwq_search_name.append(key)
'''print("fwq_search_name的内容")'''
'''print(fwq_search_name)'''
#118.存放写入txt的目录
fwq_pre_txt_address = ssh_obj.fwq_pre_txt_address
'''print("fwq_pre_txt_address的内容")'''
'''print(fwq_pre_txt_address)'''
#119.存放截图的目录
fwq_pre_img_address = ssh_obj.fwq_pre_img_address
#120.单次会话所有输入命令的列表
full_fwq_name_command_list=ccl.get_fwq_full_name_command_list(fwq_search_name,fwq_command)

'''200.业务代码'''
#连接堡垒机,SSH连接返回命结果到txt文件
es.command2txt(ip,             #登录堡垒机的ip地址
               port,           #登录堡垒机的端口
               account,        #登录堡垒机的账号
               pwd,            #登录堡垒机的密码
               fwq_name,       #服务器ip地址的列表
               full_fwq_name_command_list,  #单次会话所有输入命令的列表
               fwq_pre_txt_address  #存放写入txt的目录
               )

#202.遍历截图
sw.show_windows_loop(fwq_pre_txt_address,fwq_pre_img_address,icon_path)    
#203.遍历插入图片
ii.table_insert_img_loop(rename_path,fwq_pre_img_address)    
#把生成png图片删除
df.del_file(fwq_pre_img_address)     
#把生成txt文件全部删除
df.del_file(txt_path)

我主要是对正面的包进行修改

#001.SSH连接堡垒机,输入命令返回结果到txt文件的包

import util.exe_ssh as es

# coding: utf-8
'''000.导入包'''
#001.用来休眠1秒的包
import time
#002.这个是访问堡垒机的包
import paramiko
#003.获取目录中所有文件名的包
import util.return_dir_file_name as rdf
#004.用于删除文件
import os 
#005.创建相同长度的数字字符串列表的包
import util.create_number_order as cno
#006.删除特定字符串前的字符串的包
import util.delete_before_string as dbs
#007.操作txt文件的包,里面写了两个方法,一个是把两个txt文件合并,一个是地址拼接前面加一些东西
import util.txt_util as tu

'''100.变量'''
#101.服务器账号前序
account_imf=['[root@oaapp02 ~]# ',
            '[root@oaapp01 ~]# ',
            '[root@bang01 ~]# ',
            '[root@rac1 ~]# ',
            '[root@rac2 ~]# ']
#102.txt的文件名列表,用于对指定txt文件进行操作
keywords_01 = ["01", "12", "23","34","45",'56']
keywords_2=["03","05","07","09"]
keywords_3=["14","16","18","20"]
keywords_4=["25","27","29","31"]
keywords_5=["36","38","40","42"]
keywords_6=["47","49","51","53"]

'''200.方法'''
#201.把命令执行结果写入txt文件的方法
def command2txt(ip,                 #ip不变的
                port,               #端口不变的
                account,            #用户名不变的
                pwd,                #密码不变的
                fwq_name,         #服务器ip的列表
                commands,         #不是单个命令,而是接收一个命令列表   
                txt_path,             
                txt_address         #txt的地址列表
                ):
    
    #202.获取私钥
    pkey=paramiko.RSAKey.from_private_key_file("C:\\Users\\human\\.ssh\\id_rsa",password=pwd)
    #203.paramiko SSH对象
    client = paramiko.SSHClient()
    #204.自动将服务器的公钥添加到known_hosts文件,并接受公钥。
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    #205.连接堡垒机
    client.connect(hostname=ip,port=port,username=account,pkey=pkey,timeout=60)
    #206.创建发送命令的对象
    shell = client.invoke_shell()
    #207.生成00-99的字符串列表
    number_list=cno.create_hundred_order_list(99)
    # print(number_list)
    #208.设置计数器count,拼设置初值为0
    count=0
    #209.遍历里面的命令
    for comand in commands:
        #210.用下标控制获取数字
        n=number_list[count]
        # print(n)
        #211.发送命令
        shell.send(comand)
        #212.如果准备就pass跳过
        while not shell.recv_ready():
            pass
        #213.睡眠0.5秒,模仿人操作
        time.sleep(0.5)
        #214.如果命令是'/',则跳过
        if comand == '/':
            continue
        #215.如果命令是搜索的堡垒机的字符串,则跳过
        elif comand in ('应用服务器02','应用服务器03','应用服务器01','数据库1','数据库2'):
            continue
        #216.过滤完执行下面的
        else:
            #217.接收命令执行结果
            stdout = shell.recv(10240)
            #218.对结果进行解码
            longstring = stdout.decode('utf-8')
            #219.如果结果包含"连用云",则跳过
            if "连用云" in longstring:
               continue
            #220.如果结果包含"exit",则跳过
            elif "exit" == longstring:
               continue
            else:
                #221.将结果写入txt文件
                with open(txt_address+n+".txt",'w') as f:
                    print(longstring,file = f)
                #222.计数器加1
                count+=1

    #223.获取目录中的文件名列表    
    file_name_list=rdf.re_file_name_list(txt_path)
    # print(file_name_list)
    #224.删除开头没有用的txt文件
    for f in file_name_list:
        print("f的值")
        print(f)
        keywords = ["00", "11", "22","33","44","55"]
        if any(keyword in f for keyword in keywords):
            os.remove(txt_path+"\\"+f)
    #225.删除完文件再获取目录中的文件名列表
    file_name_list=rdf.re_file_name_list(txt_path)
    #226.删除登录每个服务器txt文件开头的一些内容
    for f in file_name_list:
        # print("f的值")
        # print(f)
        #227.
        if any(keyword in f for keyword in keywords_01):
            # os.remove(txt_path+"\\"+f)
            with open(txt_path+"\\"+f, 'r') as file:
                content = file.read()
                if '56' in f:
                    content = dbs.dele_before_str(content,'[root')
                    with open(txt_path+"\\"+f, 'w') as file:
                        file.write(content)

                else: 
                    content = dbs.dele_before_str(content,'[root').replace("--color=never","")
                    with open(txt_path+"\\"+f, 'w') as file:
                        file.write(content)
        
       #删除完再获取
    for f in file_name_list:
        if any(keyword in f for keyword in keywords_2):  
                with open(txt_path+"\\"+f, 'r') as file:
                    content = file.read()
                    content = account_imf[0]+content
                with open(txt_path+"\\"+f, 'w') as file:
                    file.write(content)
    for f in file_name_list:
        if any(keyword in f for keyword in keywords_3):  
                with open(txt_path+"\\"+f, 'r') as file:
                    content = file.read()
                    content = account_imf[1]+content
                with open(txt_path+"\\"+f, 'w') as file:
                    file.write(content)
    for f in file_name_list:
        if any(keyword in f for keyword in keywords_4):  
                with open(txt_path+"\\"+f, 'r') as file:
                    content = file.read()
                    content = account_imf[2]+content
                with open(txt_path+"\\"+f, 'w') as file:
                    file.write(content)
    for f in file_name_list:
        if any(keyword in f for keyword in keywords_5):  
                with open(txt_path+"\\"+f, 'r') as file:
                    content = file.read()
                    content = account_imf[3]+content
                with open(txt_path+"\\"+f, 'w') as file:
                    file.write(content)
    for f in file_name_list:
        if any(keyword in f for keyword in keywords_6):  
                with open(txt_path+"\\"+f, 'r') as file:
                    content = file.read()
                    content = account_imf[4]+content
                with open(txt_path+"\\"+f, 'w') as file:
                    file.write(content)
   
    file_name_list=rdf.re_file_name_list(txt_path)
    
    # print("fwq_name的值")                
    # print(fwq_name)

    for ip_name in fwq_name:
    
        if ip_name==fwq_name[0]:
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[0]),
                       tu.add_pre_txt_address(file_name_list[1]),
                       tu.add_pre_txt_address(ip_name+"-0.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[2]),
                       tu.add_pre_txt_address(file_name_list[3]),
                       tu.add_pre_txt_address(ip_name+"-1.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[4]),
                       tu.add_pre_txt_address(file_name_list[5]),
                       tu.add_pre_txt_address(ip_name+"-2.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[6]),
                       tu.add_pre_txt_address(file_name_list[7]),
                       tu.add_pre_txt_address(ip_name+"-3.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[8]),
                       tu.add_pre_txt_address(file_name_list[9]),
                       tu.add_pre_txt_address(ip_name+"-4.txt"))
        elif ip_name==fwq_name[1]:
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[10]),
                       tu.add_pre_txt_address(file_name_list[11]),
                       tu.add_pre_txt_address(ip_name+"-0.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[12]),
                       tu.add_pre_txt_address(file_name_list[13]),
                       tu.add_pre_txt_address(ip_name+"-1.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[14]),
                       tu.add_pre_txt_address(file_name_list[15]),
                       tu.add_pre_txt_address(ip_name+"-2.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[16]),
                       tu.add_pre_txt_address(file_name_list[17]),
                       tu.add_pre_txt_address(ip_name+"-3.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[18]),
                       tu.add_pre_txt_address(file_name_list[19]),
                       tu.add_pre_txt_address(ip_name+"-4.txt"))
        elif ip_name==fwq_name[2]:
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[20]),
                       tu.add_pre_txt_address(file_name_list[21]),
                       tu.add_pre_txt_address(ip_name+"-0.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[22]),
                       tu.add_pre_txt_address(file_name_list[23]),
                       tu.add_pre_txt_address(ip_name+"-1.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[24]),
                       tu.add_pre_txt_address(file_name_list[25]),
                       tu.add_pre_txt_address(ip_name+"-2.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[26]),
                       tu.add_pre_txt_address(file_name_list[27]),
                       tu.add_pre_txt_address(ip_name+"-3.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[28]),
                       tu.add_pre_txt_address(file_name_list[29]),
                       tu.add_pre_txt_address(ip_name+"-4.txt"))
        elif ip_name==fwq_name[3]:
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[30]),  
                      tu.add_pre_txt_address(file_name_list[31]),
                       tu.add_pre_txt_address(ip_name+"-0.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[32]),
                       tu.add_pre_txt_address(file_name_list[33]),
                       tu.add_pre_txt_address(ip_name+"-1.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[34]),
                       tu.add_pre_txt_address(file_name_list[35]),
                       tu.add_pre_txt_address(ip_name+"-2.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[36]),
                       tu.add_pre_txt_address(file_name_list[37]),
                       tu.add_pre_txt_address(ip_name+"-3.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[38]),
                       tu.add_pre_txt_address(file_name_list[39]),
                       tu.add_pre_txt_address(ip_name+"-4.txt"))
        
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[-3]),
                       tu.add_pre_txt_address(file_name_list[-2]),
                       tu.add_pre_txt_address(ip_name+"-5.txt"))
            
        elif ip_name==fwq_name[4]:
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[40]),
                       tu.add_pre_txt_address(file_name_list[41]),
                       tu.add_pre_txt_address(ip_name+"-0.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[42]),
                       tu.add_pre_txt_address(file_name_list[43]),
                       tu.add_pre_txt_address(ip_name+"-1.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[44]),
                       tu.add_pre_txt_address(file_name_list[45]),
                       tu.add_pre_txt_address(ip_name+"-2.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[46]),
                       tu.add_pre_txt_address(file_name_list[47]),
                       tu.add_pre_txt_address(ip_name+"-3.txt"))
            tu.conbine_txt(tu.add_pre_txt_address(file_name_list[48]),
                       tu.add_pre_txt_address(file_name_list[49]),
                       tu.add_pre_txt_address(ip_name+"-4.txt"))

        #删除00-55的txt文
    for f in file_name_list:
        print("f的值")
        print(f)
        # keywords = ["00", "11", "22","33","44","55"]
        if any(keyword in f for keyword in number_list):
            os.remove(txt_path+"\\"+f)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Web前端】创建我的第一个 Web 表单

Web 开发中,表单是不可或缺的组成部分。无论是用户注册、登录还是反馈收集,表单都是与用户交互的重要方式。 什么是 Web 表单? Web 表单是一种用于收集用户输入数据的界面元素。它们允许用户在浏览器中输入信息并提交这些信息到服务器。Web …

JavaWeb后端开发知识储备2

目录 1.HttpClient 2.微信小程序开发 3.Spring Cache 1.HttpClient 简单来说,HttpClient可以通过编码的方式在Java中发送Http请求 2.微信小程序开发 微信小程序的开发本质上是前端开发,对于后端程序员来说了解即可 3.Spring Cache Spring Cache 是…

力扣刷题--21.合并两个有序链表

I am the best !!! 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2…

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现

开题报告 随着旅游业的快速发展和互联网的普及,越来越多的人选择通过网络平台获取旅游攻略和分享旅行经验。传统的旅游攻略获取方式往往依赖于纸质书籍或零散的在线资源,这种方式不仅信息更新滞后,而且缺乏互动性和个性化推荐。因此&#xf…

排序算法:直接插入排序,希尔排序,选择排序,快速排序,堆排序,归并排序

1.直接插入排序 基本思想:把待排序的数按照大小逐个插入到前面已经排序好的有序序列中,直到所有的都插入完为止,得到一个新的有序序列。 如图所示,当插入第i个(i>1)元素的时候,前面的arr[0]…

《OpenCV 图像基础操作全解析:从读取到像素处理与 ROI 应用》

简介:本文详细介绍了使用 OpenCV 进行图像相关操作的基础知识与实践示例,涵盖图像读取(包括不同读取方式及对应效果)、灰度值概念与图像矩阵存储特点、通道相关知识(如 BGR、通道拆分与合并),还…

使用卡尔曼滤波器估计pybullet中的机器人位置

⭐️ 卡尔曼滤波 卡尔曼滤波是一种递归算法,用于从具有噪声的观测中估计系统状态。它特别适合用于线性、高斯动态系统。 笔者之前写过一篇博文介绍卡尔曼滤波器《boss:整个卡尔曼滤波器的简单案例——估计机器人位置》,本文手动实现一个卡尔曼滤波器并…

【尚筹网】二、环境搭建一

【尚筹网】二、环境搭建一 环境搭建总体目标创建工程系统架构图工程创建计划创建空项目创建对应的 Maven 模块建立模块间的依赖 创建数据库基于 Maven 的 Mybatis 的逆向过程配置 pom创建 generatorConfig.xml执行逆向工程操作的 maven 指令将逆向工程生成的资源归位 父工程依赖…

全面解析 JMeter 后置处理器:概念、工作原理与应用场景

在性能测试中,Apache JMeter是一个非常流行的工具,它不仅能够模拟大量用户进行并发访问,还提供了丰富的扩展机制来满足各种复杂的测试需求。后置处理器(Post-Processor)是JMeter中非常重要的组件之一,用于在…

数字IC后端实现时钟树综合系列教程 | Clock Tree,Clock Skew Group之间的区别和联系

Q: Clock,Clock Tree和Skew Group有何区别?Innovus CCOPT引擎是如何使用这些的? Clock是时序约束SDC中的时钟定义点。 create_clock -name clk_osc -period $period_24m [get_ports xin_osc0_func] 时钟树综合(Clock Tree Synthesis)之前应…

基于零相差前馈补偿的 PID 控制

零相差前馈补偿是一种结合前馈补偿与反馈控制的策略,旨在提高控制系统对参考信号的跟踪精度。通过设计合理的前馈补偿器,使得系统对参考输入实现零相位差的跟踪,同时利用 PID 控制器保证系统的稳定性和动态性能。 1. 原理概述 目标&#xff…

odoo18中模型的常用字段类型

字段的公共属性: Char 字符类型,对应数据库中varchar类型,除了通用类型外接收另外两个参数: size: 字符长度,超出的长度将被截断 trim: 默认True,是否字段值应该被去空白。 Text 文本类型,对应数据库…

Wireshark抓取HTTPS流量技巧

一、工具准备 首先安装wireshark工具,官方链接:Wireshark Go Deep 二、环境变量配置 TLS 加密的核心是会话密钥。这些密钥由客户端和服务器协商生成,用于对通信流量进行对称加密。如果能通过 SSL/TLS 日志文件(例如包含密钥的…

鸿蒙生态崛起

1.鸿蒙生态:开发者的新蓝海 从开发者角度看,鸿蒙生态带来了巨大机遇。其分布式能力实现了不同设备间的无缝体验,如多屏协同,让应用能跨手机、平板、智能穿戴和车载设备流畅运行。开发工具也有显著提升,方舟编译器等极大…

【MySQL】精细讲解:数据库内置函数深度学习解析

前言:本节内容讲述mysql里面的函数的概念, 在mysql当中, 内置了很多函数工作。 这些函数丰富了我们的操作。 比如字符串函数、数据函数以及一些其他函数等等。 ps:友友们学习了表的基本操作后就可以观看本节内容啦! 目录 日期函数 current_…

亚信安全与飞书达成深度合作

近日,亚信安全联合飞书举办的“走近先进”系列活动正式走进亚信。活动以“安全护航信息化 共筑数字未来路”为主题,吸引了众多数字化转型前沿企业的近百位领导参会。作为“走近先进”系列的第二场活动,本场活动更加深入挖掘了数字化转型的基础…

[less] Operation on an invalid type

我这个是升级项目的时候遇到的,要从 scss 升级到 less,然后代码中就报了这个错误 我说一下代码的错误过程,但是这里没有复现,因为我原本报错的代码要复杂很多,而且是公司代码,不方便透露,这是我…

“iOS profile文件与私钥证书文件不匹配”总结打ipa包出现的问题

目录 文件和证书未加载或特殊字符问题 证书过期或Profile文件错误 确认开发者证书和私钥是否匹配 创建证书选择错误问题 申请苹果 AppId时勾选服务不全问题 ​总结 在上线ios平台的时候,在Hbuilder中打包遇见了问题,生成ipa文件时候,一…

大语言模型(LLM)安全:十大风险、影响和防御措施

一、什么是大语言模型(LLM)安全? 大语言模型(LLM)安全侧重于保护大型语言模型免受各种威胁,这些威胁可能会损害其功能、完整性和所处理的数据。这涉及实施措施来保护模型本身、它使用的数据以及支持它的基…

基础知识学习上

基础知识学习上 1.关于print1.1 format 方法 2.运算符2.1 除法运算2.2 幂运算 3.条件控制语句3.1 if语句3.2 循环语句 4.复杂数据类型4.1列表4.2字典4.3字符串 5.函数 1.关于print 分隔符 print(1, 2, 3, 4, sep-) print(1, 2, 3, 4, sep。)结尾符 print(1, 2, 3, 4, end?) pr…