【问题标题】:How to exit cleanly with tcpdump running in subprocess in sudo mode如何在 sudo 模式下在子进程中运行 tcpdump 干净地退出
【发布时间】:2017-04-14 07:16:03
【问题描述】:

我正在运行tcpdump,使用python 中的subprocess 模块来捕获网站的踪迹,使用这段代码:

import subprocess
from tbselenium.tbdriver import TorBrowserDriver

site = "check.torproject.org"

try:

        process = subprocess.Popen(['sudo', 'tcpdump', '-l', '-i', 'eth0', '-w', 'trace.pcap'], stdout=subprocess.PIPE)

        with TorBrowserDriver("/path/to/tor-browser_en-US/") as driver:
            driver.load_url("https://" + site, wait_on_page=20)

        process.send_signal(subprocess.signal.SIGTERM)

except OSError:
    print "OSError"

代码给了我一个OSError,当我尝试打开wireshark 中的pcap 文件时,出现以下错误框:

The capture file appears to have been cut short in the middle of a packet.

我已阅读this 解决同一问题的方法,并尝试发送SIGINTSIGTERM,但在每种情况下我都收到相同的截断数据包消息以及OSError。我也尝试过使用process.terminate(),但这也不起作用。有什么办法可以让tcpdumpsudo 模式下运行时干净地退出。谢谢!

【问题讨论】:

  • 这不是我很了解的领域,但似乎有一些工具可以修复 pcap 文件,例如pcapfix.
  • 关于 OSError 的细节不多?你能试试except OSError, e: print e
  • @Kadir 它的OSError: [Errno 1] Operation not permitted
  • @MarkSetchell 谢谢,我会调查pcapfix

标签: python subprocess tcpdump


【解决方案1】:

正如 OSError: [Errno 1] Operation not allowed 所暗示的,不允许终止进程。因为你使用了sudo,杀死进程也应该实例化sudo。也许你试试这个:

import subprocess
import os
from tbselenium.tbdriver import TorBrowserDriver

site = "check.torproject.org"

try:
    process = subprocess.Popen(['sudo', 'tcpdump', '-l', '-i', 'eth0', '-w', 'trace.pcap'], stdout=subprocess.PIPE)

    with TorBrowserDriver("/path/to/tor-browser_en-US/") as driver:
        driver.load_url("https://" + site, wait_on_page=20)

    cmd = "sudo kill " + str(process.pid)
    os.system(cmd)
except OSError, e:
    print e

【讨论】:

  • 非常感谢,它有效!退出干净地报告捕获的数据包数量。并且wireshark 没有报告截断的数据包。
【解决方案2】:

由于tcpdump 需要 su 权限,您可以简单地以 su 身份运行脚本并在生成 tcpdump 之前检查它:

# Check we are running as root:
if os.geteuid() != 0:
    print('This script requires root privileges to capture packets. Try running this script as root.')
    raise SystemExit

# Start TCPDUMP
import subprocess, os
_process = subprocess.Popen(['tcpdump', '-nnvvv', '-s0', '-w', os.path.join('/tmp', 'output.pcap'), ])

这样就可以跑了

_process.terminate()

_process.kill()

tcpdump发送正确的信号

【讨论】:

    猜你喜欢
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多