2017-04-24 3 views
0

私は上司から仕事を得て、すべてのブロードキャストトラフィックを記録し、分析します。さて、私はこれをPythonスクリプトで行う必要があります。私はこれまでスクリプトを書いてトラフィックを読み込み、それを処理します。その後、私は出力を持っています。このOutputは、Buffering/Delayのようなものを持っているので、私を煩わします。今、私はその理由を見つけることができません。誰も私をここで助けることができますか? Linuxのサブプロセスによるコードのバッファリング

# !/usr/bin/python3.5 
import subprocess 
import atexit 
from datetime import datetime 
import signal 
import sys 
import os 


def exit_handler(): 
    print "\nSkript wurde manuell beendet..." 


class Broadcasting_Host: 
    def __init__(self, mac="", ips=[]): 
     self.mac = mac 
     self.broadcast = {} 
     print("Broadcasting Host found at: %s" % (mac)) 

    def broadcasting(self, srcport=0, dstport=0, protokoll="", zeit="", ip="", layer_4_type=""): 
     broadcast_key = "%s_%s_%s" % (srcport, dstport, protokoll) 
     if ip: 
      if ip not in self.broadcast.keys(): 
       print("User_MAC: %s, has another IP" % (self.mac)) 
       self.broadcast[ip] = dict() 
      # falls dieser broadcast neu ist hinzufuegen 
      if broadcast_key not in self.broadcast[ip].keys(): 
       self.broadcast[ip][broadcast_key] = list() 
       print("New broadcast Type detected, for MAC: %s, KEY: %s" % (self.mac, broadcast_key)) 
     else: 
      if "No_IP" not in self.broadcast.keys(): 
       self.broadcast["No_IP"] = list() 
      # broadcast zeit hinzufuegen 
     if broadcast_key == "0_0_ARP": 
      self.broadcast["No_IP"].append(zeit) 
      #print("User: %s, is searching for somebody. KEY: %s" % (self.mac, broadcast_key)) 
     else: 
      self.broadcast[ip][broadcast_key].append(zeit) 

     self.drawback 

    def drawback(self): 
     """gibt die aktuellen broadcast fuer diese object aus""" 
     if self.broadcast["ARP"] >= 5: 
      print(self.broadcast) 
      return self.broadcast 

    def cleanup(self): 
     pass 

    def check_if_correct(self): 
     pass 


def define_ports(tcp_srcport="", tcp_dstport="", udp_srcport="", udp_dstport=""): 
    if tcp_srcport: 
     srcport = int(tcp_srcport) 
     dstport = int(tcp_dstport) 
     layer_type = "TCP" 
    elif udp_srcport: 
     srcport = int(udp_srcport) 
     dstport = int(udp_dstport) 
     layer_type = "UDP" 
    else: 
     srcport, dstport, layer_type = [0, 0, "ARP"] 
    return srcport, dstport, layer_type 


def split_line(define_ports, line): 
    zeit, protokoll, info, mac_source, ip_source, mac_ziel, ip_ziel, tcp_srcport, tcp_dstport, udp_srcport, udp_dstport = line.replace("\n", "").split("\t") 
    ms = zeit.split('.')[1].split(" ")[0] 
    zeit = datetime.strptime(zeit.replace(ms, ms[:6]), "%b %d, %Y %H:%M:%S.%f %Z") 
    srcport, dstport, layer_4_type = define_ports(tcp_srcport=tcp_srcport, tcp_dstport=tcp_dstport, udp_srcport=udp_srcport, udp_dstport=udp_dstport) 
    return zeit, protokoll, info, mac_source, ip_source, mac_ziel, ip_ziel, srcport, dstport, layer_4_type 


if __name__ == '__main__': 
    # Dies ist eine Funktion die das Traceback beim druecken von CTRL + C unterdrueckt. 
    signal.signal(signal.SIGINT, lambda x, y: sys.exit(0)) 
    # In diesem Programm, benutze ich diese Funktion um beim druecken von CTRL + C noch eine Textausgabe zu bekommen. 
    atexit.register(exit_handler) 
    # Der Command welcher in einem Subprocess ausgefuehrt wird. 
    cmd = "tshark -T fields -e frame.time -e _ws.col.Protocol -e _ws.col.Info -e eth.src -e ip.src -e eth.dst -e ip.dst -e tcp.srcport -e tcp.dstport -e udp.srcport -e udp.dstport -Y \"eth.addr == FF:FF:FF:FF:FF:FF\"" 
    # Subprocces mit integriertem command 
    p = subprocess.Popen(cmd, shell=True, bufsize=0, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    stdout = [] 
    seltsame_hosts = {} 
    while True: 
     line = p.stdout.readline() 
     # 
     # 
     if not line: 
      # no entries 
      continue 
     # 
     if "Capturing" in line: 
      # unnecessary line 
      continue 
     # 
     zeit, protokoll, info, mac_source, ip_source, mac_ziel, ip_ziel, srcport, dstport, layer_4_type = split_line(define_ports, line) 
     # 
     if mac_source not in seltsame_hosts: 
      ips = [ip_source] 
      seltsame_hosts[mac_source] = Broadcasting_Host(mac=mac_source, ips=ips) 
     # 
     seltsame_hosts[mac_source].broadcasting(srcport=srcport, dstport=dstport, protokoll=protokoll, zeit=zeit, ip=ip_source, layer_4_type=layer_4_type) 
+0

があるでしょう、そこにコードのかなりのだ、あなたができることは何... –

+0

はありません...あなたをtsharkの出力に興味がありますか? – tdelaney

+2

[D.2。 tshark:ターミナルベースのWireshark](https://www.wireshark.org/docs/wsug_html_chunked/AppToolstshark.html)_ -l各パケットの後の標準出力をフラッシュする...これは読みにくいフォントを持つ人のための "ell"です。 – tdelaney

答えて

1

、あなたの代わりにラインバッファリングまたは全くバッファリングを使用するために、パイプへの出力のデフォルトのフルバッファリングを無効にするためにstdbuf経由でコマンドを実行しようとすることができます。プログラムが起動時に手動でバッファリングを設定しない限り、通常は動作します

Windowsでは、基本的なプロセスでは出力をフラッシュしない場合は何もできませんが、滑らかな行単位ではなく、ラインプリントアウト。

しかし、この場合、tdelaney pointed outとして、プラットフォームに依存しないソリューションがあります:各行で出力をフラッシュするオプション。だからあなたのコマンドに-lを追加し、基本的なプロセスは、その出力をフラッシュしない場合は、定期的な/スムーズな出力

cmd = "tshark -l -T fields -e frame.time -e _ws.col.Protocol -e _ws.col.Info -e eth.src -e ip.src -e eth.dst -e ip.dst -e tcp.srcport -e tcp.dstport -e udp.srcport -e udp.dstport -Y \"eth.addr == FF:FF:FF:FF:FF:FF\"" 
+0

@eryksunまあ、私はそうすることができると思うが、この答えは完璧に動作します。 :D –

+0

@M.Kälin、私はこの答えの最初の文に答えていました。提案されたソリューションが完璧に機能してうれしいです。 – eryksun

+0

@eryksun大丈夫、私は編集します。私はそれが窓なしであることを知っている。それはコミュニティのwikiなので、私は他の人の仕事を裂くことが許されています:) –

関連する問題