【问题标题】:Python - tcpdump subprocess hangsPython - tcpdump 子进程挂起
【发布时间】:2015-07-07 15:35:15
【问题描述】:

可能是关于 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

【问题讨论】:

  • 您是要嗅探eth0 还是loopback 接口?如果您的网络服务器在环回上,则使用-i lo 指定接口。
  • 嗨,我在 EC2 上的虚拟 ubuntu 机器上运行这个脚本,不确定这是否能回答你的问题

标签: python macos subprocess popen tcpdump


【解决方案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),所以我必须使用 @987654325 获取 tcpdump 进程 ID(pid) @ 并致电subprocess.Popen(['sudo', 'kill', '15', <pid>])

【讨论】:

  • 谢谢,我决定放弃这个思路,直接用scapy的sniff函数给每个循环写包,但是同样的问题出现了,连子进程都没有。很奇怪。
  • 您是否想过只使用“sudo”运行整个 Python 脚本,而不仅仅是子进程? (这充满了安全隐患,所以也许不一定是最好的建议,只是让你知道)
  • 是的,我首先尝试过,它产生了同样的错误。
  • 您是否尝试过使用 handle.kill 而不是 .terminate?
  • 问题解决了,和大多数问题一样,它与我最初的想法无关。出于某种原因driver.get(eachHost) 没有打开页面,不确定发生了什么,但将其更改为driver.get(str(eachHost)) 修复了它。感谢您的帮助。
【解决方案2】:

我认为您的子进程调用正在阻塞,这就是您无法阻止它的原因。尝试使用multiprocessing 并将 tcpdump 命令放入线程中。

【讨论】:

  • 子进程不会像那样阻塞,如果我没记错的话。 (一粒盐:我已经有一段时间没有搞砸子流程了)
  • 该死的笨蛋!你完全正确。我不知道为什么我忘记了:/
猜你喜欢
  • 2017-02-28
  • 2012-09-07
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
相关资源
最近更新 更多