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

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,拼设置初值为0count=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:continueelse:#221.将结果写入txt文件with open(txt_address+n+".txt",'w') as f:print(longstring,file = f)#222.计数器加1count+=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]+contentwith 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]+contentwith 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]+contentwith 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]+contentwith 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]+contentwith 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.rhkb.cn/news/476481.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线

文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…

Win11 22H2/23H2系统11月可选更新KB5046732发布!

系统之家11月22日报道,微软针对Win11 22H2/23H2版本推送了2024年11月最新可选更新补丁KB5046732,更新后,系统版本号升至22621.4541和22631.4541。本次更新后系统托盘能够显示缩短的日期和时间,文件资源管理器窗口很小时搜索框被切…

【数据结构】【线性表】【练习】反转链表

申明 该题源自力扣题库19&#xff0c;文章内容&#xff08;代码&#xff0c;图表等&#xff09;均原创&#xff0c;侵删&#xff01; 题目 给你单链表的头指针head以及两个整数left和right&#xff0c;其中left<right&#xff0c;请你反转从位置left到right的链表节点&…

【赵渝强老师】MySQL的慢查询日志

MySQL的慢查询日志可以把超过参数long_query_time时间的所有SQL语句记录进来&#xff0c;帮助DBA人员优化所有有问题的SQL语句。通过mysqldumpslow工具可以查看慢查询日志。 视频讲解如下&#xff1a; MySQL的慢查询日志 【赵渝强老师】MySQL的慢查询日志 下面通过具体的演示…

基于docker进行任意项目灵活发布

引言 不管是java还是python程序等&#xff0c;使用docker发布的优势有以下几点&#xff1a; 易于维护。直接docker命令进行管理&#xff0c;如docker stop、docker start等&#xff0c;快速方便无需各种进程查询关闭。环境隔离。项目代码任何依赖或设置都可以基本独立&#x…

Android 分区相关介绍

目录 一、MTK平台 1、MTK平台分区表配置 2、MTK平台刷机配置表 3、MTK平台分区表配置不生效 4、Super分区的研究 1&#xff09;Super partition layout 2&#xff09;Block device table 二、高通平台 三、展锐平台 四、相关案例 1、Super分区不够导致编译报错 经验…

数据库类型介绍

1. 关系型数据库&#xff08;Relational Database, RDBMS&#xff09;&#xff1a; • 定义&#xff1a;基于关系模型&#xff08;即表格&#xff09;存储数据&#xff0c;数据之间通过外键等关系相互关联。 • 特点&#xff1a;支持复杂的SQL查询&#xff0c;数据一致性和完整…

当产业经济插上“数字羽翼”,魔珐有言AIGC“3D视频创作大赛”成功举办

随着AI技术的飞速发展&#xff0c;3D数字人技术已成为驱动各行各业转型升级的重要力量。在这一背景下&#xff0c;2024山东3D数字人视频创作大赛应运而生&#xff0c;并在一番激烈的角逐后圆满落幕&#xff0c;为科技与创意的交融写下浓墨重彩的一笔。 11月20日&#xff0c;一…

经济增长初步

1.人均产出 人均产出&#xff0c;通常指的是一个国家、地区或组织在一定时期内&#xff0c;每个劳动人口平均创造的生产总值。它是衡量一个地区或国家经济效率和劳动生产率的重要指标。具体来说&#xff0c;人均产出可以通过以下公式计算&#xff1a; 人均产出总产出/劳动人口…

图像增强夜视仪行业全面而深入的分析

图像增强夜视设备&#xff08;I2ND 或 INVD&#xff09;是一种增强监视、安全和军事应用的微光可见度的技术。 它允许用户在非常弱的光线甚至完全黑暗的条件下看到东西。 一、市场研究 1. 市场规模与增长趋势 据QYResearch调研团队最新报告&#xff0c;预计2029年全球图像增强…

002 MATLAB语言基础

01 变量命名规则 变量名只能由字母、数字和下划线组成&#xff0c;且必须以字母开头&#xff1b; 变量名区分字母的大小写&#xff1b; 变量名不能超过最大长度限制&#xff1b; 关键字不能作为变量名&#xff0c;如for、end和if等&#xff1b; 注意&#xff1a;存变量命名时…

greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用

简略图 greater<>()(a, b) a > b 返回true&#xff0c;反之返回false less<>()(a, b) a < b 返回true&#xff0c;反之返回false 在cmp中使用&#xff08;正着理解&#xff09; 规则返回true时a在前&#xff0c;反之b在前 在priority_queue中使用 &#xff…

冲破AI 浪潮冲击下的 迷茫与焦虑

在这个科技日新月异的时代&#xff0c;人工智能如汹涌浪潮般席卷而来&#xff0c;不断改变我们的生活。你是否对 AI 充满好奇&#xff0c;却不知它将如何改变你的工作与生活&#xff1f;又是否会在 AI 浪潮的冲击下陷入迷茫与焦虑&#xff1f;《AI 时代&#xff1a;弯道超车新思…

嵌入式LVGL自定义纯数字键盘

嵌入式LVGL自定义纯数字键盘 一、前言二、设置自定义数字键盘三、使用一、前言 嵌入式UI项目中有时候会使用到纯数字密码的需求,所以打算使用LVGL构建自定义的纯数字键盘。 二、设置自定义数字键盘 参考这个文章,以LV_KEYBOARD_MODE_USER_1为例,增加一个数字键盘,如下图所…

第6篇 寻找最大数___ARM C语言程序<二>

Q&#xff1a;如何创建基于ARM处理器的C语言程序寻找一组数据列表中的最大数呢&#xff1f; A&#xff1a;和基于Nios II处理器的C语言程序一样&#xff0c;在ARM处理器C语言中也使用printf库函数显示程序的运行结果&#xff0c;若要调用printf函数&#xff0c;必须在C程序中包…

【11.22更新】Win11 24H2正式版:26100.2454镜像一键获取!

今日&#xff0c;系统之家小编就给大家带来2024年11月最新推出的Windows11 24H2正式版系统&#xff0c;该版本系统包含最新可选更新补丁KB5046740&#xff0c;用户安装后版本号升至26100.2454。更新此系统后&#xff0c;用户就能通过文件资源管理器和桌面上的右键菜单将内容分享…

python小课堂(一)

基础语法 1 常量和表达式2 变量和类型2.1 变量是什么2.2 变量语法 3 变量的类型3.1 动态类型特性 4 注释4.1注释是什么 5 输入输出5.1 print的介绍5.2 input 6 运算符6.1 算术运算符在这里插入图片描述6.2 关系运算符6.3 逻辑运算符6.4赋值运算符 1 常量和表达式 在print()中可…

区块链网络示意图;Aura共识和Grandpa共识(BFT共识)

目录 区块链网络示意图 Aura共识和Grandpa共识(BFT共识) Aura共识 Grandpa共识(BFT共识) Aura与Grandpa的结合 区块链网络示意图 CP Blockchain:这是中央处理区块链(或可能指某种特定的处理单元区块链)的缩写。它可能代表了该区块链网络的主要处理或存储单元。在这…

springboot整合hive

springboot整合hive pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

跨视角差异-依赖网络用于体积医学图像分割|文献速递-生成式模型与transformer在医学影像中的应用

Title 题目 Cross-view discrepancy-dependency network for volumetric medical imagesegmentation 跨视角差异-依赖网络用于体积医学图像分割 01 文献速递介绍 医学图像分割旨在从原始图像中分离出受试者的解剖结构&#xff08;例如器官和肿瘤&#xff09;&#xff0c;并…