将scapy输出打印到wxPython文本控制器

将scapy输出打印到wxPython文本控制器

问题描述:

感谢您花时间看看我的问题。将scapy输出打印到wxPython文本控制器

我正在学习wxPython的绳索,我想要一个输出到终端的工作程序,并给它一个整容。通过Scapy,我正在嗅探无线接口以获取探测请求/探测响应,并按预期工作。然而,我想要输出到终端窗口,而不是输出到我的新GUI中的StaticText(tc2)帧。

现在我一直在使用一个教程来创建我的GUI,但是,当前的代码仍然在加载我的GUI之前输出Scapy到终端,因为sniff函数运行直到它被用户杀死,因此从未真正加载GUI。我已经尝试将sniff函数放在wx.StaticText行中,但没有将它打印在那里的乐趣。

我的Scapy程序和GUI程序都可以独立工作,但它们不能同时工作。我的目标是将返回值显示在StaticText框中。以下是我的代码与我的问题相关的一小部分。

tc2 = wx.TextCtrl(panel, wx.ID_ANY, size=(300,100), style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL) 

btn1 = wx.Button(panel, label='Sniff', size=(70, 30)) 
self.Bind(wx.EVT_BUTTON, self.OnSniff, btn1) 

redir=RedirectText(tc2) 
sys.stdout=redir 

def OnSniff(self,e): 
sniff(iface="mon0",prn=packets,store=0) 

def packets(p): 
if p.haslayer(Dot11ProbeReq): 
    dstmac=p.addr1 
    mac=p.addr2 
    if p.info == "": 
    ssid="BROADCAST" 
    else: 
    ssid=p.info 

    print "%s is probing %s %s" % (mac,dstmac,ssid) 

if p.haslayer(Dot11ProbeResp): 
    dstmac=p.addr1 
    bssid=p.addr2 
     ssid=p.info 
     print "%s (%s) Probe Response to %s" % (ssid,bssid,dstmac) 

wx.Yield() 

您不想在wxPython应用程序加载之前开始嗅探。所以你要么要在按钮或菜单事件处理程序中启动嗅探,要么可以使用wx.CallLater在应用程序加载后通过将CallLater命令放在wx代码的init结尾处开始执行。

当我重定向ping命令(其中包括)时,我做了一些类似的事情。你可以看看我的tutorial关于这个问题。如果您需要更多背景来重定向标准输出,请参阅here

事情的基本内容已涵盖在另一个我的答案在这里:Redirect command prompt output to a python generated window

基本上你想用这样的文字来重定向:

class RedirectText: 
    def __init__(self,aWxTextCtrl): 
     self.out=aWxTextCtrl 

    def write(self,string): 
     self.out.WriteText(string) 

然后在我的平例如,我做了以下内容:

def pingIP(self, ip): 
    proc = subprocess.Popen("ping %s" % ip, shell=True, 
          stdout=subprocess.PIPE) 
    print 
    while True: 
     line = proc.stdout.readline()       
     wx.Yield() 
     if line.strip() == "": 
      pass 
     else: 
      print line.strip() 
     if not line: break 
    proc.wait() 

看最主要的是标准输出参数在子呼叫和wx.Yield()是祁门功夫也是如此。 Yield允许文本“打印”(即重定向)到标准输出。没有它,文本将不会显示,直到命令完成。我希望这一切都有道理。

如果你需要在一个单独的线程中运行,这里有关于这个问题的几个链接:

+0

迈克,你让我去上正确的轨道上。我得到它显示一行,但现在我遇到了冻结问题。我按嗅,它冻结。我猜测它在文本重定向的某个地方被挂起了。我用你的资源来指导我。这是我所做的。 – pyRabbit 2013-03-25 21:10:03

+0

查看我对OP的更改。 – pyRabbit 2013-03-25 21:16:28

+0

我在代码中的任何地方都看不到wx.Yield。您可能需要在线程内执行Sniff代码,并使用wx.CallAfter将其发回GUI。虽然我不熟悉这个嗅探器。你可能会考虑交叉发布到wxPython邮件列表。他们在那里非常有帮助! – 2013-03-25 21:29:05