我将防火墙的运行配置保存为文本文件,大小约为67,000行。当我通过此防火墙向我添加新连接时,我需要检查所请求的主机名是否已在此运行配置中使用。该请求有时可能是需要检查的200多个主机名的列表。
我正在尝试编写一个脚本,允许我检查运行配置中任何匹配项的主机名列表,并提供它找到的所有匹配项的输出(到另一个文本文件)。
我遇到的问题是请求中主机的格式类似于“ipdvi.tcif.hhadr.com”,但是在配置中它们存在前缀“object network obj-net-”所以配置中的行将显示为“object network obj-net-ipdvi.tcif.hhadr.com”。因此,我要求脚本只匹配文本字符串的一部分而不是整行。
我没有使用python的经验,但我正试图找到一种方法来避免在文本编辑器中逐个搜索每个主机。
非常感谢任何帮助。
此致 尼克
答案 0 :(得分:0)
我不确定如何以最快的方式完成此操作,但可以这样做:
首先,读取您的主机名并将其存储在列表中。我假设你的主机名保存在一个单独的文件中,每行一个主机名。
其次,逐行读取防火墙配置,并检查此行中主机名列表中是否有其中一个条目。如果匹配,请存储配置行。
# get hostnames as list
with open('/path/to/hostname_file.txt', 'r') as hosts:
hostnames = [line.strip() for line in hosts.readlines()]
# read config
with open('/path/to/fw/config.txt', 'r') as fw_config:
# file where matches are written
with open('/path/to/matches.txt', 'w+') as match:
# check config
for line in fw_config:
if any(name in line for name in hostnames):
# write match to file
match.write(line)
每次执行脚本时都会创建/覆盖结果文件,因此您可能希望备份现有结果文件 - 或更改脚本中的文件名。
根据评论,它只想获得主机名的一个(可能是第一个)匹配。我就是这样做的:
with open('/path/to/hostname_file.txt', 'r') as hosts:
hostnames = [line.strip() for line in hosts.readlines()]
with open('/path/to/fw/config.txt', 'r') as fw_config:
with open('/path/to/matches.txt', 'w+') as match:
for line in fw_config:
if len(hostnames) < 1:
break
if any(name in line for name in hostnames):
match.write(line)
hostnames.remove(name)
与之前几乎相同,但现在从列表中删除了匹配的主机名。这样,下一行的下一次检查就不再存在了。
这也意味着主机名列表正在缩小。任何匹配都将被删除,在匹配每个名称后,hostnames
只是一个空列表。这就是为什么在查找主机名之前,检查是否还有任何名称。如果没有,循环和代码就存在了 - 在为每个主机名得到结果之后,没有别的事情要做。
当然,这也应该比以前的脚本更快。