介绍
&这辈子写过最多行但又特别简单,看起来又特别复杂,而且没有任何技术水平,职业程序员看了都会骂的代码。
这个脚本仅支持迪普扫描器扫描的报告生成,还写了个awvs版本的,相差也不大,就改改里面的亿点点就行,整体框架一样。
代码
以此纪念我曾经每个月要写几百份报告的青春!
虽然写得菜,但是版权所有,禁止商用!
# * coding:utf-8 *
"""
docx库学习,顺带创建漏扫报告模板,表格需要改变字体大小:
https://stackoverflow.com/questions/43007725/python-docx-how-to-change-table-font-size
docx库官方翻译文档:
https://www.jianshu.com/nb/45603922
python文本提取方式:
Python-goose
BeautifulSoup
html2text
nltk
plaintext
"""
import os
import re
from docx import Document
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT
from docx.shared import Cm, Inches, Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml
def create_docx():
os.chdir(save_path)
mydoc = Document("test.docx")
mydoc.add_paragraph('', style='info_style')
mydoc.add_paragraph('', style='info_style')
mydoc.add_paragraph(customer_name + "-" + ip, style='index_style')
mydoc.add_paragraph("主机安全扫描报告", style='index_style')
mydoc.add_paragraph('', style='null_style')
mydoc.add_paragraph('', style='null_style')
mydoc.add_paragraph('', style='null_style')
mydoc.add_paragraph('', style='null_style')
mydoc.add_paragraph('', style='null_style')
mydoc.add_paragraph('', style='null_style')
mydoc.add_paragraph('', style='null_style')
mydoc.add_paragraph('', style='null_style')
mydoc.save(doc_path + customer_name + "-" + ip + "-主机漏洞扫描报告.docx")
"""===这里图片居中的原因是因为样式居中,插入的图片也自动居中了"""
logo = mydoc.paragraphs[12].add_run().add_picture(save_path + "logo.png")
logo.height = Cm(2.74)
logo.width = Cm(3.15)
mydoc.add_paragraph(company_name, style='info_style')
mydoc.add_paragraph(report_data, style='info_style')
mydoc.add_page_break()
mydoc.add_heading("1、扫描任务信息", level=1)
scan_info_table = mydoc.add_table(rows=5, cols=4, style="Table Grid")
scan_info_table.cell(0, 0).width = Inches(2.3)
scan_info_table.cell(0, 1).width = Inches(3.5)
scan_info_table.cell(0, 2).width = Inches(2.2)
scan_info_table.cell(0, 3).width = Inches(2.5)
scan_info_table.style.font.size = Pt(10)
scan_info_table.style.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
scan_info_table_bg00 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
scan_info_table_bg02 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
scan_info_table_bg10 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
scan_info_table_bg12 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
scan_info_table_bg20 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
scan_info_table_bg22 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
scan_info_table_bg30 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
scan_info_table_bg32 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
scan_info_table_bg40 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
scan_info_table_bg42 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
scan_info_table.rows[0].cells[0]._tc.get_or_add_tcPr().append(scan_info_table_bg00)
scan_info_table.rows[0].cells[2]._tc.get_or_add_tcPr().append(scan_info_table_bg02)
scan_info_table.rows[1].cells[0]._tc.get_or_add_tcPr().append(scan_info_table_bg10)
scan_info_table.rows[1].cells[2]._tc.get_or_add_tcPr().append(scan_info_table_bg12)
scan_info_table.rows[2].cells[0]._tc.get_or_add_tcPr().append(scan_info_table_bg20)
scan_info_table.rows[2].cells[2]._tc.get_or_add_tcPr().append(scan_info_table_bg22)
scan_info_table.rows[3].cells[0]._tc.get_or_add_tcPr().append(scan_info_table_bg30)
scan_info_table.rows[3].cells[2]._tc.get_or_add_tcPr().append(scan_info_table_bg32)
scan_info_table.rows[4].cells[0]._tc.get_or_add_tcPr().append(scan_info_table_bg40)
scan_info_table.rows[4].cells[2]._tc.get_or_add_tcPr().append(scan_info_table_bg42)
scan_info_table_align40 = scan_info_table.cell(4, 0)
scan_info_table_align40.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
scan_info_table_align40.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
scan_info_table_align41 = scan_info_table.cell(4, 1)
scan_info_table_align41.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
scan_info_table_align41.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
scan_info_table_align42 = scan_info_table.cell(4, 2)
scan_info_table_align42.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
scan_info_table_align42.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
scan_info_table_align43 = scan_info_table.cell(4, 3)
scan_info_table_align43.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
scan_info_table_align43.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
line00 = scan_info_table.cell(0, 0).paragraphs[0].add_run("任务名称")
line00.font.name = "宋体"
line00.font.size = Pt(10)
line00.bold = True
line01 = scan_info_table.cell(0, 1).paragraphs[0].add_run(customer_name + "主机漏洞扫描")
line01.font.name = "宋体"
line01.font.size = Pt(10)
line02 = scan_info_table.cell(0, 2).paragraphs[0].add_run("任务创建")
line02.font.name = "宋体"
line02.font.size = Pt(10)
line02.bold = True
line03 = scan_info_table.cell(0, 3).paragraphs[0].add_run("张三")
line03.font.name = "宋体"
line03.font.size = Pt(10)
line10 = scan_info_table.cell(1, 0).paragraphs[0].add_run("策略名称")
line10.font.name = "宋体"
line10.font.size = Pt(10)
line10.bold = True
line11 = scan_info_table.cell(1, 1).paragraphs[0].add_run("系统漏洞扫描")
line11.font.name = "宋体"
line11.font.size = Pt(10)
line12 = scan_info_table.cell(1, 2).paragraphs[0].add_run("任务状态")
line12.font.name = "宋体"
line12.font.size = Pt(10)
line12.bold = True
line13 = scan_info_table.cell(1, 3).paragraphs[0].add_run("扫描结束")
line13.font.name = "宋体"
line13.font.size = Pt(10)
line20 = scan_info_table.cell(2, 0).paragraphs[0].add_run("扫描时间")
line20.font.name = "宋体"
line20.font.size = Pt(10)
line20.bold = True
line21 = scan_info_table.cell(2, 1).paragraphs[0].add_run(scan_time)
line21.font.name = "宋体"
line21.font.size = Pt(10)
line22 = scan_info_table.cell(2, 2).paragraphs[0].add_run("扫描用时")
line22.font.name = "宋体"
line22.font.size = Pt(10)
line22.bold = True
line23 = scan_info_table.cell(2, 3).paragraphs[0].add_run("00:16:25")
line23.font.name = "宋体"
line23.font.size = Pt(10)
line30 = scan_info_table.cell(3, 0).paragraphs[0].add_run("扫描范围")
line30.font.name = "宋体"
line30.font.size = Pt(10)
line30.bold = True
line31 = scan_info_table.cell(3, 1).paragraphs[0].add_run(ip)
line31.font.name = "宋体"
line31.font.size = Pt(10)
line32 = scan_info_table.cell(3, 2).paragraphs[0].add_run("扫描引擎")
line32.font.name = "宋体"
line32.font.size = Pt(10)
line32.bold = True
line33 = scan_info_table.cell(3, 3).paragraphs[0].add_run("本机")
line33.font.name = "宋体"
line33.font.size = Pt(10)
line40 = scan_info_table.cell(4, 0).paragraphs[0].add_run("应用安全状态")
line40.font.name = "宋体"
line40.font.size = Pt(10)
line40.bold = True
line41 = scan_info_table.cell(4, 1).paragraphs[0].add_run("%s" % (get_status()))
line41.font.name = "宋体"
line41.font.size = Pt(10)
line42 = scan_info_table.cell(4, 2).paragraphs[0].add_run("发现漏洞")
line42.font.name = "宋体"
line42.font.size = Pt(10)
line42.bold = True
line43 = scan_info_table.cell(4, 3).paragraphs[0].add_run(
"高危漏洞:%d\n中危漏洞:%d\n低危漏洞:%d" % (high_num, medium_num, low_num))
line43.font.name = "宋体"
line43.font.size = Pt(10)
mydoc.add_heading("2、扫描结果统计", level=1)
result_table = mydoc.add_table(rows=vuln_row, cols=4, style="Table Grid")
result_table.cell(0, 0).width = Inches(0.5)
result_table.cell(0, 1).width = Inches(5.5)
result_table.cell(0, 2).width = Inches(2)
result_table.cell(0, 3).width = Inches(2)
result_table.cell(0, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
result_table.cell(0, 1).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
result_table.cell(0, 2).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
result_table.cell(0, 3).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
result_table_bg00 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
result_table_bg01 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
result_table_bg02 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
result_table_bg03 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
result_table.rows[0].cells[0]._tc.get_or_add_tcPr().append(result_table_bg00)
result_table.rows[0].cells[1]._tc.get_or_add_tcPr().append(result_table_bg01)
result_table.rows[0].cells[2]._tc.get_or_add_tcPr().append(result_table_bg02)
result_table.rows[0].cells[3]._tc.get_or_add_tcPr().append(result_table_bg03)
result_table_id = result_table.cell(0, 0).paragraphs[0].add_run("序号")
result_table_id.font.name = "黑体"
result_table_id.font.size = Pt(12)
result_table_id.bold = True
result_table_vuln = result_table.cell(0, 1).paragraphs[0].add_run("漏洞名称")
result_table_vuln.font.name = "黑体"
result_table_vuln.font.size = Pt(12)
result_table_vuln.bold = True
result_table_number = result_table.cell(0, 2).paragraphs[0].add_run("漏洞数量")
result_table_number.font.name = "黑体"
result_table_number.font.size = Pt(12)
result_table_number.bold = True
result_table_level = result_table.cell(0, 3).paragraphs[0].add_run("风险等级")
result_table_level.font.name = "黑体"
result_table_level.font.size = Pt(12)
result_table_level.bold = True
for xuhao in range(0, vuln_row - 1):
"""自动填充序号 第一列"""
result_table_align00 = result_table.cell(xuhao + 1, 0)
result_table_align00.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
result_table_align00.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
name_0 = result_table.cell(xuhao + 1, 0).paragraphs[0].add_run("%d" % (xuhao + 1))
name_0.font.name = "宋体"
name_0.font.size = Pt(10)
result_table.cell(xuhao + 1, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
xuhao += 1
for line in range(0, len(get_huiyan_vuln_name())):
"""自动填充漏洞名称 第二列"""
name_1 = result_table.cell(line + 1, 1).paragraphs[0].add_run(get_huiyan_vuln_name()[line])
name_1.font.name = "宋体"
name_1.font.size = Pt(10)
result_table.cell(line + 1, 1).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
line += 1
for shuliang in range(0, vuln_row - 1):
"""自动填充漏洞数量 第三列"""
result_table_align02 = result_table.cell(shuliang + 1, 2)
result_table_align02.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
result_table_align02.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
name_2 = result_table.cell(shuliang + 1, 2).paragraphs[0].add_run("1")
name_2.font.name = "宋体"
name_2.font.size = Pt(10)
result_table.cell(shuliang + 1, 2).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
shuliang += 1
for dengji in range(0, vuln_row - 1):
"""自动填充风险等级 第四列"""
result_table_align03 = result_table.cell(dengji + 1, 3)
result_table_align03.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
result_table_align03.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
name_3 = result_table.cell(dengji + 1, 3).paragraphs[0].add_run(get_huiyan_vuln_level()[dengji])
name_3.font.name = "宋体"
name_3.font.size = Pt(10)
result_table.cell(dengji + 1, 3).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
dengji += 1
mydoc.add_heading("3、漏洞风险分布统计", level=1)
mydoc.add_paragraph()
"""========== 下面是创建漏洞风险分布统计表 =========="""
risk_distribution_table = mydoc.add_table(rows=2, cols=4, style="Table Grid")
risk_distribution_table.cell(0, 0).width = Inches(2.5)
risk_distribution_table.cell(0, 1).width = Inches(2.5)
risk_distribution_table.cell(0, 2).width = Inches(2.5)
risk_distribution_table.cell(0, 3).width = Inches(2.5)
risk_distribution_table.style.font.size = Pt(10)
risk_distribution_table.style.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
risk_distribution_table.cell(0, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
risk_distribution_table.cell(0, 1).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
risk_distribution_table.cell(0, 2).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
risk_distribution_table.cell(0, 3).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
risk_distribution_table.cell(1, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
risk_distribution_table.cell(1, 1).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
risk_distribution_table.cell(1, 2).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
risk_distribution_table.cell(1, 3).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
risk00 = risk_distribution_table.cell(0, 0).paragraphs[0].add_run("高危险")
risk00.font.name = "宋体"
risk00.font.size = Pt(12)
risk01 = risk_distribution_table.cell(0, 1).paragraphs[0].add_run("中危险")
risk01.font.name = "宋体"
risk01.font.size = Pt(12)
risk02 = risk_distribution_table.cell(0, 2).paragraphs[0].add_run("低危险")
risk02.font.name = "宋体"
risk02.font.size = Pt(12)
risk03 = risk_distribution_table.cell(0, 3).paragraphs[0].add_run("总计")
risk03.font.name = "宋体"
risk03.font.size = Pt(12)
risk10 = risk_distribution_table.cell(1, 0).paragraphs[0].add_run("%d" % high_num)
risk10.font.name = "宋体"
risk10.font.size = Pt(10)
risk11 = risk_distribution_table.cell(1, 1).paragraphs[0].add_run("%d" % medium_num)
risk11.font.name = "宋体"
risk11.font.size = Pt(10)
risk12 = risk_distribution_table.cell(1, 2).paragraphs[0].add_run("%d" % low_num)
risk12.font.name = "宋体"
risk12.font.size = Pt(10)
risk13 = risk_distribution_table.cell(1, 3).paragraphs[0].add_run("%d" % total_num)
risk13.font.name = "宋体"
risk13.font.size = Pt(10)
"""==========下面开始创建漏洞扫描详细列表=========="""
mydoc.add_heading("4、漏洞扫描详细列表", level=1)
for vuln_info in range(0, vuln_row - 1):
key = get_huiyan_vuln_name()[vuln_info]
print(key)
mydoc.add_paragraph("漏洞名称:%s" % key, style='title_line')
vlun_list_table = mydoc.add_table(rows=6, cols=2, style="Table Grid")
vlun_list_table.cell(1, 0).width = Inches(2)
vlun_list_table.cell(1, 1).width = Inches(8)
vlun_list_table.cell(2, 0).width = Inches(2)
vlun_list_table.cell(2, 1).width = Inches(8)
vlun_list_table.cell(3, 0).width = Inches(2)
vlun_list_table.cell(3, 1).width = Inches(8)
vlun_list_table.cell(4, 0).width = Inches(2)
vlun_list_table.cell(4, 1).width = Inches(8)
vlun_list_table.cell(5, 0).width = Inches(2)
vlun_list_table.cell(5, 1).width = Inches(8)
vlun_list_table.cell(0, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
vlun_list_table.cell(0, 1).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
vlun_list_table.cell(1, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
vlun_list_table.cell(1, 1).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
vlun_list_table.cell(2, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
vlun_list_table.cell(2, 1).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
vlun_list_table.cell(3, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
vlun_list_table.cell(3, 1).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
vlun_list_table.cell(4, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
vlun_list_table.cell(4, 1).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
vlun_list_table.cell(5, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
vlun_list_table.cell(5, 1).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
vlun_list_table_bg00 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
vlun_list_table_bg10 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
vlun_list_table_bg20 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
vlun_list_table_bg30 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
vlun_list_table_bg40 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
vlun_list_table_bg50 = parse_xml(r'<w:shd {} w:fill="D3D3D3"/>'.format(nsdecls('w')))
vlun_list_table.rows[0].cells[0]._tc.get_or_add_tcPr().append(vlun_list_table_bg00)
vlun_list_table.rows[1].cells[0]._tc.get_or_add_tcPr().append(vlun_list_table_bg10)
vlun_list_table.rows[2].cells[0]._tc.get_or_add_tcPr().append(vlun_list_table_bg20)
vlun_list_table.rows[3].cells[0]._tc.get_or_add_tcPr().append(vlun_list_table_bg30)
vlun_list_table.rows[4].cells[0]._tc.get_or_add_tcPr().append(vlun_list_table_bg40)
vlun_list_table.rows[5].cells[0]._tc.get_or_add_tcPr().append(vlun_list_table_bg50)
vlun_list_table_align00 = vlun_list_table.cell(0, 0)
vlun_list_table_align00.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
vlun_list_table_align00.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
vlun_list_table_align10 = vlun_list_table.cell(1, 0)
vlun_list_table_align10.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
vlun_list_table_align10.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
vlun_list_table_align20 = vlun_list_table.cell(2, 0)
vlun_list_table_align20.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
vlun_list_table_align20.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
vlun_list_table_align30 = vlun_list_table.cell(3, 0)
vlun_list_table_align30.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
vlun_list_table_align30.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
vlun_list_table_align40 = vlun_list_table.cell(4, 0)
vlun_list_table_align40.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
vlun_list_table_align40.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
vlun_list_table_align50 = vlun_list_table.cell(5, 0)
vlun_list_table_align50.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
vlun_list_table_align50.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
list00 = vlun_list_table.cell(0, 0).paragraphs[0].add_run("漏洞名称")
list00.font.name = "宋体"
list00.font.size = Pt(12)
list01 = vlun_list_table.cell(0, 1).paragraphs[0].add_run("%s" % key)
list01.font.name = "宋体"
list01.font.size = Pt(10)
list10 = vlun_list_table.cell(1, 0).paragraphs[0].add_run("严重程度")
list10.font.name = "宋体"
list10.font.size = Pt(12)
list11 = vlun_list_table.cell(1, 1).paragraphs[0].add_run(vuln_level[vuln_info])
list11.font.name = "宋体"
list11.font.size = Pt(10)
list20 = vlun_list_table.cell(2, 0).paragraphs[0].add_run("漏洞描述")
list20.font.name = "宋体"
list20.font.size = Pt(12)
list21 = vlun_list_table.cell(2, 1).paragraphs[0].add_run(get_huiyan_vuln_describe()[vuln_info])
list21.font.name = "宋体"
list21.font.size = Pt(10)
list30 = vlun_list_table.cell(3, 0).paragraphs[0].add_run("修复建议")
list30.font.name = "宋体"
list30.font.size = Pt(12)
list31 = vlun_list_table.cell(3, 1).paragraphs[0].add_run(get_huiyan_vuln_advice()[vuln_info])
list31.font.name = "宋体"
list31.font.size = Pt(10)
list40 = vlun_list_table.cell(4, 0).paragraphs[0].add_run("细节")
list40.font.name = "宋体"
list40.font.size = Pt(12)
list41 = vlun_list_table.cell(4, 1).paragraphs[0].add_run("")
list41.font.name = "宋体"
list41.font.size = Pt(10)
list50 = vlun_list_table.cell(5, 0).paragraphs[0].add_run("参考网址")
list50.font.name = "宋体"
list50.font.size = Pt(12)
list51 = vlun_list_table.cell(5, 1).paragraphs[0].add_run("")
list51.font.name = "宋体"
list51.font.size = Pt(10)
vuln_info += 1
mydoc.save(doc_path + customer_name + "-" + ip + "-主机漏洞扫描报告.docx")
def get_status():
"""
================ 判断安全状态 ===============
"""
if high_num > 0:
high = "1"
medium = "0"
low = "0"
safe = "0"
elif medium_num > 0:
high = "0"
medium = "1"
low = "0"
safe = "0"
elif low_num > 0:
high = "0"
medium = "0"
low = "1"
safe = "0"
else:
high = "0"
medium = "0"
low = "0"
safe = "1"
app_status = "高度危险:" + high + "\n中度危险:" + medium + "\n低度危险:" + low + "\n比较安全:" + safe
return app_status
def get_huiyan_vuln_level():
"""
================ 提取慧眼漏洞风险等级 ===============
"""
os.chdir(file_path)
get_vuln_list = r'(?<=font-family: 微软雅黑; font-size: 8pt; font-weight: bold">).*?(?=</span>)'
with open(file_name, "r", encoding="utf-8", errors="ignore") as html:
huiyan_html = html.read()
vuln_list = re.findall(get_vuln_list, huiyan_html)
a = len(vuln_name)
b_r = list(reversed(vuln_list))
cc = b_r[12:(a * 2) + 12:2]
b = list(reversed(cc))
return b
def get_huiyan_ip():
"""
================ 提取慧眼ip ===============
"""
os.chdir(file_path)
get_ip = r'(?<=主机设备).*?(?=在本次检测中共发现)'
with open(file_name, "r", encoding="utf-8", errors="ignore") as html:
huiyan_html = html.read()
ip_list = re.findall(get_ip, huiyan_html)
huiyan_ip = ip_list[0]
return huiyan_ip
def get_huiyan_vuln_name():
"""
================ 提取慧眼漏洞名称 ===============
"""
os.chdir(file_path)
get_vuln_name = r'(?<=style="font-family: 微软雅黑; font-size: 8pt; padding-left: 20px">).*?(?=</span>)'
with open(file_name, "r", encoding="utf-8", errors="ignore") as html:
huiyan_html = html.read()
vuln_list = re.findall(get_vuln_name, huiyan_html)
return vuln_list
def get_huiyan_vuln_describe():
"""自动提取慧眼漏洞描述"""
os.chdir(file_path)
describe = r'(?<=<spanstyle="color:#00000a;font-family:微软雅黑;font-size:10pt">).*?(?=</span>)'
with open(file_name, "r", encoding="utf-8", errors="ignore") as file:
html = file.read()
new = html.replace('\n', '').replace(' ', '').replace('\t', '')
get_str = re.findall(describe, new)
result = get_str[3::5]
return result
def get_huiyan_vuln_advice():
"""自动提取慧眼修复建议"""
os.chdir(file_path)
advie = r'(?<=<spanstyle="color:#00000a;font-family:微软雅黑;font-size:10pt">).*?(?=</span>)'
with open(file_name, "r", encoding="utf-8", errors="ignore") as file:
html = file.read()
new = html.replace('\n', '').replace(' ', '').replace('\t', '')
get_str = re.findall(advie, new)
result = get_str[4::5]
return result
customer_name = "xxx客户"
company_name = "xxx公司"
scan_time = "2020-12-21 22:00:09"
report_data = "2021-01-04"
file_path = "D:\\MyCreate\\Python项目\\慧眼扫描器自动生成漏洞扫描报告\\项目文件\\源文件\\" # 慧眼扫描源文件的目录
file_name = "huiyan.html" # 需要完成报告的html文件名
save_path = os.getcwd() + "\\项目文件\\"
doc_path = os.getcwd() + "\\项目文件\\文件保存\\" # 文档保存路径
print("=======开始运行===========")
ip = get_huiyan_ip()
vuln_name = get_huiyan_vuln_name()
vuln_row = len(vuln_name) + 1
vuln_level = get_huiyan_vuln_level()
high_num = vuln_level.count("高危")
medium_num = vuln_level.count("中危")
low_num = vuln_level.count("低危")
total_num = high_num + medium_num + low_num
get_huiyan_vuln_describe()
get_huiyan_vuln_advice()
create_docx()
print("=======结束运行===========")
print("报告已经生成并保存到\n" + doc_path + customer_name + "-" + ip + "-主机漏洞扫描报告.docx")
结束
其实也没啥功效,就是把扫描报告从图A变成了图B的样子。从html文件变成了doc文件。主要就是数量多,人都写麻了。
to