2013-07-28 69 views
7

我試圖在python中處理tcpdump輸出。在Python中處理tcpdump輸出

我需要的是運行tcpdump的(其捕獲的數據包,給我的信息),並讀取輸出和處理它。

的問題是,tcpdump的不斷運行下去,我需要儘快讀取數據包信息,因爲它輸出,並繼續這樣做。

我試圖尋找到蟒子,並嘗試使用POPEN tcpdump和管道的標準輸出,但它似乎沒有工作的通話。

就如何處理該地進行的任意方向。

import subprocess 

def redirect(): 
    tcpdump = subprocess.Popen("sudo tcpdump...", stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True) 
    while True: 
     s = tcpdump.stdout.readline() 
     # do domething with s 

redirect() 
+0

您可以發佈您的代碼那麼遠?謝謝。 –

+0

你可以[使用僞tty強制行緩衝輸出](http://stackoverflow.com/a/12471855/4279) – jfs

回答

14

您可以使用「-l」對tcpdump進行行緩衝。然後你可以使用子進程捕獲輸出。

import subprocess as sub 

p = sub.Popen(('sudo', 'tcpdump', '-l'), stdout=sub.PIPE) 
for row in iter(p.stdout.readline, b''): 
    print row.rstrip() # process here 
+0

使用'in iter(p.stdout.readline,b''):print line,'in Python 2 [「readahead buffer」bug](http://bugs.python.org/issue3907) – jfs

+0

'用於p.stdout中的行:'在Python 2輸出中引入不必要的延遲(OP希望:*「只要輸出「*)。正如我上面提到的那樣,使用'iter(..)'。請參閱[Python:從subprocess.communicate()]讀取流式輸入(http://stackoverflow.com/a/17698359/4279) – jfs

1

默認情況下,管道是塊緩衝的,交互式輸出是行緩衝的。這聽起來像你需要一個行緩衝管道 - 在子進程中來自tcpdump。

在過去,我們會建議丹伯恩斯坦的「PTY」計劃,這種事情。如今,似乎PTY沒有在很長一段時間更新,但有一個名爲「emtpy」這或多或少是同樣的想法,新的方案: http://empty.sourceforge.net/

您可以嘗試在你的子下的空運行的tcpdump即使正在寫入管道,也會緩衝tcpdump行。

+1

python在stdlib中有'pty'模塊。或者可以使用'pexpect'。還有'stdbuf','script','unbuffer'工具可能會強制線緩衝輸出 – jfs