Python - tcpdump子进程挂起

时间:2015-04-28 16:47:03

标签: python macos subprocess popen tcpdump

可能是关于subprocesses的简单修复,但我无法解决出错的问题。

我有一小部分网页,我想要抓包。我希望每个网页都有一个pcap个文件。我正在使用tcpdumpphantomJS。这是代码的相关部分:

from selenium import webdriver
..more imports here..

URLs = ['https://webpage1.com', 'https://webpage2.com', etc.]

driver = webdriver.PhantomJS(executable_path='/usr/bin/phantomjs', port=65000)
driver.set_window_size(1024, 768)

def Crawler():
    for eachHost in URLs:
        print '\n* Capturing in-progress.'
        print '* Host: ', eachHost
        try:
            handle = subprocess.Popen(['sudo', 'tcpdump', '-w', str(eachHost) + '.pcap'], stdout=subprocess.PIPE)

            driver.get(eachHost)
            time.sleep(5)
            driver.close()

            time.sleep(2)
            handle.terminate()
            print '* tcpdump killed.'

        except:
            print '* Exception caught.'
            sys.exit(0)
    sys.exit(0)

我期望它做什么:捕获每个页面加载的前5秒并将其分开pcaps

它的作用:在我的终端中打印下面的内容然后挂起,捕获但不终止,而不是骑车到下一个网页。

Host:  https://www.webpage1.com/
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

2 个答案:

答案 0 :(得分:1)

我认为您无法终止子进程的原因是因为您正在使用sudo命令启动该进程。因为tcpdump随后以root用户身份运行,所以不能只是以普通用户身份终止它。

我刚试过本地测试。启动tcpdump之后:

$ ps ax | grep tcpdump
62410 s007  S+     0:00.01 sudo tcpdump
62420 s007  S+     0:00.05 tcpdump
62540 s008  S+     0:00.00 grep tcpdump
$ kill -15 62410
-bash: kill: (62410) - Operation not permitted
$ kill -15 62420
-bash: kill: (62420) - Operation not permitted

我不知道如何执行sudo kill / terminate命令而不需要另一个进程(例如,通过subprocess),所以我必须得到tcpdump进程id(pid )使用handle.pid并致电subprocess.Popen(['sudo', 'kill', '15', <pid>])

答案 1 :(得分:0)

我认为您的子进程调用阻止了为什么您无法阻止它。尝试使用multiprocessing并将tcpdump命令抛出到一个线程中。