Sory因为我的英语不好。也许问题已经解决,但不幸的是我还没有找到解决方案。 一般来说,任务存在问题。有人能帮我吗? 使用scapy和netinfo,我需要创建功能,将ping请求发送到系统中的默认网络接口的“8.8.8.8”主机(类似'ethX',其中X是数字),并验证请求是否已经过 通过捕获传出的数据包发送。
通过这一步,我部分理解:
#!/usr/bin/python
import sys
from scapy.all import *
import netinfo
class test:
host = "8.8.8.8"
def pingh(self):
self.host
pkt = Ether()/IP(dst=self.host,ttl=(1,3))/ICMP()
ans,unans = srp(pkt,iface="eth0",timeout=2)
ans.summary(lambda (s,r): r.sprintf("%Ether.src% %IP.src%") )
r = test()
print "request from ping "
r.pingh()
但是在下一步我被困住了:
同时对'lo'和'ethX'接口执行相同操作(使用标准'线程'模块)。 捕获的结果应该收集到具有以下结构的字典中: {'iface1':list_of_captured_packets,'iface2':list_of_captured_packets,...}。修改此字典应该是线程安全的。通过添加一个测试来修改测试类,该测试检查结果字典是否包含 - 'lo'和'ethX'接口作为键。 P. S. 不要让我死于傻瓜:)
答案 0 :(得分:0)
以下使用threading
模块执行两个并行ping
测试,两个接口各执行一次。对于将来的工作,请将multiprocessing模块与Pool()
和imap_unordered()
一起使用 - 这样会更容易。
# INSTALL:
# sudo apt-get install python-scapy
# RUN:
# sudo /usr/bin/python ./pping.py
import sys, Queue, threading
from scapy import all as S
IFACE_LIST = 'wlan0','lo'
# pylint:disable=E1101
def run_ping(iface, out_q):
host = '8.8.8.8'
pkt = S.Ether()/S.IP(dst=host, ttl=(1,3))/S.ICMP()
ans,_unans = S.srp(pkt, iface=iface, timeout=2)
out_q.put( (iface,ans) )
result_q = Queue.Queue()
for iface in IFACE_LIST:
threading.Thread(
target=run_ping, args=(iface, result_q)
).start()
for t in threading.enumerate():
if t != threading.current_thread():
t.join()
print 'result:', dict( [
result_q.get()
for _ in range(result_q.qsize())
] )
输出:
Begin emission:
Begin emission:
..Finished to send 3 packets.
*Finished to send 3 packets.
...**
Received 5 packets, got 3 answers, remaining 0 packets
....................
Received 23 packets, got 0 answers, remaining 3 packets
result: {'lo': <Results: TCP:0 UDP:0 ICMP:0 Other:0>, 'wlan0': <Results: TCP:0 UDP:0 ICMP:3 Other:0>}