【发布时间】:2014-03-19 18:16:15
【问题描述】:
感谢您花时间看这个!
我遇到的问题是我的线程化 ARP 脚本的输出。我想要实现的是将每个活动主机的 IP 地址、MAC 地址和 NIC 供应商输出到命令提示符。
我有一个没有线程的旧 ARP 脚本,大约需要 90 秒并打印出我理想的输出。
下面是我的新脚本,基于上述脚本,带有线程。不幸的是,我不知道为什么输出中没有显示任何值。如果有人可以提供帮助,我将非常感激!
提前致谢!
def arp2(ip):
# An ARP scanner for the network.
ips = []
global ans, unans
ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip), timeout=2, verbose=0)
for snd, rcv in ans:
#Assign MAC address and IP address to variables mac and ipaddr
mac = rcv.sprintf(r"%Ether.src%")
ipaddr = rcv.sprintf(r"%ARP.psrc%")
#Get NIC vendor code from MAC address
niccode = mac[:8]
niccode = niccode.upper()
print ips
ips.append("end")
#ARPips file amendments
with open( 'C:\Python26\ARPips.prn', 'w+') as f:
f.write("\n".join(map(lambda x: str(x), ips)) + "\n")
#String lookup for NIC vendors. DO NOT CHANGE 'r' TO ANY OTHER VALUE.
with open('C:\Users\TomVB\Desktop\OID2.prn', 'r') as file:
for line in file:
if niccode in file:
return mac, ipaddr, line[8:]
def main():
print "Discovering..."
print ""
print "MAC Address \t \t IP Address \t NIC Vendor"
pool = Pool(processes=12)
Subnetlist = []
for i in range(255):
Subnetlist.append(str(IPInt+str(i)))
global ARPresults
ARPresults = pool.map(arp2, Subnetlist)
pool.close()
pool.join()
print "\n".join(ARPresults)
if __name__ == '__main__':
main()
这个脚本给了我以下输出:
Mac Address IP address NIC Vendor
[][]
[]
[]
[]
[]
[][]
[]
[]
以此类推,大约 200 行。
【问题讨论】:
-
嘿@J.F.Sebastian,谢谢你看这个,我写这个脚本的时候就是这么想的。您知道为什么即使返回了 mac 和 ipaddr 并且 map 拾取了它们,它为什么不打印吗?我觉得我错过了一些非常明显的东西):
-
上一个问题的第一个问题:
ping()不返回任何内容,但您正在尝试打印其结果。arp2()是否返回任何内容? -
无关:帮助您学习:1.从您的代码中删除
global(您不需要它) 2.a 不要在多个进程中覆盖同一文件ARPips.prn。充其量只有一个进程可以编写结果。 2.b 不要在子进程中打印,将所有结果返回给父进程并写入文件并在那里打印。 -
感谢@J.F.Sebastian 的提示,与获得正确答案同样有价值:)
标签: python multithreading output arp