如何在sudo模式下使用子进程中运行的tcpdump干净地退出

时间:2017-04-14 07:16:04

标签: python subprocess tcpdump

我使用tcpdump中的subprocess模块运行python以使用以下代码捕获网站的痕迹:

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,当我尝试在pcap中打开wireshark文件时,出现以下错误框:

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

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

2 个答案:

答案 0 :(得分:1)

由于 OSError:[Errno 1]操作不允许 建议,不允许终止该进程。因为你使用了 sudo ,所以杀死进程也应该实例化 sudo 。也许你试试这个:

app.post('/test', function(req, res){
  res.send(req.body)
});

答案 1 :(得分:1)

由于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