可能是关于subprocesses
的简单修复,但我无法解决出错的问题。
我有一小部分网页,我想要抓包。我希望每个网页都有一个pcap
个文件。我正在使用tcpdump
和phantomJS
。这是代码的相关部分:
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
答案 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命令抛出到一个线程中。