我还在学习python,我决定深入研究的第一个项目是对大型nmap日志进行排序,拉出OPEN端口,然后将它们转储到IP:Port格式的单独文本文件中。它有效,但是有更好的方法来写这个吗?这就是我最终的结果:
import sys
import string
"""
Written 6/24/2011 to pull out OPEN ports of an nmap proxy scan
Command:
nmap 218.9-255.0-255.0-255 -p 8080,3128,1080 -M 50 -oG PLog3.txt
"""
if len(sys.argv) != 3:
print 'Usage: python proxy.py <input file> <output file>'
print 'nmap 218.1-255.0-255.0-255 -p 8080,3128,1080 -M 50 -oG PLog.txt'
print 'Example: python ./proxy.py PLog.txt proxies.txt'
sys.exit(1)
r = open(sys.argv[1], 'r')
o = open(sys.argv[2], 'w')
pat80 = '80/open/'
pat8080 = '8080/open'
pat3128 = '3128/open'
for curline in r.xreadlines():
sift = string.split(curline, ' ')
ip = sift[1]
if curline.find(pat3128) >= 0:
curport = '3128'
elif curline.find(pat8080) >= 0:
curport = '8080'
elif curline.find(pat80) >= 0:
curport = '80'
else:
curport = '100'
pass
if (curport == '3128') or (curport == '8080') or (curport == '80'):
o.write(ip + ':' + curport + '\n')
print ip + ':' + curport
else:
pass
答案 0 :(得分:1)
你可以像这样循环一个文件。无需使用xreadlines()
。当with
超出范围
r
会确保文件已关闭
with open(sys.argv[1], 'r') as r:
for curline in r:
sift = string.split(curline, ' ')
ip = sift[1]
...
查看元组比or
if curport in ('3128', '8080', '80'):
答案 1 :(得分:0)
因为我似乎记得使用python来解析nmap输出文件是我的第一个python应用程序之一,我可以提出一些建议: 1)如果您想学习XML解析和python,建议使用nmap的备用XML格式。这具有以下优点:与纯文本输出不同,XML输出不太像是以小的但是破坏脚本的方式改变。 (基本上,字符串字段上的匹配非常适合快速入侵,但几乎可以肯定会让你不知所措,因为我发现当nmap更新时它们稍微改变了我正在解析的列之一的格式...当我们升级其中一个Windows框并且操作系统或服务字段中的一些文本与我匹配的内容匹配时,我也觉得有点儿。如果你对这条路有兴趣,我可以看看我是否有我的nmap使用xpath的解析器
2)如果你想坚持使用文本输出和正则表达式,我建议学习分组。 具体而言,您可以定义一个组并检查它,而不是为每个端口创建自定义模式。
import re
r = re.compile("(/d+)/open") # match one or more digits followed by /open
mm = r.match(line) #mm will either be None or a match result object, if mm is not None, you can do mm.groups()[0] to get the port #.
答案 2 :(得分:0)
import sys
import string
"""
Written 6/24/2011 to pull out OPEN ports of an nmap proxy scan
Command:
nmap 218.9-255.0-255.0-255 -p 8080,3128,1080 -M 50 -oG PLog3.txt
"""
def get_port(line):
port_mapping = {
'80/open/': '80', # Is the backslash special here?
# If they're really all supposed to have the same form,
# then we can simplify more.
'8080/open': '8080',
'3128/open': '3128'
}
for pattern, port in port_mapping:
if pattern in line: return port
return None # this would be implied otherwise,
# but "explicit is better than implicit"
# and this function intends to return a value.
def main(in_name, out_name):
with file(in_name, 'r') as in_file:
ips = (get_port(line.split(' ')[1]) for line in in_file)
with file(out_name, 'w') as out_file:
for ip in ips:
if ip == None: continue
output = '%s:%s' % (ip, curport)
out_file.write(output + '\n')
print output
def usage():
print 'Usage: python proxy.py <input file> <output file>'
print 'nmap 218.1-255.0-255.0-255 -p 8080,3128,1080 -M 50 -oG PLog.txt'
print 'Example: python ./proxy.py PLog.txt proxies.txt'
if __name__ == '__main__':
if len(sys.argv) != 3: usage()
else: main(*sys.argv[1:])
答案 3 :(得分:0)
检查argparse以处理参数。
分成几部分。
使用主构造。
查看csv模块。您可以将分隔符设置为空格。
再看看表达式。你可以用一个表达式来表达它,它是不同模式的'或'。