如何在 sudo 模式的子进程中使用 tcpdump 运行 干净地退出
How to exit cleanly with tcpdump running in subprocess in sudo mode
我运行 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.
我已经阅读了针对同一问题的 解决方案,并尝试发送 SIGINT
和 SIGTERM
,但我在每个消息中都收到了相同的截断数据包消息案例以及 OSError
。我也尝试过使用 process.terminate()
但这也不起作用。有什么方法可以让 tcpdump
在 运行 处于 sudo
模式时干净地退出。谢谢!
正如 OSError: [Errno 1] Operation not permitted 建议的那样,不允许终止进程。因为您使用了 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
由于 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
发送正确的信号
我运行 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.
我已经阅读了针对同一问题的 SIGINT
和 SIGTERM
,但我在每个消息中都收到了相同的截断数据包消息案例以及 OSError
。我也尝试过使用 process.terminate()
但这也不起作用。有什么方法可以让 tcpdump
在 运行 处于 sudo
模式时干净地退出。谢谢!
正如 OSError: [Errno 1] Operation not permitted 建议的那样,不允许终止进程。因为您使用了 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
由于 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