提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
记录一下graphviz使用过程中的小技巧
一、graphviz读取顶点和边
先将顶点和边的信息存入node和edge里面,rankdir参数设置为‘UD’,则输出为纵向。若设置为’LR’则输出为横向
#-*-coding:utf-8-*-
def drawGraph(nodes,edges):
G = Digraph(comment="Attack Graph",strict=False)
G.attr(rankdir='UD',size='20,12')
for node in nodes:
G.node('{}'.format(node),shape="ellipse",fontname="Fangsong")
for edge in edges:
#G.edge(edge[0],edge[1],label=edge[2])
G.edge(edge[0], edge[1])
G.render('AG.dot')
#节点是字符串形式
#边是通过头节点和尾节点指定的
#node=['a','b','c']
#edge=[['a','b','1'],['a','c','2'],['b','c','0']]
二、图中存在重复节点
思路就是给重复节点打标签,使用label关键字。
#-*-coding:utf-8-*-
def drawGraph(nodes,edges):
G = Digraph(comment="Attack Graph", strict=False)
G.attr(rankdir='UD', size='20,12') #纵向
#G.attr(rankdir='LR', size='20,12') #横向
count=0
for node in nodes:
G.node(str(count),label='{}'.format(node), shape="ellipse", fontname="Fangsong")
count+=1
for edge in edges:
# G.edge(edge[0],edge[1],label=edge[2])
G.edge(edge[0], edge[1])
G.render('AG.dot')
得到的dot文件如下:
// Attack Graph
digraph {
rankdir=LR size="20,12"
0 [label="攻击者" fontname=Fangsong shape=ellipse]
1 [label="(GPL TELNET Bad Login,CVE-2021-41083)" fontname=Fangsong shape=ellipse]
2 [label="(172.16.112.194,s1)" fontname=Fangsong shape=ellipse]
3 [label="(ICMP PING NMAP,CVE-2019-10639)" fontname=Fangsong shape=ellipse]
4 [label="(135.13.216.191,s1)" fontname=Fangsong shape=ellipse]
5 [label="(ICMP PING NMAP,CVE-2019-10639)" fontname=Fangsong shape=ellipse]
6 [label="(172.16.115.20,s1)" fontname=Fangsong shape=ellipse]
0 -> 1
1 -> 2
2 -> 43
43 -> 44
44 -> 107
107 -> 108
0 -> 3
3 -> 4
#示意,只取了一部分数据
}
三、python执行dot,生成png
python也可以直接执行生成的dot文件,生成png格式的文件
import os
os.system("dot -Tpng AG.dot -o tree.png")
–