0

私の質問をご覧いただきありがとうございます。

私はwxPythonのロープを学んでおり、ターミナルに出力する実用的なプログラムを使用して、フェイスリフトを提供したいと考えています。Scapyを使用して、ワイヤレスインターフェイスでプローブ要求/プローブ応答をスニッフィングしていますが、意図したとおりに機能します。ただし、ターミナルウィンドウに出力する代わりに、新しいGUI内のStaticText(tc2)フレームに出力したいと思います。

これまでチュートリアルを使用してGUIを作成してきましたが、sniff関数はユーザーによって強制終了されるまで実行されるため、GUIをロードする前に、現在のコードはScapyをターミナルに出力します。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()
4

1 に答える 1

1

wxPythonアプリが読み込まれるまで、スニッフィングを開始したくありません。したがって、ボタンまたはメニューイベントハンドラーでスニッフィングを開始するか、wxコードのinitの最後にCallLaterコマンドを配置して、アプリが読み込まれた後にwx.CallLaterを使用して実行を開始することができます。

pingコマンドをリダイレクトしたときに(とりわけ)、このようなことをしました。このテーマに関する私のチュートリアルをご覧ください。stdoutのリダイレクトについてさらに背景が必要な場合は、こちらを参照してください。

問題の基本的な要点は、ここでの私の回答の別のものでカバーされていました:コマンドプロンプト出力をPythonで生成されたウィンドウにリダイレクトする

基本的に、次のようなものを使用してテキストをリダイレクトします。

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

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

そして、pingの例では、次のことを行いました。

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()

主に確認するのは、サブプロセス呼び出しのstdoutパラメーターであり、wx.Yield()も重要です。Yieldを使用すると、テキストをstdoutに「印刷」(つまりリダイレクト)することができます。これがないと、コマンドが終了するまでテキストは表示されません。すべてが理にかなっていることを願っています。

これを別のスレッドで実行する必要がある場合は、そのテーマに関するいくつかのリンクを次に示します。

于 2013-03-25T17:45:36.820 に答える