我正在做的是为nmap指定一系列IP地址,比如说(192.168.0.0-50),扫描它扫描的每个IP我需要在不同的函数中使用输出。
以下是我正在做的一些代码:
def revLookup(ips):
revCmd = "nmap -R -sP " + ips
revargs = shlex.split(revCmd)
revOut = subprocess.Popen(revargs, shell=False, stdout=subprocess.PIPE)
for rline in revOut.stdout:
if "Nmap scan report for " in rline:
nmapNmIp = rline.strip("Nmap scan report for")
rname, rip = nmapNmIp.split(" ")[0], nmapNmIp.split(" ")[-1]
if rname.strip() == rip.strip():
rname = "NO Name Provided"
revNmapName = rname.split('.', 1)[0]
rip = re.sub('[\(\)]', '', rip.strip())
elif "MAC Address: " in rline:
rnmapmac = rline.split(': ', 1)[-1]
rnmapmac = rnmapmac.split(" ")[0]
return revNmapName, rip, rnmapmac
返回的值只是列表中的最后一个值。 我有其他函数使用各种值来创建其他信息,但我需要逐个生成这些。我可以这样做,如果我创建一个长杂乱的功能,我知道这不是正确的方法。
感谢任何建议。
答案 0 :(得分:1)
使用yield
代替return
并将其移动到循环中,如下所示:
for rline in revOut.stdout:
if "Nmap scan report for " in rline:
...
elif "MAC Address: " in rline:
...
yield revNmapName, rip, rnmapmac
稍后您可以在for循环中使用创建的生成器(以yield
返回的函数之一),例如:
for rev, rip, rnmap in revLookup(ips):
print rev, rip, rnmap
您可以查看此问题的完美答案What does the "yield" keyword do in Python?
编辑:添加了方法的用法
答案 1 :(得分:0)
每次循环后“返回”的答案都是屈服,但是使用单个ip并迭代你的ips可能会更好一些函数:
def my_function(ip):
new_data = dosomething
return new_data
for ip in ips:
result = my_function(ip)
另外,对于使用Nmap,你应该看看python-nmap这是非常好的。